NAT後使用iproute2進行路由

NAT後使用iproute2進行路由

在充當區域網路閘道的 Linux 系統中,我嘗試使用 iproute2 來路由流量。此外,在路由之前有必要執行NAT,因為Linux機器連接到允許網路連接的設備,並且它有2個IP位址172.16.61.1172.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 line1條路線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

發生的事情是

  1. 使用 192.168.1.150 作為 GW 的電腦,即本文的電腦對象,能夠連接到互聯網
  2. 除非刪除指令,否則我無法再連線到 GWip 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 eth4route 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,這通常就是您想要的。SNATeth4

其次,沒有任何理由進行基於表的路由(除非有您沒有解釋的其他詳細資訊)。因此,請忘記這些表,如果後面沒有 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

相關內容