概要

同一セグメントにデフォルトGWが複数ある場合、入ってきたGWへルーティングを 回す必要が出てくる場合がある。

考えられる状況としては、LB配下にWebサーバが存在し、DNATをしており、 LBの更新時に新LBに別IPアドレスを持たせてを段階的に移行していく場合。 この場合、パケットを送ってきたLBにパケットを返す必要がある。

想定NW図

これをiptables + iproute2の組み合わせで解決する。

新しいLBのMACアドレスを調査

pingを送り、新LBにarpテーブルを更新する。 (例) 現行LB(10.0.1.11)、新LB(10.0.1.12)

 # ping 10.0.0.11
 # ping 10.0.0.12
 # arp -a
 ? (10.0.1.11) at 00:0c:29:15:c7:bb [ether] on eth0
 ? (10.0.1.12) at 00:0c:29:6a:cd:2a [ether] on eth0

iptablesによるmark付与

特定のMACアドレスだった場合に、markをつけて識別可能にする。

 ※ manglee tableをクリア
 # iptables -t mangle -F

 ※ 特定のMACアドレスから通信が入ってきた場合、1番のマークを付ける
 # iptables -t mangle -A INPUT -m mac --mac-source 00:0c:29:6a:cd:2a -j MARK --set-mark 1

 ※ 入ってきた通信の追跡ができるようmark情報を保存する
 # iptables -t mangle -A INPUT -j CONNMARK --save-mark

 ※ markがついていた通信の関連通信(今回はOUTPUT)のmarkを継続して付与する(save-markの情報をrestoreする)
 # iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark

mark がついたパケットのルーティングを決める

新LBが10.0.1.12の場合に、mark 1をつけたパケットを新LBにルーティングする

 # ip route add default via 10.0.1.12 table 200
 # ip rule add fwmark 1 table 200

これで新LBを経由して入ってきた通信は、新LB、現行LBを経由して入ってきた通信は 現行のルーティングテーブルで配送される。

comments powered by Disqus
カテゴリ
タグ
月別アーカイブ