我正在尝试在同一台主机上运行两个 openvpn 客户端(我们称之为双客户端盒),连接到两个不同的 openvpn 服务器。我的双客户端盒运行的是 Ubuntu 10.04,并且我在接口文件中设置了两个以太网别名。
我想设置双客户端盒,以便网关设置为 eth0:0 的计算机将其所有流量路由到一个 OpenVPN 隧道,而网关设置为 eth0:1 的计算机将其所有流量路由到另一个 OpenVPN 隧道。最终,我希望能够让多台计算机连接到我的双客户端盒,共享该 OpenVPN 隧道(但彼此不知道)。
摘自我的 /etc/network/interface 文件:
iface eth0:0 inet static
address 192.168.1.242
netmask 255.255.255.0
broadcast 192.168.1.255
network 192.168.1.1
iface eth0:1 inet static
address 192.168.1.243
netmask 255.255.255.0
broadcast 192.168.1.255
network 192.168.1.1
我想配置一个客户端通过一个别名路由,另一个客户端通过另一个别名路由。到目前为止,我已经创建了客户端配置文件,并告诉 OpenVPN 在启动/停止时调用启动和停止脚本。
OpenVPN 能够正常启动和停止,但我遇到了路由问题,这可能是由于我自己的无知造成的。我有一个测试盒,用于连接到我的双客户端盒,并且我已将测试盒上的网关设置为以太网别名的 IP。我能够通过双客户端盒 ping 东西,但我的 ping 路由很奇怪 - 通过双盒上的主网关而不是通过 OpenVPN 隧道。
root@test-box:~# ping yahoo.com
PING yahoo.com (98.137.149.56) 56(84) bytes of data.
64 bytes from ir1.fp.vip.sp2.yahoo.com (98.137.149.56): icmp_seq=1 ttl=49 time=413 ms
From 192.168.1.133: icmp_seq=2 Redirect Host(New nexthop: 192.168.1.1)
此外,我的服务器似乎没有正确配置 tun0 设备 - 根据 OpenVPN 的日志文件,调用 ifconfig 来设置 tun0 地址,但当我运行 ifconfig 检查 tun0 设置时,没有分配 IP 地址。我检查了日志,它们没有显示任何问题。
客户端配置文件如下所示:
client
dev tun0
proto tcp
remote xxx.xxx.xxx.xxx 1000
resolv-retry infinite
nobind
persist-key
tls-client
tls-remote server
ns-cert-type server
tls-auth ta.key 1
cert acertificate.crt
key akey.key
ca ca.crt
comp-lzo
verb 3
auth-user-pass afile
log-append /var/log/openvpn/openvpn.log
script-security 3 system
up "/etc/openvpn/tun-up-us.sh"
down "/etc/openvpn/tun-down-us.sh"
我的脚本如下所示:
# OpenVPN up script for US
#!/bin/bash
. /usr/local/common/copy-routing-table.sh
# following are the shared variables passed by openvpn
# tun1 1500 1544 10.26.0.2 255.255.255.0 init
# Grab the IP address for the eth0:0 alias
IP_ETH00=$(ifconfig eth0:0 | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}')
# Set up routing
copy_routing_table "us_table"
ip route add 10.26.0.0/16 dev eth0:0 src $IP_ETH00 table us_table
ip route add default via $4 table us_table
ip route add 10.26.0.0/16 dev eth0:0 src $IP_ETH00
ip rule add from $IP_ETH00/32 table us_table
ip rule add to $IP_ETH00/32 table us_table
ip route flush cache
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
copy-routing-table.sh 将主路由表条目复制到 us_table。如果发生冲突,复制主路由表是否不可取?
答案1
您需要进一步详细说明您正在尝试做什么。粗略地列出所涉及的主机的 IP 地址和路由表列表将有助于理解您的问题。
我的服务器似乎没有正确配置 tun0 设备
ifconfig 命令可能会失败 - 也许您应该检查日志并发布相关摘录。
我想设置双客户端盒,使得网关设置为 eth0:0 的计算机的所有流量都通过一个 OpenVPN 隧道路由,而网关设置为 eth0:1 的计算机的所有流量都通过另一个 OpenVPN 隧道路由
ip rule add from $IP_ETH00 table us_table
这可能不是实现您真正想要的东西的最佳方式——这似乎是为不同的客户端提供不同的路由。虽然可以添加iptables -t mangle
规则来为不同的标准标记数据包,但没有一套标准能够区分 eth0:0 和 eth0:1 作为输入接口(这是由于 IP 别名的实现方式)。
你能但是要做的只是设置类似
ip rule add from <ip-of-your-client-for-the-us-table> table us_table
这将完全消除您配置中对 IP 别名的需要,因为路由决策将基于源和目标 IP 地址完成,无论数据包从哪个接口进入。
copy_routing_table "us_table"
您忽略了 copy_routing_table 的来源 - 如果它像我怀疑的那样,您最终会在 us_table 中得到整个主路由表。如果您的主路由表已经包含可能与您在脚本中定义的路由相冲突的路由,您可能最终会使用它们而不是新添加的路由。这尤其令人担忧,因为您正在 up-script 中添加新的默认路由:
ip route add default via $4 table us_table
由于您的“主”表中已经有默认路由,因此请添加另一个“via $4”路由(顺便说一句,这是错误的,因为 $4 代表路由器自己的 tun 接口的本地 IP 地址 - 您应该改用“dev $1”)而不删除旧路由。您应该ip route del default table us_table
在此处添加 - 并且可能对您添加的其他路由也添加类似内容。
还有这个:
From 192.168.1.133: icmp_seq=2 Redirect Host(New nexthop: 192.168.1.1)
是来自 192.168.1.133 的消息,它正在获取发往 98.137.149.56 (yahoo.com) 的数据包,并通过 192.168.1.1 将其路由出去。由于 192.168.1.133 知道(通过评估接口网络掩码)您的主机与 192.168.1.1 位于同一网络中,因此您首先会收到通知,直接使用 192.168.1.1。
答案2
如果两个 OpenVPN 服务器配置正确,可以向客户端推送必要的路由,那么您不需要做任何事情。
我建议先启动其中一个连接,然后检查路由表,确认它现在包含该服务器后面的网络的路由。然后启动另一个连接并再次检查。如果缺少任何必需的路由,请与 OpenVPN 服务器的系统管理员联系。如果是您,请检查服务器配置文件中的推送命令。