我有一网络服务器两个网卡在各个子网中192.168.188.x和192.168.198.x。该网络服务器连接到 2 个不同的路由器(192.168.188.1 和 192.168.198.1),并通过端口转发将端口 80 直接连接到互联网(每个路由器也有一个自己的公共 IP 地址)。
(external ip) Portforwarding:80 (external ip)
---[ROUTER]---- ---[ROUTER]----
192.168.188.1 Router internal IP 192.168.198.1
| |
| |
| |
| |
+------- 192.168.188.11:80 [WEBSERVER] 192.168.198.11:80 -------+
我喜欢在端口 80 上对服务器做出反应两个都子网。不幸的是,它在默认配置中仅对设置为默认网关的路由器做出响应,这在逻辑上是相当合理的。但我需要采取行动,将数据包发送回数据包来源的接口。如何实现这一点?除了路由器上的端口转发(例如 nat 等)之外,没有其他配置可能性,任何事情都需要在 Web 服务器上完成,即 debian stretch。
请记住,我大约 10 年只遇到一次网络问题,所以请简单一点。:)
答案1
答案2
该解决方案需要复杂的路由配置。
Web 服务器应该监听两个(
192.168.188.11
和192.168.198.11
)地址或0.0.0.0
地址,这意味着all addresses
。使用命令检查ss -tlnp sport == :80
。为每个创建单独的路由表腿:
ip route add 192.168.188.0/24 dev <iface1> table 1
ip route add 0/0 via 192.168.118.1 dev <iface1> table 1
ip route add 192.168.198.0/24 dev <iface2> table 2
ip route add 0/0 via 192.168.198.1 dev <iface2> table 2
- 配置路由规则,通过接收请求的同一接口路由回复:
ip rule add from 192.168.188.11 lookup 1 pref 1000
ip rule add from 192.168.198.11 lookup 2 pref 2000
- 故障排除:
- 使用
tcpdump -ni <iface> 'tcp port 80'
嗅探流量。至少你应该能看到来自外部的 http 请求。 - 检查路线要求带有
ip route get <dst> from <src> iif <iface>
。它应该显示local
路线。如果它显示其他内容,请检查rp_filter
withip netconf show dev <iface>
命令。它应该是off
或 模式loose
。 - 检查实际路线回复其中
ip route get <dst> from <src-address>
,目标地址是要求你已经看到了输出tcpdump
。 - 使用命令检查防火墙规则
iptables-save -c
。配置不需要任何额外的纳特规则!