我已经连接到两个 ISP 并向他们公布了我自己的 IP 空间 (/24 IPv4),因此这两个 ISP 都将发往我子网的流量路由到我的路由器(一个 Linux 服务器)。
两个 ISP 连接到 Linux 路由器上的不同接口,假设eth0
和eth1
。
现在,当我尝试访问ping
某个地址时,我得到的只是请求超时。但是,通过执行tcpdump
,我可以看到远程计算机的回复,但不是在 Linux 路由器发送请求的同一接口上。(即从 发送eth0
,在 上得到回复eth1
):
eth0:
17:11:26.136885 IP tky01.jp.nat.moe > syr.edu: ICMP echo request, id 22910, seq 1, length 64
17:11:27.139627 IP tky01.jp.nat.moe > syr.edu: ICMP echo request, id 22910, seq 2, length 64
17:11:28.163632 IP tky01.jp.nat.moe > syr.edu: ICMP echo request, id 22910, seq 3, length 64
17:11:29.187715 IP tky01.jp.nat.moe > syr.edu: ICMP echo request, id 22910, seq 4, length 64
17:11:30.211766 IP tky01.jp.nat.moe > syr.edu: ICMP echo request, id 22910, seq 5, length 64
eth1:
17:11:26.314683 IP syr.edu > tky01.jp.nat.moe: ICMP echo reply, id 22910, seq 1, length 64
17:11:27.317398 IP syr.edu > tky01.jp.nat.moe: ICMP echo reply, id 22910, seq 2, length 64
17:11:28.341461 IP syr.edu > tky01.jp.nat.moe: ICMP echo reply, id 22910, seq 3, length 64
17:11:29.365671 IP syr.edu > tky01.jp.nat.moe: ICMP echo reply, id 22910, seq 4, length 64
17:11:30.389885 IP syr.edu > tky01.jp.nat.moe: ICMP echo reply, id 22910, seq 5, length 64
我尝试做策略路由:
ip rule add from x.x.x.x/24 lookup isp2 # where x.x.x.x is my subnet.
ip route add default via y.y.y.y dev eth1 table isp2 # where y.y.y.y is ISP2's gateway
这样可以ping
正常运行,但是现在任何选择使用 ISP1(eth0)进入我的 AS 的用户都将无法访问任何内容。
我如何让 Linux 知道这两者eth0
并eth1
能回复请求?
答案1
我刚刚明白了。rp_filter
需要禁用才能允许从不同路径回复:
for iface in eth{0,1}; do echo 0 > /proc/sys/net/ipv4/conf/$iface/rp_filter; done
为了使其永久生效,请net.ipv4.conf.<iface>.rp_filter = 0
在 sysctl 中设置。