在充當區域網路閘道的 Linux 系統中,我嘗試使用 iproute2 來路由流量。此外,在路由之前有必要執行NAT,因為Linux機器連接到允許網路連接的設備,並且它有2個IP位址172.16.61.1
和172.16.62.100
我有 2 張網路卡,配置如下:
DEVICE=eth3
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=192.168.1.150
USERCTL=no
IPV6INIT=no
PEERDNS=yes
DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes
GATEWAY=172.16.61.1
我使用以下指令透過 iptables 進行 ip 轉換
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -j SNAT --to-source 172.16.61.2
使用上述配置,所有屬於 192.168.1.0/24 網路且以 192.168.1.150 作為網關的電腦都能夠連接到網際網路。
如果我嘗試使用 iproute2 設定網關,那麼我會從 eth4 中刪除預設網關,該網關採用以下配置:
DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes
我執行了以下步驟:
1. In /etc/iproute2/rt_tables I have added the line
1條路線61
2. /sbin/ip route add 172.16.61.0/24 via 172.16.61.1 table route61 proto static
3. /sbin/ip route add default via 172.16.61.1 table route61 proto static
4. /sbin/ip rule add from 172.16.61.0/24 pref 15000 table route61
的輸出/sbin/ip route show table route61
是
172.16.61.0/24 via 172.16.61.1 dev eth4 proto static
default via 172.16.61.1 dev eth4 proto static
的輸出/sbin/ip rule show
是
0: from all lookup local
15000: from 172.16.61.0/24 lookup route61
32766: from all lookup main
32767: from all lookup default
但在這種情況下它不起作用,我錯了什麼?
我也嘗試使用/etc/sysconfig/network-scripts/ifup-routes eth4
沒有成功
我需要的是理解為什麼我無法讓「基於表的路由」工作,因為我必須在具有多個網關的上下文中使用它
更新
為了嘗試 dirkt 的建議,我刪除了預設網關
route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
我用過:
ip rule add from 192.168.1.0/24 pref 15000 table route61
發生的事情是
- 使用 192.168.1.150 作為 GW 的電腦,即本文的電腦對象,能夠連接到互聯網
- 除非刪除指令,否則我無法再連線到 GW
ip rule add from 192.168.1.0/24 pref 15000 table route61
透過後路由,來自 192.168.1.0/24 的封包不應假定 172.16.61.2 作為來源位址?
如果我使用 OR 使用或刪除預設 GW,route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
我route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
會這樣做:
ip route get 216.58.205.78 from 192.168.1.5
我有RTNETLINK answers: Invalid argument
如果我使用ip route get 216.58.205.78 from 172.16.61.2
我有216.58.205.78 from 172.16.61.2 via 172.16.61.1 dev eth4
route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
如果我這樣做之後:
nc -v 216.58.205.78 443
我有
Connection to 216.58.205.78 443 port [tcp/https] succeeded!
route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
如果我僅在指定來源 ip 時刪除預設 GW nc 連線:
nc -v 216.58.205.78 443 -s 172.16.61.2
答案1
如果我理解正確的話,你已經192.168.1.0/24
打開了eth3
,並且你想要將其路由和 NAT 到後面的某個東西eth4
,如果未指定後面到底是什麼eth4
,它是否支援 DHCP,以及是否需要靜態位址。
(通常情況是您後面有某種路由器eth4
,它運行 DHCP,並給出地址)。
因此,首先,實現這一目標的通常方法是啟用轉發並執行
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
$EXTIF
您的外部介面在哪裡( eth4
)。與恰好位於 上的任何位址相關MASQUERADE
,因此這對於位址重新分配具有彈性。如果您不提及協議,那麼所有內容都會經過 NAT,這通常就是您想要的。SNAT
eth4
其次,沒有任何理由進行基於表的路由(除非有您沒有解釋的其他詳細資訊)。因此,請忘記這些表,如果後面沒有 DHCPeth4
來分發預設路由的網關訊息,只需執行以下操作即可
ip route default via 172.16.61.1
假設eth4
已經在 中獲得了一個位址172.16.61.*/24
,這就足夠了(172.16.61.0/24
當您設定 ip 位址時,路由就會被設定)。
但最好的事情是把它留給 DHCP,如果它在你的路由器上啟用的話(我想那就是BOOTPROTO=dhcp
,如果是 Red Hat)。
192.168.1.0/24
如果問題是策略路由:您希望透過 table 中的預設路由路由傳入的傳出封包route61
,因此您需要執行下列操作
ip rule add from 192.168.1.0/24 pref 15000 table route61
並不是from 172.16.61.0/24
。
也就是說,我實際上不確定 NAT 如何與策略路由互動。 ID認為返回的資料包首先被 deNATed,然後主表中的規則將正確路由它們,但我自己從未嘗試過。
調試ip route get X.X.X.X from Y.Y.Y.Y
可能會有所幫助,tcpdump
就像您在提到的其他問題中所做的那樣,在兩個介面上都會有所幫助。
在沒有表格的情況下首先嘗試這個也會更容易。一旦成功,您就知道沒有其他事情會妨礙您,並且您可以嘗試使用表格。
答案2
使用新的路由表,您必須新增甚至連接的路由:172.16.61.0/24 via 172.16.61.1 dev eth4 proto static
應該proto scope link
使用指定的來源IP來代替,並且您錯過了192.168.1.0/24路由路由決定在輸出/後路由nat之前執行,因此ip rule add from
應該使用原始來源IP 。
# Configure tables
echo '2 table61' >> /etc/iproute2/rt_tables
echo '3 table62' >> /etc/iproute2/rt_tables
# routing decision is performed before output / post routing nat
ip rule add from 192.168.1.5 lookup table62
ip rule add from 192.168.1.0/24 lookup table61
ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table61
ip route add 172.16.61.0/24 dev eth4 proto kernel scope link src 172.16.61.2 table table61
ip route add default via 172.16.61.1 table table61
ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table62
ip route add 172.16.62.0/24 dev eth4 proto kernel scope link src 172.16.62.100 table table62
ip route add default via 172.16.62.254 table table62
另外,我可能已經把你的問題混在腦子裡了,如果它不能立即起作用,你能在你的問題中添加以下內容嗎?
ip a
ip r show table table61
ip r show table table62
ip rule show
iptables -L -n -v
iptables -t nat -L -n -v