ということでOSを入れ替えるたびに迷うルーティングです。迷うというか、どう設定したのか忘れるのよね。以前CentOSに乗り換えたときのもブログに書いておいたけれど、openSUSEに乗り換えたときに、古い記事はばっさり削除しちゃったし(嘘、残ってました。
今回は外向けにサービスを行うWebサーバとルーターが見かけ上別マシンになったので、Webサーバは固定IP、ルーターは動的IPでそれぞれ接続してしまえばいいわけで、Webサーバはともかくルーターは市販の機器を利用すればPCルータである必要も無い。のですが、「ある接続のみ固定IPから出て行く」ということをやりたいが為、毎回いろいろと迷う羽目になる。
普段は動的IPの経路(1)で外へ出て行き、一部のサービスに接続するときに固定IPの経路(2)を通るようにする。
ルータの内向きIPを192.168.0.1/eth0、DMZ(になるのか?)を192.168.5.2/eth1。WebサーバのDMZを192.168.5.1/eth0として、ルーター機のルーティングテーブルを設定する場合。
#RouterPC ip route add default via 192.168.5.1 dev eth1 table 200 ip rule add fwmark 1 table 200 iptables -t mangle -A PREROUTING -i eth0 -p tcp -m multiport --dports 22,8080 -j MARK --set-xmark 0x1/0xffffffff iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptalbes -A FORWARD -i eth0 -o eth1 -j ACCEPT echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
相手先ポート22番と8080番ならWebPC(固定IP)側からでる、という場合でざっくり書くとこんな感じ。今回はrp_filterをなかなか思い出せなくて、しかもUbuntuのバク?なのかeth1だけじゃ無くて、allとdefaultでもrp_filterを無効にしないとWebサーバからRouterPCへパケットが戻ってこなかった。これに気づくのに相当時間がかかってしまった。iptablesのmangleテーブルでマーク(今回は1)をつけてやって、参照するルーティングテーブルを切り替えるのがミソ。
Webサーバ側では特別ルーティングテーブルを弄る必要は無く、よくあるマスカレードでFORWARDするだけかな。
#WebPC iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptalbes -A FORWARD -i eth0 -o ppp0 -j ACCEPT