ubuntu搭建OpenVpn伺服器的教程,ubuntu搭建openvpn
參考: OpenVpn For Ubuntu 16.04
環境介紹:
伺服器系統: Ubuntu 16.04
用戶端系統: Ubuntu 16.04
版本: OpenVPN 2.3.10
基本配置
OpenVpn的技術核心是虛擬網卡,其次是SSL協議實現
安裝OpenVpn服務之後,主機上會多出一個名為tun0的虛擬網卡。而用戶端在與伺服器成功建立SSL串連之後,也會在本地多出一個tun0的虛擬網卡
搭建VPN服務的第一步,我們先使用戶端與伺服器能正確建立SSL串連
step1: 安裝openvpn和easy-rsa
在伺服器上安裝openvpn和easy-rsa
$ sudo apt install openvpn easy-rsa
step2: 複製easy-rsa臨時目錄到home目錄下
$ make-cadir ~/openvpn-rsa
step3: 配置產生認證的所需要的變數
使用文字編輯器開啟~/openvpn-rsa/vars,修改如下變數的值
(這些變數具體有什麼意義,我也不清楚,大家隨便改改吧 o(╯□╰)o)
export KEY_COUNTRY="CN"export KEY_PROVINCE="GD"export KEY_CITY="ShenZhen"export KEY_ORG="ORG"export KEY_EMAIL="me@myhost.mydomain"export KEY_OU="MyOrganizationalUnit"export KEY_NAME="EasyRSA"
step4: 產生CA認證
$ cd ~/openvpn-rsa$ source vars$ ./clean-all$ ./build-ca
step5: 產生伺服器憑證
$ ./build-key-server server$ ./build-dh$ cd keys/$ sudo cp server.crt server.key ca.crt dh2048.pem /etc/openvpn/
server是指伺服器名,此處可自行更改,為了方便,我把它設為server
此過程中,有幾處需要使用者確認的地方,根據提示輸入斷行符號或者y就行了
網上有些資料提示,server需要與vars檔案中的KEY_NAME的值保持一致,但親測貌似沒必要
step6: 產生用戶端認證
$ cd ~/openvpn-rsa$ source vars$ ./build-key clietn1
~/openvpn-rsa/keys目錄下會產生client1.crt和client1.key檔案,用戶端會用到
此處client1可換成自己的名稱
step7: 配置並啟動伺服器
為了讓OpenVpn起來,我們先簡單配置一下
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/$ sudo gzip -d /etc/openvpn/server.conf.gz
使用編輯器修改/etc/openvpn/server.conf檔案,配置認證和密鑰的正確路徑
ca ca.crtcert server.crtkey server.keydh dh2048.pem
我們可以通過systemctl命令來啟動、關閉或查看OpenVpn狀態
$ sudo systemctl start/status/stop/restart openvpn@CONFIGFILENAME
上面的命令中,CONFIGFILENAME是指設定檔名,我們現在使用的設定檔是server.conf,所以CONFIGFILENAME替換成”server”即可
啟動服務之後,我們通過ifconfig會發現一個新的網卡,資訊如下
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:610374 errors:0 dropped:0 overruns:0 frame:0 TX packets:721198 errors:0 dropped:9706 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:40928674 (40.9 MB) TX bytes:927687322 (927.6 MB)``
step8: 配置用戶端
我們還是在伺服器PC上產生用戶端的配置
$ mkdir ~/openvpn-rsa/clients$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/openvpn-rsa/clients/base.conf
base.conf就是我們用戶端通用的設定檔了
使用編輯器修改用戶端設定檔,在上面對應~/openvpn-rsa/clients/base.conf,配置認證和密鑰的正確路徑以及伺服器的地址等資訊
ca ca.crtcert client.crtkey client.keyremote vpnserver.example.com 1194
把vpnserver.example.com改為伺服器的IP或網域名稱,其他需要按上面的填寫
step9: 打包用戶端配置
編輯打包指令碼~/openvpn-rsa/clients/make_client_tar.sh
#!/bin/bashif [[ $# != "1" ]] ; then echo usage: $0 clientname exit 1fiKEY_DIR=~/openvpn-rsa/keysCLIENT=$1mkdir ${CLIENT}cp ${KEY_DIR}/ca.crt ${CLIENT}/ca.crtcp ${KEY_DIR}/${CLIENT}.crt ${CLIENT}/client.crtcp ${KEY_DIR}/${CLIENT}.key ${CLIENT}/client.keycp base.conf ${CLIENT}/client.conftar -cf ${CLIENT}.tar ${CLIENT}rm ${CLIENT} -rf
修改許可權並運行指令碼
$ cd ~/openvpn-rsa/clients/$ chmod u+x make_client_tar.sh$ ./make_client_tar.sh client1
則會產生client1.tar打包檔案
用戶端認證只會在用戶端用到,我們還需要把clietn1.tar通過安全的途徑傳輸到用戶端
如果只圖方便而不考慮安全因素,可以使用python建立一個httpd伺服器,然後用戶端通過網頁下載認證即可
$ sudo python2.7 -m SimpleHTTPServer 80
step10: 啟動用戶端
在用戶端安裝openvpn
$ sudo apt-get install openvpn
把之前打包的檔案下載下來之後,解壓設定檔
$ cd /etc/openvpn/$ sudo cp ~/Downloads/client1.tar ./$ sudo tar -xf client1.tar$ sudo mv client1/* ./$ sudo rm client1.tar client1 -rf
systemctl的使用方式還是一樣
$ sudo systemctl start/status/stop/restart openvpn@CONFIGFILENAME
此處,把CONFIGFILENAME替換成client
啟動用戶端之後,通過ifconfig同樣可以發現一個新網卡,資訊如下
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.6 P-t-P:10.8.0.5 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:261 (261.0 B)
step11: 確認串連是否成功
我們可以通過ping來檢查伺服器與用戶端是否建立串連
$ ping -I tun0 10.8.0.1
如果能ping通,則說明一切正常
如果你在伺服器本地有搭建服務的話,則可以通過tun0來安全訪問了
但我們此時還不能通過OpenVpn上外網,使用命令ping -I tun0 8.8.8.8是ping不通的
因為資料到了伺服器的tun0之後並不能轉寄出去,我們還需要一些其他配置
進階配置
step1: 開啟ip轉寄功能
編輯檔案/etc/sysctl.conf,去掉下面語句前的#
#net.ipv4.ip_forward=1
重載配置
$ sudo sysctl -p /etc/sysctl.conf
step2: 通過iptables配置NAT
建立一個shell指令碼/etc/openvpn/openvpn_nat.sh用來配置NAT
#!/bin/bashiptables -Fiptables -A FORWARD -o eth0 -i tun0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPTiptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTiptables -t nat -F POSTROUTINGiptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEiptables-save
其中eth0是伺服器串連到外網的網卡
設定指令碼許可權
$ sudo chmod u+x /etc/openvpn/openvpn_nat.sh
在/etc/rc.local中設定開機執行指令碼
/etc/openvpn/openvpn_nat.sh
備忘:
本來打算在/etc/openvpn/server.conf中配置,讓指令碼在OpenVpn啟動時執行的
up "/etc/openvpn/openvpn_nat.sh"
但測試發現,雖然手動重啟OpenVpn時,指令碼會被執行
但重啟伺服器卻不會執行指令碼
step3: 修改伺服器配置
使用編輯器修改伺服器設定檔/etc/openvpn/server.conf
$ push "redirect-gateway def1 bypass-dhcp"
使所有用戶端把預設閘道指向VPN,如果不配置這一項,需要在用戶端手動設定路由表
step4: 讓OpenVpn伺服器開機啟動
$ sudo systemctl enable openvpn@server
step5: 重啟OpenVpn
在伺服器上執行
$ sudo systemctl restart openvpn@server
在用戶端執行
$ sudo systemctl restart openvpn@client
step6: 配置用戶端DNS伺服器
通過以上步驟,如果你能通過tun0 ping通8.8.8.8,那麼說明伺服器的NAT設定成功了
$ ping -I tun0 8.8.8.8
但是,如果你還ping不通www.baidu.com,那麼你就需要指定預設DNS伺服器
編輯/etc/network/interfaces,在檔案中添加如下內容
dns-nameservers 8.8.8.8 74.82.42.42 8.8.4.4
重新載入DNS配置
$ sudo systemctl restart networking.service
如果成功,/etc/resolv.conf檔案中會更新DNS伺服器位址
step7: 查看VPN是否正常工作
在百度中搜尋IP,如果顯示的是你伺服器的IP,則說明VPN正常工作了
TODO
現在已經能通過VPN正常上(翻)網(牆)了
但是所有的資料都會從VPN過,希望訪問國內網站時,能不走VPN
具體要怎麼配置還有待研究
如果有知道的朋友,請告知,謝謝