我试图在同一个主机上运行两个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
我想configuration一个客户端路由通过一个别名和另一个客户端路由通过另一个。 到目前为止,我已经创build了客户端configuration文件,并告诉OpenVPN在启动/停止时调用一个向上和向下的脚本。
OpenVPN能够正常启动和停止,但我遇到了路由问题,可能是由于我自己的无知。 我有一个testing框,我正在使用连接到我的双客户端框,我已经把testing盒上的网关设置到以太网别名的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)
此外,我的服务器似乎没有正确configurationtun0设备 – 根据OpenVPN的日志文件,ifconfig被调用来设置tun0地址,但是当我运行ifconfig检查tun0设置时,没有分配IP地址。 我检查了日志,并没有指出任何问题。
客户端configuration文件如下所示:
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。 在发生冲突的情况下复制主路由表是否不可取?
你需要进一步详细说明你正在尝试做什么。 一个粗略的草图与主机的IP地址和你的路由表的列表将有助于很多了解你的问题。
我的服务器似乎没有正确configurationtun0设备
ifconfig命令可能失败 – 也许你应该检查日志并发布相关的摘录。
我想设置双机客户端,使网关设置为eth0:0的计算机通过一个OpenVPN隧道获得所有的通信量,而网关设置为eth0:1的计算机通过不同的路由OpenVPN隧道
ip rule add from $IP_ETH00 table us_table
这可能不是实现你真正想要的最好的方式 – 这对于不同的客户来说似乎是不同的路线。 尽pipe可以添加iptables -t mangle规则来标记不同标准的数据包,但是没有一套标准能够区分eth0:0和eth0:1作为input接口(这是由于IP混叠被执行)。
你可以做的是简单的build立类似的东西
ip rule add from <ip-of-your-client-for-the-us-table> table us_table
这将消除您的configuration中对IP别名的需求,因为根据源IP地址和目的IP地址进行路由决策,无论数据包来自哪个接口。
copy_routing_table "us_table"
你已经省略了copy_routing_table的来源 – 如果它做了我怀疑的事情,那么你最终将把你的整个主路由表放在us_table中。 如果你的主路由表已经包含可能与你在脚本中定义的内容相冲突的路由,那么最终可能会使用它们而不是新添加的路由。 这是特别的问题,因为你正在向上的脚本添加一个新的默认路由:
ip route add default via $4 table us_table
由于您的“主”表中已经有了一个默认路由,并且添加了另一个“通过$ 4”(这是错误的BTW,因为$ 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知道(通过评估接口networking掩码)你的主机与192.168.1.1位于同一个networking,所以你首先得到通知直接使用192.168.1.1。
如果两个OpenVPN服务器configuration正确,将必要的路由传递给客户端,那么你就不需要做任何事情。
我build议首先启动其中一个连接,然后检查它现在包含该服务器后面的networking路由的路由表。 然后启动另一个连接并再次检查。 如果缺less任何所需路由,请与系统pipe理员联系以获取OpenVPN服务器。 如果是你,请检查你的服务器configuration文件的推送命令。