目前,我正在努力解决以下情况:
- 我有一台服务器,在两个独立的 LAN 子网中有 2 个接口。IF1、IF2
- 我有一台笔记本电脑,它的 IP 地址来自第一个子网
- 当我尝试从这台特定的笔记本电脑连接到服务器的第二个 IP 地址时,我根本没有得到响应。
例如,当我尝试从 IP 为 172.31.190.129 的笔记本电脑 ping 172.31.196.185 时,我可以在 ens224 接口上的 tcpdump 中看到传入请求,但此后在任何其他接口上都没有响应请求。
这是我的网络图:
+-------------------------+
| |
| Laptop 172.31.190.129 +---------+
| | |
+-------------------------+ |
| +-------------------------+
| | |
+-----------+---------+ | Linux Server |
+----+ | | |
| | LAN 172.31.190.0/23 +-------+ IF1 - default gw |
+------+--+ | | | 172.31.190.63 |
+----------+ | | +---------------------+ | |
| Internet +---+ Gateway | | |
+----------+ | | +---------------------+ | |
+------+--+ | | | |
| | LAN 172.31.196.0/23 +-------+ IF2 |
+----+ | | 172.31.196.185 |
+---------------------+ | |
| |
| |
+-------------------------+
另外,我还有这个脚本:
IF1=ens160
IF2=ens224
P1_NET=172.31.190.0/23
P2_NET=172.31.196.0/23
IP1=172.31.190.63
IP2=172.31.196.185
P1=172.31.190.1
P2=172.31.196.1
ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2
ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
ip rule add from $P1_NET dev $IF1 table T1
ip rule add from $P2_NET dev $IF2 table T2
这是根据这个链接写的:https://lartc.org/howto/lartc.rpdb.multiple-links.html
在我的案例中,我尝试了许多不同的方法来实现基于策略的路由,但都没有成功......
答案1
总结
没有必要iptables,标记,也不能放松反向路径转发/过滤ip rule
。不要使用与传出数据包不匹配的 s ,而是使用LARTC 的文档您提供的链接:
ip rule add from $IP1 table T1 ip rule add from $IP2 table T2
那么一切都会顺利。
长版本
即使我们总是可以通过放松来让事情顺利进行反向路径转发/过滤例如使用sysctl -w net.ipv4.conf.all.rp_filter=2
等,从而允许非对称路由,因此应始终避免非对称路由。特别是考虑到网关(如果充当严格的状态防火墙)或笔记本电脑也可能因为类似的原因而不允许。使用iptables而用来纠正错误行为的标记肯定无助于理解已经很复杂的路由设置将如何运作。
虽然链接的文档使用服务器的 IP 作为源(对于 $IF2/ens224地址:172.31.196.185)无接口对于 ip 规则,您在规则中指定了传入接口(此处dev
表示iif
)。这就是问题所在:这并没有达到预期的效果。请iif
参阅ip rule
:
假如姓名
选择要匹配的传入设备。如果接口是环回接口,则规则仅匹配来自此主机的数据包。这意味着您可以为转发数据包和本地数据包创建单独的路由表,从而完全隔离它们。
虽然写得不太清楚,但反过来也是正确的:数据包起源来自此主机的将仅与环回接口匹配:它们将不匹配,iif ens160
也不会匹配iif ens224
,而只能匹配iif lo
(是iif
意味着传入接口并iif lo
匹配本地生成传出数据包,请考虑将其转换为“从本地系统传入 [朝向路由规则将指示的任何地方]”)。这确实很重要。
接下来会发生什么:
笔记本电脑尝试到达 $IP2(它不知道也不应该知道可以通过同一 LAN 上的服务器的 $IF1 和 $IP1 到达 $IP2),通过网关,
网关将数据包路由到属于 $P2_NET 的服务器的 $IP2,到其 $IF2 接口,
服务器在 $IF2 接口上接收到属于 $P1_NET(来自 172.31.190.129)的数据包,
服务器的严格反向路径
rp_filter=1
检查反向路线,如上所示,反向路线不匹配任何
iif
不同于iif lo
:两个新规则不匹配,因此唯一剩下的匹配规则是主路由表的规则:通过 $IF1,验证如下:# ip route get 172.31.190.129 from 172.31.196.185 172.31.190.129 from 172.31.196.185 dev ens160 uid 0 cache
反向路径未使用数据包到达的接口:数据包被丢弃。
出于同样的原因,当前设置将不允许从服务器当使用 $IP2: 时,它将再次不符合新规则,并尝试使用 $IF1 来实现这一点:
# ip route get 8.8.8.8 from 172.31.196.185
8.8.8.8 from 172.31.196.185 via 172.31.190.1 dev ens160 uid 0
cache
因此,一旦这两条规则被删除并更改为,如 LARTC 中所述:
ip rule add from $IP1 table T1 ip rule add from $IP2 table T2
那是:
# ip rule add from 172.31.190.63 table T1
# ip rule add from 172.31.196.185 table T2
一切都会正常工作,正如路线查找所显示的(现在使用table T2
):
# ip route get 172.31.190.129 from 172.31.196.185
172.31.190.129 from 172.31.196.185 via 172.31.196.1 dev ens224 table T2 uid 0
cache
# ip route get 8.8.8.8 from 172.31.196.185
8.8.8.8 from 172.31.196.185 via 172.31.196.1 dev ens224 table T2 uid 0
cache
这 3 种变体也可以起作用(为了简洁起见,仅将规则与表 T2 放在一起):
ip rule add from 172.31.196.0/23 table T2
ip rule add from 172.31.196.185 iif lo table T2
ip rule add from 172.31.196.0/23 iif lo table T2
请注意,如手册页中所述,iif lo
如果服务器还在其后面路由其他系统(同样,规则与这些系统不匹配):除非需要,否则最好不要使用它。
没有必要iptables并为此设置标记。使用标记更改接口可能会导致路由、ARP 请求和反向路径过滤方面的额外麻烦(使用标记通常需要放宽rp_过滤器),所以如果可以避免最好不要使用它们。