我正在使用基于 Linux 的路由器设备(名为 Zeroshell),但这应该是与通用 Linux 路由相关的问题。
路由器计算机有 4 个网卡,分别命名为 ETH0 至 ETH3。
- ETH0在实际LAN上(子网192.168.241.0/24)IP 192.168.241.254
- ETH1 位于 WAN 连接路由器(子网 192.168.1.0/24)IP 192.168.1.1,GW 192.168.1.254
- ETH2位于另一个WAN连接路由器(子网192.168.2.0/24)IP 192.168.2.1,GW 192.168.2.254
- ETH3位于另一个专用于访客的LAN上(子网192.168.230.0/24)IP 192.168.230.254
路由器上的默认网关设置为 192.168.2.254,因此所有传出流量都使用第二个 WAN 连接(光纤),并且 ETH1 和 ETH2 上都启用了 NAT。
在第一个 WAN 路由器上,192.168.1.1 设置为 DMZ。在第二个 WAN 路由器上,192.168.2.1 设置为 DMZ。
我在 ETH1 和 ETH2 上的端口 80 上设置了一些端口转发到位于 ETH0 子网中的计算机。
当使用浏览器连接到第二个 WAN 的公共 IP 时,我得到了托管在内部计算机上的网站。
使用浏览器连接到第一个 WAN 的公共 IP 时,连接保持卡住状态。
我很确定这必须处理设置为第二个 WAN 路由器的默认网关,使所有流量都流向他,即使它源自第一个 WAN 路由器。
所以我的问题是:我应该如何配置路由器上的路由表,以便它可以处理来自两个 WAN 的传入连接,将它们转发到相关的 LAN 计算机并将答案路由到正确的 WAN?
编辑:
从网络服务器添加路由表:
root@webserver:/# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:f1:03:10 brd ff:ff:ff:ff:ff:ff
inet 192.168.241.23/24 brd 192.168.241.255 scope global eth0
valid_lft forever preferred_lft forever
root@webserver:/# ip route show
default via 192.168.241.254 dev eth0
10.8.0.0/24 via 192.168.241.21 dev eth0
192.168.240.0/24 via 192.168.241.21 dev eth0
192.168.241.0/24 dev eth0 proto kernel scope link src 192.168.241.23
从路由器添加路由表:
root@rtr ~> ip addr show
1: lo: <LOOPBACK,UP,10000> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
3: ETH00: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc mq qlen 1000
link/ether 00:15:5d:f1:05:08 brd ff:ff:ff:ff:ff:ff
inet 192.168.230.254/24 brd 192.168.230.255 scope global ETH00:00
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fef1:508/64 scope link
valid_lft forever preferred_lft forever
4: ETH01: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc mq qlen 1000
link/ether 00:15:5d:f1:05:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.1/24 brd 192.168.2.255 scope global ETH01:00
valid_lft forever preferred_lft forever
inet6 2a01:e35:2e74:9560:215:5dff:fef1:509/64 scope global dynamic
valid_lft 86156sec preferred_lft 86156sec
inet6 fe80::215:5dff:fef1:509/64 scope link
valid_lft forever preferred_lft forever
5: ETH02: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc mq qlen 1000
link/ether 00:15:5d:f1:05:0b brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 brd 192.168.1.255 scope global ETH02:00
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fef1:50b/64 scope link
valid_lft forever preferred_lft forever
6: ETH03: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc mq qlen 1000
link/ether 00:15:5d:f1:05:0c brd ff:ff:ff:ff:ff:ff
inet 192.168.241.254/24 brd 192.168.241.255 scope global ETH03:00
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fef1:50c/64 scope link
valid_lft forever preferred_lft forever
7: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noqueue
link/ether 9e:3d:6a:0e:65:39 brd ff:ff:ff:ff:ff:ff
inet 192.168.141.142/24 brd 192.168.141.255 scope global dummy0
valid_lft forever preferred_lft forever
8: dummy1: <BROADCAST,NOARP,UP,10000> mtu 1500 qdisc noqueue
link/ether ee:6e:6f:33:32:34 brd ff:ff:ff:ff:ff:ff
inet 192.168.142.142/32 brd 192.168.142.255 scope global dummy1
valid_lft forever preferred_lft forever
inet6 fe80::ec6e:6fff:fe33:3234/64 scope link
valid_lft forever preferred_lft forever
9: DEFAULTBR: <BROADCAST,MULTICAST> mtu 1500 qdisc noop
link/ether 0a:61:ef:f2:09:80 brd ff:ff:ff:ff:ff:ff
10: VPN99: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 10 0
link/ether 1a:e8:0e:ee:78:aa brd ff:ff:ff:ff:ff:ff
inet 192.168.250.254/24 brd 192.168.250.255 scope global VPN99:00
valid_lft forever preferred_lft forever
11: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether 8e:65:6c:3d:76:e5 brd ff:ff:ff:ff:ff:ff
12: bond1: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether 1e:34:34:54:8d:48 brd ff:ff:ff:ff:ff:ff
13: bond2: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether 5a:bc:4c:86:83:dc brd ff:ff:ff:ff:ff:ff
14: bond3: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether 6e:81:53:3e:0a:ff brd ff:ff:ff:ff:ff:ff
15: bond4: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether 6a:35:c8:45:d1:ff brd ff:ff:ff:ff:ff:ff
16: bond5: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether ca:5d:10:21:02:30 brd ff:ff:ff:ff:ff:ff
17: bond6: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether 82:60:85:97:d4:90 brd ff:ff:ff:ff:ff:ff
18: bond7: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether b6:fc:c9:a5:06:73 brd ff:ff:ff:ff:ff:ff
19: bond8: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether ce:75:5d:e5:7d:69 brd ff:ff:ff:ff:ff:ff
20: bond9: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
link/ether 2e:ef:1e:89:26:1b brd ff:ff:ff:ff:ff:ff
root@rtr ~> ip route show
default via 192.168.1.254 dev ETH02
192.168.1.0/24 dev ETH02 proto kernel scope link src 192.168.1.1
192.168.2.0/24 dev ETH01 proto kernel scope link src 192.168.2.1
192.168.230.0/24 dev ETH00 proto kernel scope link src 192.168.230.254
192.168.240.0/24 via 192.168.241.21 dev ETH03
192.168.241.0/24 dev ETH03 proto kernel scope link src 192.168.241.254
192.168.250.0/24 dev VPN99 proto kernel scope link src 192.168.250.254
答案1
这种双宿主设置的问题在于,来自 ETH0 网络上的 Web 服务器的返回数据包遵循默认网关,这仅适用于通过该接口传入的连接。我自己也遇到过这个。
我使用的解决方案是向 ETH0 网络上的网络服务器添加一个额外的 IP 地址(我假设为 192.168.241.24),并将其用作通过第二个 WAN 接口传入的连接的 DNAT 目标。然后添加一条路由规则,使第二个 IP 地址通过第二个 WAN 接口路由出去。
您需要了解一些有关 Linux 基于策略的路由的知识。做ip rule show
:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
当您这样做时,ip route show
您将默认显示“主”表。您可以通过添加 来显示其他表之一table $name
,例如:
$ ip route show table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 192.168.0.0 dev eth0 proto kernel scope link src 192.168.1.27
local 192.168.1.27 dev eth0 proto kernel scope host src 192.168.1.27
broadcast 192.168.1.255 dev eth0 proto kernel scope link src 192.168.1.27
您可以添加自己的表格;编辑/etc/iproute2/rt_tables
并添加两行:
11 WAN1
12 WAN2
现在您可以将 ETH01 和 ETH02 上的默认路由添加到各自的表中:
# ip route add default via 192.168.2.254 table WAN1
# ip route add default via 192.168.1.254 table WAN2
(您首先将 ETH01 描述为具有 192.168.1.254 作为网关,而 ETH02 具有 192.168.2.254,但随后您的ip route show
输出不一致,所以我选择后者......除了 ETH1 / ETH01 差异之外。)
现在您需要添加一条规则,以使用 WAN1 表处理来自第二个 Web 服务器 IP 地址的流量:
# ip rule add from 192.168.241.24 lookup WAN1 prio 1000
现在,当流量从 ETH01 传入并通过 DNAT 发送到网络服务器的第二个 IP 地址时,网络服务器将从该地址返回数据包,并且规则将匹配该地址并通过 ETH01 发送返回流量。
在这种情况下,您实际上并不需要 WAN2 表,但是如果路由器系统本身需要从两个 WAN 接口进行访问,或者如果您希望能够选择用于任何用途的 WAN 接口,那么拥有它会很有用。