2017.5.10

Debian プロキシサーバー Squid くコ:くコ:くコ:彡。゜゜。。

透過プロキシ&iptablesで凹む: ProxyⅢ

### First,please visit -----------
Introduction & INDEX コチラから
------------------------------ ###

インターネットへのアクセス制限を、ドメイン・URL振り分けで設定したい。
そんな訳で、試しにプロキシを立てて通してみた。
今回は、透過プロキシとiptablesの関係について。
討ち死に寸前で凹みましたが、HTTPだけはなんとかつながりました。
SSL透過は手強いなァ(ˆˆ ;)。。。

■ INDEX
• Squidでインターネットへのアクセス制限を試してみる: ProxyⅠ
• クライアント側のプロキシ設定: ProxyⅡ
• 透過プロキシ&iptablesで凹む: ProxyⅢ
• HTTPS透過プロキシで折れる: ProxyⅣ

■ 非透過型プロキシへのiptablesルール
まずは、本題に入る前に非透過型プロキシ(クライアントが自身でプロキシ設定をおこなうタイプ)
へのiptablesのルール設定について。
接続環境は、ザッとこんな状況でしょう。
特に難しいことは無さそう。

< 環境 >
 ROUTER: 192.168.1.1
 netmask: 255.255.255.0
 PROXY_SERVER: 192.168.1.101:8080
 CLIENT: 192.168.1.31
 gateway: $ROUTER

< iptables >
  filter policy = INPUT: DROP, FORQARD: DROP, OUTPUT: ACCEPT
# iptables -A INPUT -s 192.168.1.31 -p tcp --dport 8080 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

■ 透過型プロキシへのiptablesルール
さて、本題の透過型プロキシです。ROUTERの直下に配置しパケットを通過させるタイプ。
クライアント自身がWebBrowserでプロキシ指定の設定を行うことはありません。
本章では、まずはHTTPだけのプロキシ透過を設定します。

< 環境 >
ROUTER: 192.168.1.1
netmask: 255.255.255.0
PROXY_SERVER  eth0: 192.168.1.101  gateway = $ROUTER
eth1: 192.168.20.254  proxy port = 58080(*透過ポート)
CLIENT: 192.168.20.31
gateway = 192.168.20.254
*クライアント側でのプロキシ設定は必要ない。
< iptables >
  filter policy = INPUT: DROP, FORQARD: DROP, OUTPUT: DROP
 # iptables -A INPUT -s 192.168.20.31 -i eth1 -p tcp --dport 58080 -j ACCEPT
-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -d 192.168.20.31 -o eth1 -p tcp --sport 58080 -m state \
--state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT
-A FORWARD -s 192.168.20.31 -i eth1 -o eth0 -p tcp --dport 443 -j ACCEPT
-A FORWARD -s 192.168.20.31 -i eth1 -o eth0 -p udp --dport 53 -j ACCEPT
-A FORWARD -d 192.168.20.31 -i eth0 -o eth1 -p tcp --sport 443 -m state \
--state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 192.168.20.31 -i eth0 -0 eth1 -p udp --sport 53 -m state \
--state RELATED,ESTABLISHED -j ACCEPT
# iptables -t nat -A POSTROUTING -s 192.168.20.31 -o eth0 -j SNAT --to-source 192.168.1.101
-t nat -A PREROUTING -s 192.168.20.31 -i eth1 -p tcp --dport 80 -j REDIRECT \
--to-port 58080

< ポイント >
・リダイレクト  NATテーブル、PREROUTINGチェインのREDIRECTターゲットで、80ポート(http)へ
届いたパケットを58050ポートに転送する
・INPUT  REDIRECTで転送されたパケットを58080ポートで受け入れる
・HTTPS  プロキシを透過させずにフォワーディングする  *1.forward
・DNS  フォワーディングする  *2.DNS
・アドレス変換  NATテーブル、POSTROUTINGチェインのSNATターゲットで出口側のアドレスに変換。
-o eth0の指定がミソ。

*1:forward
DebianのデフォルトシステムではIPフォワードされない。/etc/sysctl.confファイルで設定する。
参照: コチラをどうぞ

*2:DNS
この場合はクライアント側で、DNSサーバの指定が必要。/ect/resolv.confファイルで指定される。
参照: コチラをどうぞ

▼ ちなみに以下の様でも通ります
上記と同じ2枚NIC環境で、プロキシポート: 8080, クライアント側でプロキシ指定する。

< iptables >
  filter policy = INPUT: DROP, FORQARD: DROP, OUTPUT: DROP
 # iptables -A INPUT -s 192.168.20.31 -i eth1 -p tcp --dport 8080 -j ACCEPT
-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -d 192.168.20.31 -o eth1 -p tcp --sport 8080 -m state \
--state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT
  *FORWARD, NATとも設定なし。

透過型プロキシのHTTPS接続については、秘匿性のある通信を選択の余地なく通過させることから(クライアントが無自覚でいる側面がある)、充分な安全管理をおこなう必要があるでしょう。
本章でのiptablesルールはざっくりとしたものです。当然のことですが、ネットワーク環境に応じて細やかに制限を設けてください。
次章ⅣでSSL透過型プロキシを試みます。

Copyright(C) green-pen miyagi