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 作为网关的 PC(即本文中的 PC 对象)可以连接到互联网
  2. 我无法再连接到 GW,除非我删除该指令ip rule add from 192.168.1.0/24 pref 15000 table route61

通过后路由,来自 192.168.1.0/24 的数据包不应该假设 172.16.61.2 作为源地址?

如果我使用或删除默认GW使用route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4ORroute 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!

如果我删除默认 GW,route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4则仅当我指定源 ip 时,nc 才会连接:

nc -v 216.58.205.78 443 -s 172.16.61.2

答案1

如果我理解正确的话,您有192.168.1.0/24eth3并且您想要将其路由和 NAT 到后面的某个东西eth4,但未指定后面到底是什么eth4,是否执行 DHCP,以及是否需要静态地址。

(通常的情况是,您后面有某种路由器eth4,它运行 DHCP 并给出地址)。

首先,实现此目的的通常方法是启用转发并执行

iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

$EXTIF您的外部接口 ( ) 在哪里eth4MASQUERADESNAT上的任何地址eth4,因此这可以抵御地址重新分配。如果您不提及协议,则所有内容都会被 NAT,这通常是您想要的。

其次,没有任何理由进行基于表的路由(除非有您未解释的其他细节)。因此,忘记这些表吧,如果没有 DHCP 来eth4分发默认路由的网关信息,只需执行

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如果问题出在策略路由上:你想通过表中的默认路由来路由来自的传出数据包route61,那么你需要这样做

ip rule add from 192.168.1.0/24 pref 15000 table route61

并不是from 172.16.61.0/24

尽管如此,我实际上并不清楚 NAT 如何与策略路由交互。我认为返回的数据包首先被去NAT,然后主表中的规则将正确地路由它们,但我自己从未尝试过这样做。

进行调试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

相关内容