linux pptp client managment
需要從某網站頻繁獲取數據,但目標網站對IP限制嚴格,於是想到用vpn。市面上(淘寶)有種每次連接都會自動切換IP的PPTP VPN,很符合需求,下面就是怎麼用了,環境是CentOS6。
#安裝pptp yum install pptp pptp-setup #配置pptp pptpsetup --create v --server vpn.server.address --username USERNAME --password PASSWORD #淘寶的這種pptp vpn一般是不用加密設置的,萬一需要,可以在配置命令最後加--encrypt參數 #為了方便後續使用,我們複製兩個命令 cp /usr/share/doc/ppp-2.4.5/scripts/pon /usr/sbin/ cp /usr/share/doc/ppp-2.4.5/scripts/poff /usr/sbin/ chmod +x /usr/sbin/pon chmod +x /usr/sbin/poff #啟動pptp pon v #如果啟動成功路由表中應該會出現一個ppp0的設備 route -n #如果沒出現可以查看那裡出了問題 tail -n 10 /var/log/messages | grep ppp #這是如果把網關設置到ppp0所有流量就都走vpn了\ #但是啊,你將失去ssh連接,很恐怖吧\ #這時最好有服務器的網頁端供你連到內網進行操作\ #當然,重啟服務器也能恢復連接 #下面設置路由表 /sbin/route del -net default /sbin/route add -net default dev ppp0 #此時所有流量就pptp了,通過下面命令查看 curl http://myip.dnsdynamic.org/ #執行需要pptp的ip完成的任務 #關閉vpn poff #理論上此時應該恢復之前的路由表 #但我偷了個懶,重啟了一下網絡 /etc/init.d/network restart #從pon到重啟網絡,就完成了一個工作循環。
使用php腳本完成pptp的切換,其實就是php調用bash,兩點:運行用戶為root;命令最好寫相對路徑。
#!/usr/bin/php <?php class HttpClient{ private $ch; function __construct($cookie_jar){ $this->ch = curl_init(); curl_setopt($this->ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0'); curl_setopt($this->ch, CURLOPT_TIMEOUT, 40); curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($this->ch, CURLOPT_AUTOREFERER, true); curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($this->ch, CURLOPT_COOKIEJAR, $cookie_jar); curl_setopt($this->ch, CURLOPT_COOKIEFILE, $cookie_jar); } function __destruct(){ curl_close($this->ch); } final public function setReferer($ref=''){ if($ref != ''){ curl_setopt($this->ch, CURLOPT_REFERER, $ref); } } final public function Get($url, $header=false, $nobody=false){ curl_setopt($this->ch, CURLOPT_POST, false); curl_setopt($this->ch, CURLOPT_URL, $url); curl_setopt($this->ch, CURLOPT_HEADER, $header); curl_setopt($this->ch, CURLOPT_NOBODY, $nobody); return curl_exec($this->ch); } final public function Post($url, $data=array(), $header=false, $nobody=false){ curl_setopt($this->ch, CURLOPT_URL, $url); curl_setopt($this->ch, CURLOPT_HEADER, $header); curl_setopt($this->ch, CURLOPT_NOBODY, $nobody); curl_setopt($this->ch, CURLOPT_POST, true); curl_setopt($this->ch, CURLOPT_POSTFIELDS, http_build_query($data)); return curl_exec($this->ch); } } function getNewIP(){ $logIPFile="/home/logIP.txt"; $res=array(); exec("/usr/sbin/pon v", $res); sleep(3); exec("/sbin/route del -net default", $res); sleep(2); exec("/sbin/route", $res); sleep(6); exec("/sbin/route add -net default dev ppp0", $res); // var_dump($res); sleep(1); // 需要一個cookie文件,創建一個空文件即可 $http = new HttpClient('/home/dump.txt'); $ip = $http->Get("http://myip.dnsdynamic.org/"); sleep(1); file_put_contents($logIPFile, date("Y-m-d H:i:s", time())."_".$ip.PHP_EOL , FILE_APPEND | LOCK_EX); $ips=array(); exec("tail -n 2 '$logIPFile'", $ips); $isNewIP=0; foreach( $res as $oldIP ){ if(strpos($oldIP, $ip) != false){ $isNewIP=$isNewIP+1; } } return $isNewIP; } function restoreIP(){ exec("/usr/sbin/poff",$res); // var_dump($res); sleep(2); exec("/etc/init.d/network restart"); } //如果IP沒有重複兩次以上就執行任務 if( getNewIP($logIPFile) <2 ){ // doYourOwnStaff(); } restoreIP(); exit(); ?>
crontab的設置,這裡不用crontab -e,而是直接編輯/etc/crontab:
nano /etc/crontab #指定運行命令的用戶為root 03 * * * * root /path/to/the/script
這樣就完工了,感謝CentOS 6下配置PPTP VPN客户端和在 Linux 命令列進行 PPTP VPN 連線。在完全不了解linux路由表和iptables的情況下,我也只能做到如此了。其實理想狀態是只轉發http和https到pptp,有空再研究吧,新年快樂!
由於政策原因,動態pptp沒那麼好買了。於是年後換了一批靜態pptp,做法就是新建多個pptp配置,然後隨機取。
$vpns = array("v47", "v11", "v18", "v12"); $rand_keys = array_rand($vpns, 2); $vpn = $vpns[$rand_keys[0]] ;
在設置過程中,遇到了unknown authentication type 26; Naking錯誤,解決辦去掉/etc/ppp/options.pptp文件中的require-mppe-128的注釋,並在修改配置文件為如下:
# written by pptpsetup pty "pptp SERVER --nolaunchpppd" lock noauth refuse-pap refuse-eap refuse-chap refuse-mschap nobsdcomp nodeflate require-mppe-128 name MYUSERNAME remotename CONFNAME ipparam CONFNAME
另一種可能的錯誤是連接的時候出現LCP: timeout sending Config-Requests,我是通過chkconfig iptables off關閉iptables解決的,反正我在內網。
上文中的/etc/init.d/network restart有時並不能恢復本機網絡,此時我們可以替換腳本中的這一句為
#網關改回原來的網關 subprocess.call('/sbin/route add default gw 172.16.2.1 netmask 0.0.0.0 dev eth0', shell=True)
linux l2tp client managment
時間來到2018年,pptp換成了l2tp,發現同樣的需求使用NetworkManager真是簡單。設置好l2tp連接後,一行命令即可打開關閉連接。
#passwd-file只需配置一行PSK vpn.secrets.password:YOUR_PSK #打開l2tp連接 subprocess.call('nmcli con up l2tp76 passwd-file /home/42/vpnpass.txt', shell=True) #關閉l2tp連接 subprocess.call('nmcli con down l2tp76', shell=True)
本文更新於 2018/11/09。