在一台linux机器上同时运行多个openvpn客户端
服务端配置,如下
port 1194
proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpnserver.crt
key /etc/openvpn/keys/vpnserver.key
dh /etc/openvpn/keys/dh1024.pem
server 172.16.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 172.16.0.0 255.255.255.0"
client-config-dir /etc/openvpn/ccd
client-to-client
keepalive 10 120
comp-lzo
user root
group root
persist-key
persist-tun
status openvpn-status.log
verb 3
为客户端制作了证书1.crt 1.key和2.crt 2.key
客户端配置如下(有两份,证书文件分别为1.*和2.*)
client
dev tun
proto tcp
remote 10.0.0.200 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert 1.crt
key 1.key
comp-lzo
verb 3
在同一台linux上运行这两个个openvpn客户端 ,都连接同一个openvpn服务端
启动之后,两个openvpn客户端都能正常启动
运行ifconfig,可以看到tun0和tun1
从客户端ping服务端( ping 172.16.0.1 ) 成功
这两个客户端分别获得ip 172.16.0.9 和 172.16.0.13
tun0 : client: 172.16.0.9<=>172.16.0.10 server: 172.16.0.1
tun1 : client 172.16.0.13<=>172.16.0.14 server: 172.16.0.1
从vpn服务端ping 172.16.0.9 成功,ping 172.16.0.13 不通
(后来发现,实际是172.16.0.9和172.16.0.13只能有一个通,至于是哪一个通,取决于路有表里谁的规则靠前)
检查不通的原因
两个通道的tunnel服务器的ip都是172.16.0.1
ping 172.16.0.1,是通过tun0,tun1不会通过
从服务端ping 172.16.0.9,从服务器到客户端的包是从tun0过来,回去也是走tun0,正常
从服务端ping 172.16.0.13,从服务器到客户端的包是从tun1过来,回去是走tun0,不正常
为了解决这个问题:
方案1:改造openvpn,(2.0.9)
multi.c(1634)
/* make sure that source address is associated with this client */
else if (multi_get_instance_by_virtual_addr (m, &src, true) != m->pending)
{
msg (D_MULTI_DROPPED, "MULTI: bad source address from client [%s], packet dropped",
mroute_addr_print (&src, &gc));
c->c2.to_tun.len = 0;
}
注释掉这一段,重新编译,替换服务端的openvpn后,发现两个通道都正常
但是这个解决方案不太好
1.改造了第三方的工具,以后升级的时候还得再次改动
2.可能导致其他不可预知的问题,因为并没有通过仔细的调查研究
3.同样配置的通道服务端在不同的机器(就是tun0连接server0, tun1连接server1,但是两个vpnserver配置一样)上就会有问题
方案2:更改路由规则
ip route add 172.16.0.0/8 via 172.16.0.10 table 2
ip rule add from 172.16.0.9/32 to 172.16.0.0/8 table 2 pref 1500
ip route add 172.16.0.0/8 via 172.16.0.14 table 3
ip rule add from 172.16.0.13/32 to 172.16.0.0/8 table 3 pref 1500
ip route flush cache
更改后,两个通道均能正常