我在配置自己的服务器时遇到了麻烦。它采用 Linux Ubuntu Server Edition 10.04 LTS 作为操作系统,配备两个 NIC(eth0 和 eth1)并使用 OpenVPN。
eth0 连接到交换机,该交换机连接到 3G 路由器(静态 IP:192.168.0.254),eth1 有时连接到(事先)未知的 LAN,并使用 DHCP 获取 IP 地址。这些接口中只有一个可以访问互联网,也就是说,如果将电缆插入 eth1,则需要关闭 3G 路由器*。
最终,我希望所有流量都使用连接到互联网的接口通过 VPN,而且所有到特定 IP 地址和端口(假设 192.168.45.1:8443)的流量都使用 eth1,无论如何。
在设置过程中,我首先集中精力于 3G 部分,拔掉 eth1,并设法使用 VPN 通过 eth0 与 VPN 中的其他服务器进行通信。
/etc/network/interfaces 如下所示:
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.254
auto eth1
iface eth1 inet dhcp
然后,我在 eth1 上插入一根以太网电缆,禁用 VPN 并关闭 3G 路由器。eth1 所连接的 LAN 有一个 DHCP 服务器 (192.168.0.254),并且恰好与连接到 eth0 (192.168.0.x) 的机器具有相同的 IP 范围。我绝不能保证这两个子网将来会有所不同。
服务器从 DHCP 服务器获取一个 IP(192.168.0.45),但我既无法 ping 它,也无法在 DHCP 服务器接口上的连接设备列表中看到该服务器。
在 /etc/network/interfaces 中注释掉网关行后,我可以 ping DHCP 服务器以及 LAN 中的任何其他服务器,但仍然无法反过来。此外,只有当我指定用于 ping 的接口时,它才有效:
ping 192.168.0.254
PING 192.168.0.254 (192.168.0.254) 56(84) bytes of data. From 192.168.0.100 icmp_seq=1 Destination Host Unreachable From 192.168.0.100 icmp_seq=3 Destination Host Unreachable From 192.168.0.100 icmp_seq=4 Destination Host Unreachable ^C --- 192.168.0.254 ping statistics --- 6 packets transmitted, 0 received, +3 errors, 100% packet loss, time 5007ms, pipe 3
ping 192.168.0.254 -I eth1
PING 192.168.0.254 (192.168.0.254) from 192.168.0.100 eth1: 56(84) bytes of data. 64 bytes from 192.168.0.254: icmp_seq=1 ttl=255 time=0.738 ms 64 bytes from 192.168.0.254: icmp_seq=2 ttl=255 time=0.832 ms 64 bytes from 192.168.0.254: icmp_seq=3 ttl=255 time=0.809 ms 64 bytes from 192.168.0.254: icmp_seq=4 ttl=255 time=0.795 ms --- 192.168.0.254 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2997ms rtt min/avg/max/mdev = 0.738/0.793/0.832/0.044 ms
我不知道为什么from 192.168.0.100
即使在 eth1 上 ping 时它仍然会说,因为这不是它的地址。
我读过有关 IP 策略路由的文章,它似乎是我最终实现目标的方法(其中包括强制流量通过 eth1 往返于特定 ip/端口)。如果我理解正确的话,导致无法从 LAN 中的任何其他计算机 ping 服务器的原因在于,如果这是默认路由,它会通过 eth0 返回整个流量?
然而,当查看输出时route
,我发现默认路由是在 eth1 上?
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 * 255.255.255.0 U 0 0 0 eth1
default 192.168.0.254 0.0.0.0 UG 100 0 0 eth1
我读了这个帖子并将其链接到其中,并尝试对其进行调整,以使进入 eth0 的所有流量都从 eth0 流出,eth1 也是如此:
ip route add default dev eth0 table 3G
ip route add default dev eth1 table LAN
ip rule add fwmark 0x1 table 3G
ip rule add fwmark 0x2 table LAN
iptables -A OUTPUT -t mangle -o eth0 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -o eth1 -j MARK --set-mark 2
但那不管用,之后我就无法再 ping DHCP 服务器了。我想我误解了它的工作原理...
我应该怎么办?
另外,我暂时忽略了 VPN 部分,但我有点担心它不会像我坦率预期的那样工作。路由和 VPN 如何交互?我需要确保如果 eth1 未连接,则无法解析强制所有流量通过 eth1 往返特定 ip/路由的路由。
非常感谢您的帮助。如果需要,我很乐意提供任何其他信息。如果这个问题已经在其他地方得到解答,我没有找到(或者太基础了),请原谅。
*如果我可以配置,当插入电缆时,除往返于 IP 地址子集之外的所有流量都将通过 eth1,那就更好了。
編輯>
eth0 现在位于子网 10.13.37.0/255.255.255.248 上,并且服务器的 ip 为 10.13.37.2。
现在所有流量都通过 VPN,但我希望到 192.168.45.1(192.168.45.0/24 是 OpenVPN 子网)端口 443 的流量在仍然使用 VPN 传输时仅使用 eth1(因此如果不存在连接则无法访问),而到 192.168.45.1 端口 8443 的流量仅使用 eth0。这可能吗?
ip route add default dev eth0 table 3G
ip route add default dev eth1 table LAN
ip rule add fwmark 0x1 table 3G
ip rule add fwmark 0x2 table LAN
iptables -A OUTPUT -t mangle -o eth0 --dst 192.168.45.1 --dport 8443 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -o eth1 --dst 192.168.45.1 --dport 443 -j MARK --set-mark 2
但是使用 iptraf,我可以看到,在 443 或 8443 上执行 wget 操作时,只使用 eth1。
谢谢!
答案1
您确定插入了正确的电缆吗?看起来您将 192.168.0.x lan 的电缆插入了 eth1 而不是 eth0。
如果不是,您是否尝试过拔掉两根电缆,然后尝试只插入一根电缆进行 ping?例如:
- 拔掉两者
- 将 3G 线插入 eth0 并 ping 192.168.0.254
- 再次拔掉电源
- 将网线插入 eth1
- 运行:ifconfig eth1 down
- 运行:ifconfig eth1 up
- 运行:ifconfig eth1 并查看 IP
顺便说一句,更改一个 LAN 设置!如果您无法更改 eth1 lan 配置,请使用 3G 路由器将 eth0 从 192.168.0.x 更改为 192.168.1.x(针对该 LAN 中的所有计算机),否则您将始终遇到同一 ip lan 的问题。