Network Users' Group ``wheel'' / Dai ISHIJIMA's Page / RTシリーズルータ /
PFを使ったTCPプロキシ
| はじめに | 各マシンについて | IPアドレス設定 | ブリッジ設定 | pf.confの設定 | 応用例 |

初版: 2010-01-29
最終更新日: 2010-01-17


pf(4)パケットフィルタとif_bridge(4)ブリッジで透過TCPプロキシ


☆はじめに

下図のような構成
	+---------+    +-----------+    +---------+
        |(A)client|----|(B)Dual NIC|----|(C)server|
	+---------+    +-----------+    +---------+
で、(A)→(C)に向かうパケットを(B)で横取りして (B)をプロキシに使えないかなぁ…と考えたのが発端です(2008年末ごろ)。

え、それってMan-in-the-middle攻撃ちゃうのか? という声もあるかもしれませんが。

実際にはsquidによるインライン透過キャッシュみたいなことを HTTP(80/tcp) 以外でも簡単にできないものかなぁと。

目標は、(C)でtelnetd(8)が動いていて、 この状態で(A)から(C)にtelnetをかけたら応答するのは(B)としました。


☆各マシンについて


☆IPアドレスの割り当て

下図のように割り当ててみました。
	 +---------+
         |(A)client|
	 +---------+
              | 192.168.1.2
              |
	      | [udav0] not assinged
	+-----------+
        |(B)Dual NIC|
	+-----------+
              | [rl0] 192.168.1.3
              |
              | 192.168.1.1
	 +---------+
         |(C)server|
	 +---------+


☆/etc/rc.confでのIPアドレスとブリッジ設定

	ifconfig_rl0="inet 192.168.1.3 netmask 255.255.255.0"
	ifconfig_udav0="up"
	cloned_interfaces="bridge0"
	ifconfig_bridge0="addm rl0 addm udav0 up"
この状態では、(B)は単なるブリッジとして動作し、 (A)→(C)、(C)→(A)にはそのままパケットが流れます。


☆/etc/pf.confでのパケット横取り設定

ここで(C)から(A)に向かうtelnetパケットを横取りしてみましょう。 /etc/pf.confで
	right_if="rl0"
	left_if="udav0"

	no rdr on lo0 from any to any
	rdr on $left_if proto tcp from any to any port 23 -> ($right_if) port 23
	pass in all
	pass out all
と設定し、/etc/rc.confでpfを有効にする
	pf_enable="YES"
	pflog_enable="YES"
と、なぜか(B)が応答するようになりました。


☆実際に何に応用したか


☆関連リンク


ご質問などありましたらお気軽に