Shammer's Philosophy

My private adversaria

Debian Router 化計画

Debian Router/Gateway in 15 Minutes – The Novian Blogによれば、iptables を使うと、IPマスカレードするように設定できるらしい。ということでやってみる。

  1. ルーターにしたい Debian に 2 つの NIC を設定
  2. /etc/sysctrl.conf で net.ipv4.ip_forward=1 の行のコメントを外し、IP forward を有効にする
  3. iptables -t nat -A POSTROUTING -s $INTERNAL_IP_SUBNET -j MASQUERADE
  4. iptables-save -c > /etc/iptables.rules
  5. /etc/network/interfaces を編集

/etc/network/interfaces は以下のようにした。

auto	eth1
iface	eth1	inet	static
	address	192.168.1.237
	netmask	255.255.255.0
	pre-up	iptables-restore < /etc/iptables.rules

auto	eth2
iface	eth2	inet	static
	address	192.168.2.237
	netmask	255.255.255.0

普通に IP_Forward するだけであれば、送信元の IP は変更されずにサーバーに到達する。しかし、IP マスカレードの場合は、上記の eth2 のアドレスに NAT されてサーバーに到達、サーバーは NAT されたアドレスに応答を返す動作になる。192.168.1.0/24 のクライアントから 192.168.2.233 宛にリクエストを出したときのパケットは以下。

  3   3.737183 192.168.2.237 -> 192.168.2.233 TCP 74 53658→8080 [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=1130073 TSecr=0 WS=16
  4   3.737205 192.168.2.233 -> 192.168.2.237 TCP 74 8080→53658 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=1121756 TSecr=1130073 WS=16
  5   3.737290 192.168.2.237 -> 192.168.2.233 TCP 66 53658→8080 [ACK] Seq=1 Ack=1 Win=14608 Len=0 TSval=1130073 TSecr=1121756
  6   3.737344 192.168.2.237 -> 192.168.2.233 HTTP 148 GET / HTTP/1.1
  7   3.737351 192.168.2.233 -> 192.168.2.237 TCP 66 8080→53658 [ACK] Seq=1 Ack=83 Win=14480 Len=0 TSval=1121756 TSecr=1130073
  8   3.738963 192.168.2.233 -> 192.168.2.237 HTTP 316 HTTP/1.1 200 OK  (text/html)
  9   3.739046 192.168.2.237 -> 192.168.2.233 TCP 66 53658→8080 [ACK] Seq=83 Ack=251 Win=15680 Len=0 TSval=1130074 TSecr=1121756
 10   3.739236 192.168.2.237 -> 192.168.2.233 TCP 66 53658→8080 [FIN, ACK] Seq=83 Ack=251 Win=15680 Len=0 TSval=1130074 TSecr=1121756
 11   3.739547 192.168.2.233 -> 192.168.2.237 TCP 66 8080→53658 [FIN, ACK] Seq=251 Ack=84 Win=14480 Len=0 TSval=1121757 TSecr=1130074
 12   3.739625 192.168.2.237 -> 192.168.2.233 TCP 66 53658→8080 [ACK] Seq=84 Ack=252 Win=15680 Len=0 TSval=1130074 TSecr=1121757

192.168.1.0/24 からでなく、192.168.2.237 から SYN が来ている。ここがグローバルアドレスになっていれば、ルーターと同じ・・・はず。