我有一个运行Ubuntu 9.04的多链路多宿主服务器,其中eth0连接到外部网络,eth1连接到内部网络.外部网络呈现给“世界其他地方”,内部网络包含所有开发人员工作站和主力服务器.有一个防火墙阻止从“世界其他地方”到内部网络的流量,但不阻止传出请求.
$/sbin/ifconfig eth0 Link encap:Ethernet HWaddr 00:30:18:a5:62:63 inet addr:xxx.yyy.159.36 Bcast:xxx.yyy.159.47 Mask:255.255.255.240 [snip] eth1 Link encap:Ethernet HWaddr 00:02:b3:bd:03:29 inet addr:xxx.zzz.109.65 Bcast:xxx.zzz.109.255 Mask:255.255.255.0 [snip] $route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface xxx.yyy.159.32 0.0.0.0 255.255.255.240 U 0 0 0 eth0 xxx.zzz.109.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 0.0.0.0 xxx.yyy.159.33 0.0.0.0 UG 100 0 0 eth0
Apache正在侦听端口80,sshd正在侦听22:
$netstat --tcp -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:www *:* LISTEN tcp 0 0 *:ssh *:* LISTEN [snip]
从我在内部的开发机器xxx.zzz.109.40,我可以连接到内部地址,一切都很好.从外面我可以连接到外部地址,一切都像它应该的那样.
但是对于某些类型的测试,我想从我的开发机器连接到外部地址,但服务器拒绝连接请求.我猜它正在寻找它的路由表,因为传入的数据来自一个应该在eth1上的地址,但是它正在到达eth0,它正在丢弃它,可能是作为安全预防措施.
有没有办法可以放宽这个限制?
奇怪的是,这曾经在8.04上工作,但在8.10或9.04上不起作用,所以在去年的某个时候内核正在做一些额外的检查.为了使连接正常工作,返回路径需要与源路径相同,这意味着来自我的开发机器的消息到达eth0将不得不返回到eth0以便路由回我的机器.
这是一个图表,任何地方都没有NAT.
解决方法
# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
您也可以使用特定的接口名称而不是全部,并且还有一个默认值,这将影响新创建的接口.
从:
reverse path filter; it is a check to see if,for a packet arriving on an interface,a packet sent to the original packet’s source address would be sent out on that interface; if not,the arriving packet is dropped. it can be considered an attempt at detecting packets with spoofed source addresses.