在杭州機房裡有一部分機器擁有雙網卡,雙IP,這種機器的網絡需要特殊配置。
例如:客服工作台有一台機器有兩塊網卡,分别是 公網ip 223.5.20.36(eth0) 和 内網ip 192.168.220.41(eth1)。
需要注意的是,這台機器的網關是 192.168.0.1。這會導緻一個問題,當一個外部請求通路它的公網位址 223.5.20.36 時,響應資料包會從内部網絡接口 eth1 出去。請求端接受到的包的源 ip 就不再是 223.5.20.36 了,這種情況響應包通常會被直接丢棄,導緻通信失敗。
解決這個問題有兩種方法:
1. 簡單直接的方式:把網關設定為公網ip的網關, 如 223.5.20.1。
2. 但假如處于某些原因,不想更改網關。還有一種比較麻煩一些的方式:iptables的CONNMARK子產品 + 政策路由。具體實作如下:
a.首先是給 所有 從公網接口eth0進來的包都打上一個标記(fwmark)。
<code>iptables -A INPUT -i eth0 -d 223.5.20.36 -j CONNMARK --set-mark 1</code>
注:實際上隻需要對一次連接配接的第一個包打标記就行,即下面這樣也行:
<code>iptables -A INPUT -i eth0 -d 223.5.20.36 -m state --state NEW -j CONNMARK --set-mark 1</code>
b.當響應資料包傳回時,利用connmark的連接配接追蹤功能給響應包也打上相同的标記。
<code>iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark</code>
注:必需在 mangle 表執行 connmark 标記恢複。因為在mangle表之後會進行一次 reroute check 重新路由,這使得下一步得以發生。
c.配置政策路由,讓打了标記(fwmark 1)的包全部走 eth0 接口。
<code>echo 200 public >> /etc/iproute2/rt_tables</code>
<code>ip rule add table public</code>
<code>ip route add table public default via 223.5.20.1 dev eth0 本文轉自 Bruceweien 51CTO部落格,原文連結:http://blog.51cto.com/bruceweien/1932409</code>