編集

編集

私のネットワーク構成は次のとおりです。

私のネットワーク構成 http://daveden.files.wordpress.com/2013/05/network-configuration.png

プロキシ サーバーは、ポート 3128 で Squid、ポート 8080 で DansGuardian を使用して Ubuntu を実行しています。

すべてのクライアントが HTTP/HTTPS アクセスに対してプロキシ サーバー (具体的にはポート 8080) を使用するように強制したいと思います。

ただし、透過的にリダイレクトすることは HTTPS では機能しないため、望んでいません。各クライアントを構成することは気にしませんし、各クライアントがプロキシ サーバーを使用していることを認識することも気にしません。クライアントがプロキシ設定なしで Web を閲覧できないようにしたいだけです。

どうすればいいですか? クライアントがポート 8080 でプロキシ サーバーを使用するように構成されていない場合は、パケットをドロップするだけでよいですか?

iptables を使用して、8080 以外の dport を持つパケットをドロップしようとしましたが、拒否されるパケットが多すぎて、何もアクセスできなくなりました。

編集

私はこの質問を iptables に特化しないように書き直しましたが、iptables の使用にまったく反対しているわけではありません。より幅広い解決策を提案したいだけです。

編集2

誤解を与えてしまったかもしれません。念のため言っておきますが、私はフィルタリングHTTPSトラフィック(つまり、プロキシでパケットを分解して内容を検査する)ブロッキングDansGuardian を使用して、HTTP 経由か HTTPS 経由かを問わずサイトをブロックします (パケットの宛先を確認します)。

編集3

以下の Alexandru-Florin Vintil の提案に基づいて、私が現在行っていることは次のとおりです。

# Redirect HTTP traffic to port 8080 (DansGuardian)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080

# Check TCP and UDP traffic against whitelist
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j whitelist
iptables -A FORWARD -i eth1 -p udp --dport 443 -j whitelist

# Drop all other HTTPS traffic
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 443 -j DROP

# Drop all traffic aimed straight at the proxy
iptables -A FORWARD -i eth1 -p tcp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p tcp --dport 8080 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 8080 -j DROP

簡単に言うと、HTTP トラフィックをポート 8080 にリダイレクトし、ホワイトリストに登録されていないすべての HTTPS トラフィック (別のチェーン内) をドロップし、プロキシを明示的に使用するすべてのトラフィックをドロップします。最後のルールがなければ、クライアントは、ブラウザでプロキシを使用するように設定している限り、HTTPS を使用して任意の Web サイトにアクセスできます。これは、その場合、宛先ポートが 443 ではなく 8080 になるためです。したがって、443 にバインドされたすべてのトラフィックをドロップしても、HTTPS が完全にブロックされるわけではありません。

答え1

私の意見:

HTTP について: ファイアウォールでポート 80 のトラフィックをプロキシ/フィルターに透過的に転送するのが、最も簡単な方法です。クライアントの構成は不要で、クライアントの再構成を必要とせずに、任意のホスト/サブネットをプロキシの使用から除外できます。これが、プロキシを通過するはずのすべてのトラフィックが確実に通過する唯一の方法です。

すべてのHTTPS 443トラフィックをブロックし、ポート443の送信が許可されているIPに基づいて一部のサイトのみを許可する以外の方法は、期待どおりには機能しません。HTTPSの安全なプロトコルは、(いくつかの欠陥は別として)中間者攻撃(プロキシは「合法的な」MITM)を防ぐように設計されています。この方法では、HTTPSは設計されたとおりに機能します。ただし、無視するHTTPS の場合、Squid を DIRECT を使用し、CONNECT (タッピング) を使用しないように設定する必要がありますが、この場合でも、HTTP/HTTPS 部分が混在する問題のある Web サイトに遭遇する可能性があります。この方法では、Squid プロキシは HTTPS も管理します。これは、ファイアウォールの透過転送部分にも反映されるはずです。

答え2

機能するはずのものが機能していないことに気づいたら、自分が気づいていない他の要因が関係しているかどうかを自問する必要があります。ルール

sudo iptables -A INPUT -p tcp ! --dport 8080 -j REJECT

