この節は読者の Ram Narula (Internet for Education, Thailand) から寄せられました。
Linux でこの目的を満たすための通常のテクニックは、 おそらくポート 80 (web) の「外向き」トラフィックが squid の動作しているサーバにルーティングされるようにした 「後で」、ipchains を用いる方法でしょう。
外向きのポート 80 トラフィックを squid の動作しているサーバに ルーティングするには、3 つの方法が知られています。 ここでは 4 番目の方法を紹介します。
ゲートウェイルータに、外向きで送信先ポートが 80 のパケットを squid サーバの IP アドレスに送らせることが可能な場合。
しかし
これはルータに負荷をかけることになりますし、 商用のルータではサポートしていないこともあります。
レイヤ 4 スイッチは、この作業をまったく問題なく処理できます。
しかし
レイヤ 4 スイッチの価格は非常に高く、 たいていの場合は、(一般的なルータ + 良い Linux サーバ) の合計よりも高いです。
すべてのトラフィックにキャッシュサーバを経由させることもできます。
しかし
squid はかなりの CPU パワーを消費するため、これはかなりリスクが高いです。 つまりネットワーク全体の性能が遅くなるかもしれませんし、 万一サーバがクラッシュしたら、誰もネットワークにアクセスできなくなります。
NetFilter を用いると、別のテクニックが実装できます。 つまり NetFilter に到達先ポートが 80 のパケットをマーキングさせ、 iproute2 を使って印のついたパケットを squid サーバにルーティングさせるのです。
|----------------| | 実装 | |----------------| 用いたアドレス 10.0.0.1 naret (NetFilter サーバ) 10.0.0.2 silom (Squid サーバ) 10.0.0.3 donmuang (インターネットに接続しているルータ) 10.0.0.4 kaosarn (ネットワークの別のサーバ) 10.0.0.5 RAS 10.0.0.0/24 メインネットワーク 10.0.0.0/19 ネットワーク全体 |---------------| | ネットワーク図| |---------------| Internet | donmuang | ------------hub/switch---------- | | | | naret silom kaosarn RAS etc. |
(以前はこのネットワークのすべてのサーバでは 10.0.0.1 がデフォルトゲートウェイで、 これは donmuang ルータの以前の IP アドレスでした。 よってここでは donmuang の IP アドレスを 10.0.0.3 に変更し、 naret の IP アドレスを 10.0.0.1 にしたのです)
Silom ----- -squid と ipchains を設定する |
silom で squid サーバを設定し、 透過キャッシュ/プロクシをサポートするようにします。 デフォルトのポートは通常 3128 なので、ポート 80 へのトラフィックは ローカルの 3128 にリダイレクトしなければ鳴りません。 これは ipchains を用いて次のように書けます:
silom# ipchains -N allow1 silom# ipchains -A allow1 -p TCP -s 10.0.0.0/19 -d 0/0 80 -j REDIRECT 3128 silom# ipchains -I input -j allow1 |
あるいは netfilter の言葉では:
silom# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128 |
(注意: 他のエントリもあるかもしれません)
squid サーバの設定に関する詳しい情報は、 Squid FAQ のページ を参照してください。
このサーバでは ip forwarding を有効にしておいてください。 またこのサーバのデフォルトゲートウェイは、 donmuang ルータにしてください (naret ではありません)。
Naret ----- -iptables と iproute2 の設定 - icmp REDIRECT メッセージを無効にする (必要な場合) |
送信先ポートが 80 のパケットに、値 2 でマークします。
naret# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 \ -j MARK --set-mark 2 |
iproute2 を設定し、2 というマークのついたパケットを silom にルーティングします。
naret# echo 202 www.out >> /etc/iproute2/rt_tables naret# ip rule add fwmark 2 table www.out naret# ip route add default via 10.0.0.2 dev eth0 table www.out naret# ip route flush cache |
donmuang と naret が同じサブネットにある場合は、 naret に icmp REDIRECT メッセージを送信させてはいけません。 この場合はそうだったので、次のコマンドで icmp REDIRECT を無効化しました。
naret# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects naret# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects naret# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects |
これで設定は完成です。調べてみましょう。
naret にて: naret# iptables -t mangle -L Chain PREROUTING (policy ACCEPT) target prot opt source destination MARK tcp -- anywhere anywhere tcp dpt:www MARK set 0x2 Chain OUTPUT (policy ACCEPT) target prot opt source destination naret# ip rule ls 0: from all lookup local 32765: from all fwmark 2 lookup www.out 32766: from all lookup main 32767: from all lookup default naret# ip route list table www.out default via 203.114.224.8 dev eth0 naret# ip route 10.0.0.1 dev eth0 scope link 10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1 127.0.0.0/8 dev lo scope link default via 10.0.0.3 dev eth0 (silom は上述の行のどれかに属していることを確認のこと。 この場合は 10.0.0.0/24 の行です) |------| |-DONE-| |------| |
|-----------------------------------------| | 実装後のトラフィックフロー図 | |-----------------------------------------| INTERNET /\ || \/ -----------------donmuang router--------------------- /\ /\ || || || || || \/ || naret silom || *destination port 80 traffic=========>(cache) || /\ || || || \/ \/ \\===================================kaosarn, RAS, etc. |
通常の外向きの経路には余計に 1 hop が挟まるので、 ネットワークは非対称になっています。
ここには kaosarn とインターネットの間で送受信される パケットを追跡してみましょう。
kaosarn の http リクエスト→naret→silom→donumuang→インターネット インターネットから到着したデータ→donmuang→kaosarn |
kaosarn の外向きデータ→naret→donumuang→インターネット インターネットから到着したデータ→donmuang→kaosarn |