在我的办公室网络上,我有两个互联网连接和一个运行网站(端口 443 上的 HTTPS)的 CentOS 服务器。该网站应该可以通过第一个互联网连接(ISP-1)的公共 IP 公开访问。另一个互联网连接 ISP-2 是网络上的默认网关。两个互联网连接都有路由器(家用型),带有 NAT、SPI 防火墙等。ISP-2 上的路由器是带有原始固件的 Netgear WNDR3700(又名 N600)。
问题是该网站无法访问。看起来 ISP-1 上的传入流量将到达服务器,但返回流量通过 ISP-2 路由,这实际上使该网站无法访问。据我所知,我无法在 WNDR3700 上进行基于端口的路由。
我有什么选择可以实现这个功能?我一直在考虑在服务器本身上实现基于 iptables / 路由的解决方案,但无法实现。
更新:请注意,服务器有一个网络接口将其连接到两个路由器。
答案1
如果我理解正确的话,您希望您的 Web 服务器通常使用 ISP-2 作为其传出流量的默认网关,但对外部 Web 请求的响应除外,这些请求必须通过 ISP-1 传输。以下是使用策略路由的解决方案的草图:
echo "101 webtraffic" >> /etc/iproute2/rt_tables
ip route add default table webtraffic via $ISP1_GW_LAN_IP
ip rule add fwmark 1 table webtraffic
iptables -t mangle -A OUTPUT -d \! $LAN_NET_PREFIX \
-p tcp -m tcp --sport 443 \
-j MARK --set-mark 1
在哪里:
LAN_NET_PREFIX
是您的 LAN 的网络前缀(例如 192.168.100.0/24),并且ISP1_GW_LAN_IP
是您的网关至 ISP-1 的 LAN IP 地址(例如 192.168.100.100)。
第一个ip
命令将表中的默认路由设置webtraffic
为您的 ISP-1 网关,第二个命令确保标记的数据包1
使用该表进行路由webtraffic
。最后,iptables
规则标记适当的传出数据包,确保它们的下一跳将朝向 ISP-1。
iptables
以下是使用实验模块 ROUTE 目标的替代解决方案:
iptables -t mangle -A POSTROUTING -d \! $LAN_NET_PREFIX \
-p tcp -m tcp --sport 443 \
-j ROUTE --gw $ISP1_GW_LAN_IP
此规则将覆盖传出 Web 响应数据包的路由决策,将它们发送到您的 ISP-1 网关,而不是默认的 ISP-2。所有其他流量(包括对 LAN 上客户端的 Web 响应)都不会受到影响。正如评论中指出的那样,ROUTE 目标很可能不会在任何未将其明确修补到内核的系统上实现,因为它是实验性的。
答案2
我遇到了同样的问题,但我只用 iproute2(源路由)就解决了。无需使用 iptables 进行标记:
echo "101 webtraffic" >> /etc/iproute2/rt_tables
ip route add default table webtraffic via $ISP1_GW_LAN_IP
ip rule add from $ISP1_IP table webtraffic
重点是,不仅 Web 可以使用 ISP1 连接。您可以选择。这很好,因为如果某个连接失败,您可以从两个连接通过 ssh 连接到服务器。作为 CentOS 用户,我创建了以下文件,以便重启后我的更改不会丢失:
echo "default table webtraffic via $ISP1_GW_LAN_IP" >> /etc/sysconfig/network-scripts/route-eth1
echo "from $ISP1_IP table webtraffic" >> /etc/sysconfig/network-scripts/rule-eth1
答案3
这称为异步路由。您必须将 Web 服务器的默认网关指向 ISP-1 上的路由器的 IP 地址。如果访问 Web 服务器的客户端来自同一 IP,则可以在不更改默认网关的情况下路由此 IP,或者,您可以在 ISP1 网关上实施 NAT 以充当反向代理,然后在 Web 服务器上路由它。谢谢。
答案4
假设您的 Web 服务器与您的工作站位于同一子网,为什么不设置拆分 DNS,以便 yourwebsite.com 在内部解析为其内部 IP 地址?这肯定比复杂的异步路由要好。
此外,投资一个可以支持多个 WAN 连接的路由器将使您的生活变得轻松很多(并允许您在两个 Internet 连接之间进行负载平衡/故障转移)。