web-dev-qa-db-ja.com

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

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 OUTPUT -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アドレスを入れるだけですか?私がやろうとしていることは、より単純なルールで達成できると思いますか?どうやって?

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

20
Zenet

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

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

ソース/宛先オプションはホスト名を受け入れますが、強くお勧めしません。 manページを引用すると、

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

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

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

これらすべてを理解し、スクリプトを再構成することをお勧めします。

# 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
30
Scott Pack

追加

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

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

7
slillibri

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

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

5
BillThor

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

2
Niall Donegan

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

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

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

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