
我正在運行 Gentoo Linux,因此使用普通的 iptbales 來管理我的防火牆和網路。我通常使用 wan0 處理所有流量,但由於我已經有一個網頁伺服器,我希望將 wan1 (綁定到另一個網域)作為我的第二個網頁伺服器。
我有三個介面:
- eth0 = 區域網
- wan0 = 主要使用的 WAN(預設閘道)
- wan1 = 輔助 WAN
關於網關的一些信息
> route -n
Kernel IP Routentabelle
Ziel Router Genmask Flags Metric Ref Use Iface
0.0.0.0 80.108.x.x 0.0.0.0 UG 0 0 0 wan0
192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
80.108.x.0 0.0.0.0 255.255.254.0 U 0 0 0 wan0
84.114.y.0 0.0.0.0 255.255.255.0 U 0 0 0 wan1
127.0.0.0 127.0.0.1 255.0.0.0 UG 0 0 0 lo
NAT/MASQUEARDING 的預設初始化是
sysctl -q -w net.ipv4.conf.all.forwarding=1
iptables -N BLOCK
iptables -A BLOCK -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i eth0 -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i lo -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan1 -j MASQUERADE
在這個網關後面我運行著幾個網路伺服器。在一台機器上,我在連接埠 8000 而不是 80 上執行 HTTP 伺服器。
lan_host1="192.168.0.200"
iptables -A FORWARD -i wan0 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan0 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80
效果很好。現在我想使用 wan1,因為 wan0 與我通常用於其他用途的 IP/網域綁定。
我認為對 wan1 進行簡單的更改就可以了。
lan_host1="192.168.0.200"
iptables -A FORWARD -i wan1 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan1 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80
但這是行不通的。我猜問題是 wan0 是預設 GW。所以我猜 wan1 收到的套件會轉發到 lan_host1,但是當發送回網關時,它們會透過 wan0 而不是 wan1 發送,或至少使用 wan0 的 ip。
有什麼建議我可以如何處理這個問題嗎?
預先感謝,羅布
答案1
由於答案與配置相關,我做了一些假設。您必須調整答案以適應實際配置。
灣1的 LAN 和網關灣1任意選擇為 84.114.7.0/24 和 84.114.7.254。
沒有考慮防火牆規則,但所有這些都不應該與它們相互作用。
在 Linux 上ip link
,ip address
和ip route
應始終使用而不是已棄用的ifconfig
和route
。route
無論如何,可能無法處理額外的路由表。
只是作為一個提醒,iptables或者實際上網路過濾器,不路由,但它可以透過其操作更改 IP 路由堆疊做出的路由決策。這示意圖顯示路由決策可能發生的位置。對於僅在一個地方的路由(而不是本地發起)流量,並且更改必須在此之前發生:原始/預路由,mangle/預路由或者nat/預路由, 和生的通常不切實際,且納特僅適用於有限情況,大多數情況下會離開碾壓。
A基本多宿主系統,要使用多個互聯網路徑,通常需要策略路由,其中路由不僅可以像往常一樣隨目的地而改變,還可以隨來源或策略規則中使用的其他選擇器(如將在此處完成)而改變。在 Linux 上,使用以下命令制定附加規則ip rule
可以選擇不同的路由表來選擇例如不同的預設路由(仍然只有一個預設路由,但是一個每個路由表)。
所以這裡的原則是,同時仍然保持活躍嚴格反向路徑轉送(rp_過濾器), 是接受來自的資料包灣1並像往常一樣將它們引導至乙太網路0使用備用表(這將允許通過rp_過濾器)。此附加路由表應複製主路由表,但僅使用備用路徑所需的路由(灣1),因此不包括具有“正常”路徑的常用路線(旺0)。如果流經的流量必須涉及其他路由(例如 VPN 等)灣1,很可能他們的路線也必須添加,或者必須創建其他額外的規則和表格來應對這種情況。
由於 Linux 在核心 3.6 中不再使用路由緩存,因此路由堆疊中沒有任何內容會告訴您從主機1給客戶透過灣1他們最終會使用主要的預設路線出去旺0, 對該介面使用錯誤的 IP 進行 NAT (網路過濾器與路由無關,並且在接收連接的第一個資料包時已經選擇要完成的 NAT),並且可能被也執行嚴格反向路徑過濾的 ISP 的下一個路由器丟棄。有一個網路過濾器允許在 conntrack 標記中複製資料包標記並將其放回資料包中的功能:這將充當連接的路由記憶體。所以iptables和網路過濾器的連線將用於兩個相關功能:標記資料包以更改路由決策,以及在標識為相同連接一部分的回應資料包上還原此標記。
所有這些都轉化為這些命令:
- 路由部分
對於標記的資料包(任意標記值 101)使用額外的路由表(不相關的任意值也是 101):
ip rule add fwmark 101 lookup 101
使用類似的條目填充表主要的路由表,減去旺0條目:
ip route add table 101 192.168.0.0/16 dev eth0
ip route add table 101 84.114.7.0/24 dev wan1
ip route add table 101 default via 84.114.7.254 dev wan1
- iptables/網路過濾器部分
以下命令有各種可能的最佳化,可能還可以改進。
恢復已保存的潛在先前標記,因此回覆資料包將獲得與原始資料包相同的標記:
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
標記來自以下位置的資料包灣1改變上面的路由決策:
iptables -t mangle -A PREROUTING -i wan1 -j MARK --set-mark 101
如果有標記,請將其保存在連線(本來可以在納特表每個連接流只執行一次,而不是每個資料包):
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark
實際上這仍然會失敗嚴格反向路徑轉送檢查,因為這未記錄的功能於 2010 年新增。
sysctl -w net.ipv4.conf.wan1.src_valid_mark=1