web-dev-qa-db-ja.com

クライアントにプロキシの使用を強制する

これが私のネットワーク構成です:

私のネットワーク構成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

間違った印象を与えたのかもしれません。明確にするために、私はfilteringHTTPSトラフィックにまったく興味がありません(つまり、プロキシでパケットを分解して内容を検査しています)。私はDansGuardianでblockingサイトにもっと興味があります。それは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が完全にブロックされるわけではありません。 。

4
Big McLargeHuge

私の2セント:

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

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

機能するはずの機能が機能していないことがわかった場合は、他の何らかの要因が発生していないかどうかを確認する必要があります。ルール

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

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

したがって、最初に行うことは、ルールをリストし、パケットが通過する原因となっている可能性があるものを探すことです。

Sudo iptables -L

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

Sudo iptables -L -t nat

その後、チェーンのbeginningに同じルールを配置してみます。

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

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

標準

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

# 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年5月24日更新

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

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

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

そのため、FORWARDチェーンのポート8080がだれにも出られないようにしたいだけです。

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

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

このルールを実装した後、そのような禁止された接続を作成してテストすることが重要です。次に、次のように入力してルールを一覧表示します。

iptables -L -v -n |grep 8080

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

3
PP.

まずiptablesのドキュメントを少し読んでください-特に、少なくともパケットがどのテーブルのどのチェーンに入るかを知る必要があります(こちらをご覧ください: http://www.iptables.info/en /structure-of-iptables.html )。

2つのことの間でバランスを取る必要があります。つまり、全員にプロキシを強制的に使用させるという目標と、全員の利便性です。一方では、パケットの転送をまったく禁止できます(カーネルのip_forwardingフラグを無効にすることもできます)。このようにして、ローカルコンピュータはプロキシサーバーによってのみインターネットにアクセスできます。しかし、それでも、httpプロキシを介したトンネル接続の使用を誰もが阻止するわけではありません(httpsを使用するとさらに簡単になります)。したがって、インターネットの使用を完全に監視または制限することはできません。

一方、よりソフトなアプローチをとることができます:送信トラフィックをポート80に制限するだけです。その場合、httpを使用しないソフトウェア(たとえば、スカイプ)は、httpおよび正常に動作するクライアントでトラフィックをトンネリングする必要がありません。ローカルhttpキャッシュ(サイトへの高速アクセス)のすべての利点があります。

現在の構成は、上記の最初のオプションのようになります。しかし、FORWARDチェーンに不要なACCEPTルールがあります。ルーターがパケットを転送しないようにします。ローカルコンピューターは、リモートホストではなくプロキシ(パケットはINPUTチェーンを通過します)に接続します。現在の設定では、誰かがインターネット上のどこでもポート8080でリッスンしているプロキシを見つけて、プロキシの代わりにそれを使用する可能性があります。

1
skarap

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

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

どこ eth1は内部インターフェースです。このようにすることで、他のポートやアクセスをいじる必要がなくなります。

1
fboaventura

個人的には、INPUTおよびFORWARDチェーンのデフォルトポリシーをDROPに設定したい

iptables -P INOUT DROP
iptables -P FORWARD DROP

次に、必要なトラフィックのみを許可します。これにより、驚きが少なくなり、許可したものだけが目的の場所に移動することが確実になります。

0
John Kloian