15.5. netfilter, iproute2, ipchains, squid を用いた透過 Web キャッシュ

この節は読者の Ram Narula (Internet for Education, Thailand) から寄せられました。

Linux でこの目的を満たすための通常のテクニックは、 おそらくポート 80 (web) の「外向き」トラフィックが squid の動作しているサーバにルーティングされるようにした 「後で」、ipchains を用いる方法でしょう。

外向きのポート 80 トラフィックを squid の動作しているサーバに ルーティングするには、3 つの方法が知られています。 ここでは 4 番目の方法を紹介します。

ゲートウェイルータにやらせる

ゲートウェイルータに、外向きで送信先ポートが 80 のパケットを squid サーバの IP アドレスに送らせることが可能な場合。

しかし

これはルータに負荷をかけることになりますし、 商用のルータではサポートしていないこともあります。

レイヤ 4 スイッチを用いる

レイヤ 4 スイッチは、この作業をまったく問題なく処理できます。

しかし

レイヤ 4 スイッチの価格は非常に高く、 たいていの場合は、(一般的なルータ + 良い Linux サーバ) の合計よりも高いです。

キャッシュサーバをネットワークのゲートウェイにする

すべてのトラフィックにキャッシュサーバを経由させることもできます。

しかし

squid はかなりの CPU パワーを消費するため、これはかなりリスクが高いです。 つまりネットワーク全体の性能が遅くなるかもしれませんし、 万一サーバがクラッシュしたら、誰もネットワークにアクセスできなくなります。

Linux+NetFilter ルータ

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.
	
まず naret を silom 以外のマシンのデフォルトゲートウェイにして、 すべてのトラフィックが naret を経由するようにします。 silom のデフォルトゲートウェイは donmuang (10.0.0.3) にします。 さもないとこの環境では web トラフィックがループします。

(以前はこのネットワークのすべてのサーバでは 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 メッセージを無効にする (必要な場合)
	

  1. 送信先ポートが 80 のパケットに、値 2 でマークします。
    naret# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 \
     -j MARK --set-mark 2
    	      

  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-|
|------|
	

15.5.1. 実装後のトラフィックフロー図

|-----------------------------------------|
|       実装後のトラフィックフロー図      |
|-----------------------------------------|

INTERNET
/\
||
\/
-----------------donmuang router---------------------
/\                                      /\         ||
||                                      ||         ||
||                                      \/         ||
naret                                  silom       ||
*destination port 80 traffic=========>(cache)      ||
/\                                      ||         ||
||                                      \/         \/
\\===================================kaosarn, RAS, etc.

通常の外向きの経路には余計に 1 hop が挟まるので、 ネットワークは非対称になっています。

ここには kaosarn とインターネットの間で送受信される パケットを追跡してみましょう。