iptables –set-mark - 通過不同的介面路由不同的埠
短篇小說,
3 個介面,eth0(LAN),eth1(ADSL),eth2(4G)。
eth0 -> eth1:工作
(埠 80、443、4070) eth0 -> eth2:不發生
這是該想法的圖形表示:
埠 80 和 443 通過 eth2
其餘通過 eth1
網路方案:
eth0: -ip 10.0.0.1 -net 10.0.0.0/8 -gw 10.0.0.1 (the servers own intf) eth1: -ip 192.168.1.74 -net 192.168.1.0/24 -gw 192.168.1.254 eth2: -ip 192.168.1.91 -net 192.168.0.0/24 -gw 192.168.0.1
**我認為這個新腳本將 22 和 4070 重新路由到正確的表。
但是,在到達該表後,它不會重新路由到 eth2。**
此腳本有效,但 22 和 4070 除外!
(埠 80 未註釋,它可以工作,但通過 eth1 是錯誤的。)
modprobe iptable_nat modprobe ip_conntrack echo "1" > /proc/sys/net/ipv4/ip_forward iptables -P INPUT ACCEPT iptables -F INPUT iptables -P OUTPUT ACCEPT iptables -F OUTPUT iptables -P FORWARD DROP iptables -F FORWARD iptables -F PREROUTING iptables -t nat -F iptables -t mangle -F iptables -F # This next line restores any issues trying to connect to something # if you get weird ACK packets when trying to connect (at least i did)! iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark ip route flush table main iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1 ### iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1 iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 4070 -j MARK --set-mark 1 ## Setup routes # LAN route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0 # ADSL route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1 # 4G (Only accessible if marking packages with \x01 route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2 # Default via ADSL ## -- Does the same as ip route below? route add default gw 192.168.1.254 echo "201 eth2.out" >> /etc/iproute2/rt_tables ip rule add fwmark 1 table eth2.out ip route add default via 192.168.0.1 dev eth2 table eth2.out ip route add default via 192.168.1.254 dev eth1 ## Setup forwards # From 4G to LAN iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT # From ADSL to LAN iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT # From LAN to ADSL (Default route out) # - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
舊腳本:
Ignore everything below unless you're interested in retracing my steps!!
我創建了一個 router.sh 腳本來設置我的環境,以防我做壞事。我有 3 個埠要發送到 4G 連接,其餘埠通過固定電話 ADSL 連接發送。為此,我已指示 iptables 在預設路由上處理包,並在 –dport == 443 | 時通過我的 4G 介面發送它們。80 | 4070
但是,這不起作用;無論如何,我仍然通過我的固定電話進行路由。
這是我的腳本的樣子:
#!/bin/bash ## routing tables # wireless = 4G via eth2 # adsl = adsl via eth1 modprobe iptable_nat modprobe ip_conntrack echo "1" > /proc/sys/net/ipv4/ip_forward iptables -P INPUT ACCEPT iptables -F INPUT iptables -P OUTPUT ACCEPT iptables -F OUTPUT iptables -P FORWARD DROP iptables -F FORWARD iptables -t nat -F ip route flush table main ip route flush table wireless ip route flush table adsl ## Setup routing tables # ADSL ip route add table adsl to 192.168.1.0/24 dev eth1 # 4G ip route add table wireless to 192.168.0.0 dev eth2 ip rule add fwmark 0x1 table wireless ## Setup routes # LAN route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0 # ADSL route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1 # 4G (Only accessible if marking packages with \x01 route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2 # Default via ADSL route add default gw 192.168.1.254 ## Forward ports into the LAN iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.0.3:80 ## Lets mark all packets we want for 4G forward # HTTPS iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1 # HTTP iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1 # Spotify iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1 ## Setup forwards # From 4G to LAN iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT # From ADSL to LAN iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # From LAN to ADSL (Default route out) # - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT iptables -A FORWARD -j LOG #iptables --table nat --append POSTROUTING --out-interface eth2 --jump SNAT --to-source "192.168.1.74" iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
我還嘗試將這 3 個添加到腳本的底部:
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 80 -j SNAT --to "192.168.0.91" iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 443 -j SNAT --to "192.168.0.91" iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 4070 -j SNAT --to "192.168.0.91"
也試過沒有成功:
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
最後但並非最不重要的一點是,嘗試過:
## Lets mark all packets we want for 4G forward # HTTPS iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1 # HTTP iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1 # Spotify iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1
路由有效,我可以瀏覽網頁,聽音樂等等,但我通過錯誤的界面進行操作。我已經在 Google 上搜尋了很長時間,並且發現了一些零碎的東西來了解我在做什麼以及為什麼要這樣做。我可以通過 tc 進行流量整形,但如果可以通過在 iptables 中標記包來實現,那將對我有很大幫助。
我的猜測是我在不同的規則上做錯了順序,主要是MASQUERADE部分?或者如果那應該在那裡?
有人可以解釋如何將DNAT埠說 tcp:80 從外部介面(一個或兩個協議)到內部 10.0.0.0 地址空間嗎?
輸出:
root@Netbridge:~# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface<br> 0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1<br> 10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0<br> 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2<br> 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
root@Netbridge:~# ifconfig eth0 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:4e inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0 eth1 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:58 inet addr:192.168.1.74 Bcast:192.168.1.255 Mask:255.255.255.0 eth2 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:62 inet addr:192.168.0.91 Bcast:192.168.0.255 Mask:255.255.255.0
遵循以下說明:
output-traffic-on-different-interfaces-based-on-destination-
port iptables-forward-specific-port-to-specific-nic
在其他一些相關執行緒中。
BatchyX 已經對 iptables 和路由給出了很好的解釋,所以我將鍛煉我的懶惰,直接進入腳本。
它應該通過 192.168.0.91 將所有流量 NAT 到埠 80,443,22,4070。其餘的將通過 192.168.1.254 進行 NAT。
我重新進行測試並最終遵循本指南。該指南中缺少的是我腳本中的最後 3 行。我從另一個埠發現的,但我忘記了那個連結。
這是一個經過測試的工作腳本。
需要預設路由
我沒有在腳本中添加的一件事是設置預設路由。它應該是
route add default gw 192.168.1.254
當你這樣做時
route -n
,它應該是唯一的預設路由 (Dest:0.0.0.0)0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1
fw-router.sh
# 重置/刷新 iptables iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P 輸入接受 iptables -P 轉發接受 iptables -P 輸出接受 #Reset/Flush/Setup IP 路由(表 4) ip 路由刷新表 4 ip route show table main | grep -Ev ^預設 | 同時讀取 ROUTE ;做 ip route add table 4 $ROUTE ; 完畢 ip route add table 4 預設通過 192.168.0.1 #用匹配的 D.Port 標記數據包 iptables -t mangle -A PREROUTING -p tcp --dport 22 -s 10.0.0.0/24 -j MARK --set-mark 4 iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 10.0.0.0/24 -j MARK --set-mark 4 iptables -t mangle -A PREROUTING -p tcp --dport 443 -s 10.0.0.0/24 -j MARK --set-mark 4 iptables -t mangle -A PREROUTING -p tcp --dport 4070 -s 10.0.0.0/24 -j MARK --set-mark 4 #SNAT 規則 iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.74 iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.0.91 #IP 路由 ip 規則添加 fwmark 4 表 4 ip 路由刷新記憶體 #IP 堆棧 #這是指南中缺少的部分 迴聲 1 > /proc/sys/net/ipv4/ip_forward 對於 /proc/sys/net/ipv4/conf/*/rp_filter 中的 f ;做迴聲 0 > $f ; 完畢 迴聲 0 > /proc/sys/net/ipv4/route/flush
**PS1:**簡而言之,
MASQUERADE
對於具有多個需要某種負載平衡或需要 DNAT 來處理傳入流量的多個外部 IP 的 NAT,它不起作用(在大多數情況下,而且肯定是在你的情況下)。你需要SNAT
方向控制。**PS2:**純 iptables 是不夠的。