在作为局域网网关的 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 作为网关的 PC(即本文中的 PC 对象)可以连接到互联网
- 我无法再连接到 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 eth4
ORroute 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/24
,eth3
并且您想要将其路由和 NAT 到后面的某个东西eth4
,但未指定后面到底是什么eth4
,是否执行 DHCP,以及是否需要静态地址。
(通常的情况是,您后面有某种路由器eth4
,它运行 DHCP 并给出地址)。
首先,实现此目的的通常方法是启用转发并执行
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
$EXTIF
您的外部接口 ( ) 在哪里eth4
。MASQUERADE
是SNAT
上的任何地址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