openvpn不小心多開的挽救手段-iptables的使用
[
|
2016/12/07 20:17]


今天寫了一個自動拉起腳本,調試的時候出了點狀況,導致啟動了很多個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,因為前者會讓請求方重試的時間間隔更長一些,為后續操作贏得更多時間。
首先嘗試打開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,因為前者會讓請求方重試的時間間隔更長一些,為后續操作贏得更多時間。