うまくいくように見えますが、添付INPUTチェーンに送られるので、チェーン内の前のルールによって回避される可能性があります。INPUTチェーンは着信パケットが最初にヒットするチェーンであるため、このルールはそれ自体で十分なはずです。INPUTチェーンでREJECTされた場合、FORWARDチェーンやOUTPUTチェーンに届くことはありません。もちろん、このルールはブロックします。すべてポート 8080 宛てではない TCP。8080 のプロキシがマシン上の唯一のサービスであり、コンソールからのみログインする場合を除き、これは最終的に本当に必要なものではない可能性があります。

したがって、最初に行うべきことは、ルールをリストし、パケットが通過する原因を探すことです。

sudo iptables -L

ファイアウォールがリバース NAT を実行している場合は、NAT テーブルもリストする必要があります。

sudo iptables -L -t nat

その後、同じルールを始まりチェーンの:

sudo iptables -I INPUT -p tcp ! --dport 8080 -j REJECT

それで問題が解決しないか、少なくともiptablesルールセットを完成させるためにどのように動作するか理解しているという自信が持てるかどうかを確認してください。リモートからこのホストで作業している場合、私の提案は切断されるため、コンソールからのみ実行してください。リモートから安全に作業するには、同僚を参照してください。Eli Rosencruft のリモートからのファイアウォールの調整に関する投稿

答え3

標準

別の(ユーザー定義の)チェーンが役立つ場合があります。

# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100

# redirect all traffic FROM user 100 to custom chain
iptables -A INPUT -p tcp -s 192.168.1.100 -j custom_user_100

# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP

つまり、これは192.168.1.100からのトラフィックをカスタムチェーンにリダイレクトします。このカスタム(ユーザー定義)チェーンは、有効な一致が見つかった場合(ポート8080宛のトラフィック)のみを返します。チェーンから返されないその他の一致しないトラフィックは、落とされた

後でテーブルの統計を表示して、何が起こったかを確認できます。

iptables -L -v -n

転送

さて、転送トラフィックを処理する場合は、異なるルール セットが存在します。ただし、カスタム (ユーザー定義) チェーンを使用するという考え方は同じです。次のリンクの図を参照することをお勧めします。http://www.csie.ntu.edu.tw/~b93070/CNL/v4.0/CNLv4.0.files/Page697.htmパケットの流れを理解しようとするとき。

この場合、次のようなことを行うとよいでしょう。

# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100

# redirect all traffic FROM user 100 to custom chain
iptables -A FORWARD -p tcp -s 192.168.1.100 -j custom_user_100

# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP

これは、INPUT チェーンに適用されたルールが FORWARD チェーンに適用される点を除いて、最初のものと同じです。

2013-05-24更新

あなたの質問をもう一度読みました。最初からやり直します。

「プロキシ」が実際にはルーターであると仮定しましょう。つまり、NAT などを使用して、すべてのパケットを 1 つのインターフェイスから別のインターフェイスに渡します。つまり、対象となるすべてのパケットが FORWARD チェーンを通過します。

次に、ポート8080を使用するすべてのクライアントがプロキシ自体にアクセスするように構成すると述べています。これは、すべてのそれらのパケットは INPUT チェーンを介して「プロキシ」に入ります。

つまり、FORWARD チェーンで誰かがポート 8080 から出られないようにしたいだけです。

iptables -A FORWARD -p tcp --dport 8080 -j REJECT

このルールにより、宛先ポート 8080 に転送されるものはすべて拒否されます (プロキシ経由でパケットを渡そうとしたクライアントに ICMP パケットが送信されます)。

このルールを実装した後は、このような禁止された接続を試行してこれをテストすることが非常に重要です。その後、次のように入力してルールをリストします。

iptables -L -v -n |grep 8080

カウンターが増加していることを確認します。増加していない場合は、ルーターの設定に問題があります。

答え4

クライアントがプロキシなしで http{s} サイトにアクセスすることを望まない場合は、パケットをポート 80 と 443 に転送するDROPだけで済みます。REJECT

IPTABLES -I FORWARD -i eth1 -p tcp -m multiport --dports 80,443 -j REJECT

内部インターフェースはどこにeth1ありますか。この方法を使用すると、他のポートやアクセスを操作する必要がなくなります。

関連情報