1. 程式人生 > >伺服器VPN配置教程(2)——介面配置法+shell指令碼啟動

伺服器VPN配置教程(2)——介面配置法+shell指令碼啟動

【內容摘要】

做資料採集經常需要爬取境外網站的內容,除了在採集程式碼中新增代理模組外,這裡介紹一種伺服器全域性代理的方法,只要購買的VPN服務支援pptp方式或L2TP方式,就可以使用本文的教程對伺服器進行全域性翻牆。

【正文】

在上一篇文章http://blog.csdn.net/zly_ir/article/details/78796634 中,我們介紹瞭如何直接在Ubuntu系統的介面中配置VPN,在本篇文章中,我們將介紹另一種VPN配置方法,介面配置法+shell指令碼啟動,相比於純介面配置,該方法可以利用指令碼比較靈活的切換VPN的線路,在資料採集過程中可以減少相同ip被封的概率。

二、介面配置法+shell指令碼啟動

這種方法親測最穩定,同時可以在shell腳本里檢測VPN連線狀態, 掉線了可以重連,通過在介面配置多個VPN連線,可以在一個閘道器(VPN伺服器)無法連線的時候切換到另一個閘道器(VPN伺服器),增強系統的穩定性。

1.介面上配置多個VPN連線,每個VPN配置過程如一的過程所示,如配置以下VPN連線:

這裡寫圖片描述

2.在介面上配置完這些連結後,會在“/etc/NetworkManager/system-connections”目錄下儲存這些連結的資訊,可以在終端輸入“ls -l /etc/NetworkManager/system-connections”檢視,檢視到的資訊如下則表明都已配置進系統內:

-rw------- 1
root root 380 1117 09:07 VPN tw 1
-rw------- 1 root root 313 1117 08:56 VPN tw 2 -rw------- 1 root root 338 1117 08:56 VPN tw 3 -rw------- 1 root root 338 1117 08:57 VPN tw 4 -rw------- 1 root root 338 1117 08:57 VPN tw 5 ...

3.此時,這些連結還不能被shell指令碼執行,需要一一修改他們的配置檔案,原因不詳。如對VPN tw 1這個連線,在終端輸入“sudo vim /etc/NetworkManager/system-connections/VPN\ tw\ 1”
顯示如下結果:
這裡寫圖片描述

password-flags=1 該值決定了你的 VPN 能否被指令碼開啟。不過呢解決方法也很簡單,只要把該值改為 0,並且新增上密碼引數即可。如下:
這裡寫圖片描述
對於其他連結,一一手動修改…

4.對於上面修改好的每個連結的配置檔案,既可以在shell中開啟他們的連結,但首先你還要知道他們的uuid,即每個連結對應的特定的識別碼,可以在終端中輸入“nmcli con list”檢視所有連結對應uuid,除了“有線連線1”以外其他都是自己配置的VPN以及對應的uuid,如下:

這裡寫圖片描述

5.將所有的uuid寫入一個檔案中,每一行對應一個uuid,通過shell指令碼讀取檔案中的每一行存入vpnuuid變數中,再執行“nmcli con up uuid $vpnuuid”即可開啟對應的VPN,開啟後會自動生成一個ppp0的網絡卡,通過“ifconfig | grep ppp0”命令可檢視是否成功開啟VPN。

6.利用5的思想,既可以編寫一個shell指令碼來定時監測VPN連結情況,如果沒有VPN或者VPN掉線,從檔案中讀取一個uuid並開啟對應的VPN連結即可。切記,對於內網使用者,需在每次成功開啟VPN後,為了防止自己登陸不上去在進行以上操作之前,必須保證路由表中的實驗室電腦及伺服器等機器的ip端路由為eth0,即每次重啟之後需要執行以下幾句話:

sudo route add -net 0.0.0.0 netmask 0.0.0.0 gw 0.0.0.0

具體的網址閘道器和路由地址依據自身情況填寫。

7.這裡附上相應的shell指令碼具體內容供大家參考:

< -------------------------------------------------------------------------------------------------->
#! /bin/bash 
idx=1
while [ idx ]
do
    line=`/sbin/ifconfig | grep ppp0`
    #echo $line
    if [[ $line =~ "ppp0" ]]; then
        echo VPN has been connect.  
    else        
        #從檔案中讀入UUID,存入陣列中
        #flag用來標記是否連結VPN成功
        flag=0
        i=0
        while read line1
        do
            #去除空格
            line1=`echo $line1 | sed s/[[:space:]]//g`
            #若為空則忽略本行
            if [ "$line1"x = x ]; then
                continue
            fi
            #若是註釋行 忽略
            startChar=${line1:0:1}
            if [ "$startChar"x = "#"x ]; then
                continue
            fi
            #UUID
            UUIDs[$i]=$line1
            ((i++))
        done < /*/*/*/UUID  #你存UUID檔案的路徑

        for UUID in ${UUIDs[*]}
        do
            echo --------------------Try connect ${UUID}----------------------.
            sleep 1s
            echo "你的管理員賬號的密碼"|sudo -S nmcli con up uuid ${UUID}
            echo sleep 5 seconds...;
            sleep 5s;
            line=`/sbin/ifconfig | grep ppp0`
            if [[ $line =~ "ppp0" ]]; then
                echo  connect successful.
                echo "你的管理員賬號的密碼"|sudo -S route add -net 1.1.0.0 netmask 255.255.255.0 gw 0.0.0.0
                flag=1
                break
            fi
        done

        if [ $flag = 0 ]; then
            echo connect vpn failed,use local_ip.
            echo "你的管理員賬號的密碼"|sudo -S route add default dev eth0;
            echo "你的管理員賬號的密碼"|sudo -S route add default gw 0.0.0.0 dev eth0
        fi
    fi
    sleep 5m
done

#上述程式碼星號“*”代表依據你的實際情況填寫的內容
< -------------------------------------------------------------------------------------------------->