1つのドメインへのHTTPトラフィックのみを許可するiptablesルール


20

serverfault.comとの間でのみHTTPトラフィックを許可するようにマシンを構成する必要があります。他のすべてのWebサイト、サービスポートにはアクセスできません。これらのiptablesルールを思いつきました。

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

それはあまりうまくいきません:

  • すべてをドロップした後、ルール3に進みます。

    iptables -A出力-p tcp -d serverfault.com --dport 80 -j ACCEPT

私はこのエラーを受け取ります:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

DNSに関連すると思いますか?同様に許可する必要がありますか?または、ルールにIPアドレスを入れるだけですか?私がやろうとしていることは、より簡単なルールで達成できると思いますか?どうやって?

これに関する助けやヒントをいただければ幸いです。どうもありがとう!


2
sstatic.netなどを忘れないでください。
serverfault.comがserverfault.com

別のシステムでプロキシを実行できますか?:これは最高/最も簡単な解決策であるserverfault.com/questions/215134
mattdm

回答:


29

IPTablesルールでは、順序が重要です。ルールが順番に追加され、適用されます。また、ルールを手動で追加すると、すぐに適用されます。したがって、例では、INPUTおよびOUTPUTチェーンを通過するパケットは、デフォルトポリシーが設定されるとすぐにドロップされ始めます。これは、偶然にも、エラーメッセージを受け取った理由です。何が起こっているのですか?

  1. デフォルトのDROPポリシーが適用されます
  2. IPTablesは宛先としてホスト名を受け取ります
  3. IPTablesは「serverfault.com」でDNSルックアップを試行します
  4. DNSルックアップはDROPアクションによってブロックされています

送信元/宛先オプションはホスト名を受け入れますが、強くお勧めしません。マニュアルページを引用するには、

ホスト名は、ルールがカーネルに送信される前に一度だけ解決されます。DNSなどのリモートクエリで解決する名前を指定することは、非常に悪い考えです。

Slillibriは、彼の答えであるDNS ACCEPTルールを逃した頭に釘を打ちました。あなたの場合、それは重要ではありませんが、通常はプロセスの後半でデフォルトのポリシーを設定します。最後にしたいことは、リモートで作業し、デフォルトの拒否をオンにした後で SSHを許可することです。

また、ディストリビューションによっては、ファイアウォールルールを保存して、開始時に自動的に適用されるようにする必要があります。

それをすべて知って、スクリプトを整理し直して、ここでお勧めします。

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

3
美しく巧みに作られた答え。
-JakeRobinson

1
あなたも私の間違いを見逃しているに違いないが、感謝している。おっとっと。
スコットパック

3
実際、iptables -Pチェーンポリシーはパケットがチェーンの終わりから「落ちる」場合にのみ適用されるため、ステートメントをスクリプトのどこにでも配置できます。私は通常DROP、iptablesスクリプトの先頭にポリシーステートメント(通常はポリシー)を配置します。
スティーブン

1
@スティーブン:あなたは絶対に正しい。OPは対話的にそれらを入力しているようです。SSH経由でホストに接続しているとしましょう。最初のルールはポリシーDROP用です。他のルールを入力する前に、SSH接続が切断されます。これは、彼女が遭遇したものとは異なる症状の場合、同じタイミングの問題です。
スコットパック

ありがとう。これを試していました。しかし、追加しないと機能しませんでしたsudo iptables -I OUTPUT 1 -o lo -j ACCEPT。それは追加されるべきではありませんか?
キラン

7

追加する

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

DNSルックアップを許可します。


5

この種の要件は、Webプロキシまたはフィルタ、あるいはその両方でより適切に処理される場合があります。これを行うようにDansgaurdianを構成できます。NATルールを使用して、トラフィックをフィルターに強制的に通す必要があります。

iptablesを使用してフィルタリングすると、関連するIPアドレスから利用可能なサイトが許可されます。これは通常、Web全体の小さなサブセットです。


1
これに完全に同意します。iptablesDNS名を特にうまく処理できないため、ここで使用するのはおそらく間違ったツールです。適切なフィルター設定を備えたWebプロキシがはるかに適しています。
スティーブン

2

iptablesはこのレベルでは動作しないのではないかと心配しています。ホスト名ではなく、IPアドレスのみを考慮します。同じIP上の他の名前の仮想ホストへのアクセスをブロックする場合は、.htaccessファイルの配置を検討する必要があります。


問題は、「すべてを落とす」ことなくルール3を試すと、iptablesで問題なく動作するということです。
ゼネット

2
うーん、私は質問を読み違えました。バックグラウンドで起こっているのは、iptablesがserverfault.comを64.34.119.12に解決することです(解決が機能しなかった理由を理解するためにslillibriの回答を参照)。ただし、iptablesはホスト名を認識せず、単にIPを許可しているだけなので、複数のサイトがある場合は、そのIP上の任意のWebサイトに接続できます。
ニールドネガン

2
@Emily、ルールが追加されるという点でうまく機能するかもしれませんが、serverfault.com IPが変更された場合、トラフィックは許可されません。頻繁に変更される数百のアドレスを持つgoogle.comのようなサイトを許可することはまったく機能しません。
ゾレダチェ

1

ウェブサーバーでこれを設定する必要があります。iptablesはパケットフィルターです。HTTPトランザクションは、TCPペイロードの一部として(つまり、iptablesが簡単に読み取るTCPヘッダーの一部としてではなく)サイト名(つまり、stackoverflow)を送信します。

それと、HTTPトランザクションが複数のパケットにほぼ確実に拡散するという事実(つまり、HTTPヘッダー内の文字列と一致させることはできません)を考えると、これはWebサーバー構成またはフロントのプロキシによってはるかに適切に処理されますそれの。

この背後にある理由を知っておくと便利です。他にもいくつかの選択肢があります。

  1. 間違ったURLを入力した場合は正しいURLにリダイレクトします(www.stackoverflow.comを入力した場合はstackoverflow.comにリダイレクトします)
  2. stackoverflow.com以外のホストにサービスを提供しないようにWebサーバーに指示します
  3. 他の何も解決しない別のIPにサイトを配置し、Webサーバーがそれをリッスンするようにします。

こんにちはPhil、どのWebサーバーを理解しているかわかりませんか?ウェブサーバーがありません。私は自分のコンピューターでこの構成を行っています。
ゼネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.