今天写了一个自动拉起脚本,调试的时候出了点状况,导致启动了很多个openvpn实例,并且还在不断启动中。对于使用同证书的实例,默认会后面的踢掉前面的,所以网络就陷入了还没连上就被踢掉的循环,无法登陆,也就失去了控制。

    首先尝试打开server端的duplicate-cn支持。这样每个连接都会分配到一个单独ip,不会互相踢掉。但由于进程太多,每个进程连接上后都试图刷新路由表,导致路由表不停变更,网络依然不能连通。

    这时就需要从server端限制:只能有一个客户端连接上。首先调研了下是否支持只接受第一个连接上的实例而忽略掉后面的连接请求,发现是没有这个特性的。因为如果正常使用中客户网络闪断,这种情况下就不得不等待很久session超时后才能连上,用户体验太差。

    对于网络层面的控制,iptables是个很有效的利器。于是采用了如下的方式:
    1,首先设置DROP掉指定机器所有入包     iptables -I INPUT 1 -p udp -s xxx.xxx.xxx.xxx -j DROP
         这时候所有连入请求都会timeout。
    2,然后使用tcpdump host xxx.xxx.xxx.xxx
         查看所有连入请求的来源端口,选取其中一个。
    3,执行          iptables -I INPUT 1 -p udp -s xxx.xxx.xxx.xxx --source-port yyyyy -j ACCEPT
         为这个实例单独开一个入口。

等待几秒,等待其重试连接,这时候只有这一个实例可以连入。成功恢复连接。

这里需要注意,第一步应使用DROP而不是REJECT,因为前者会让请求方重试的时间间隔更长一些,为后续操作赢得更多时间。









Tags:
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]