# OpenVPN設定筆記 ###### tags: `openvpn` `vpn` ## 說明 建立一個OpenVPN服務,讓使用者可以利用他當作跳板上網。簡單說就是用來翻牆啦。因為只是翻牆而已,所以沒有額外加強安全性。如有需要,請自行參考文末的參考文件。 注意,每個參考網頁上的操作步驟順序都有些微不一樣,建議先完整看完之後在進行操作,以免混亂。(沒錯我就是搞混了一下子 囧a) ## 基本環境 * Ubuntu 16.04 * Iptables-persistent * OpenVPN & easy-rsa ## Server端設定 ### 安裝所需套件 ``` apt install openvpn easy-rsa ``` 註:本文所有指令皆是在root權限下執行。 ### 設定server.conf 複製server.conf ``` gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf ``` 編輯server.conf ``` ##以下只列出有修改的部份 ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/server.crt key /etc/openvpn/easy-rsa/keys/server.key dh /etc/openvpn/easy-rsa/keys/dh2048.pem ## /etc/openvpn/easy-rsa/是我們等下會建立的目錄,這個可以依照自己需求修改。 ``` ### 建立所需金鑰 執行`make-cadir`產生存放認證金鑰的目錄,並切換過去,在裡面建立openssl-1.0.0的連結。 ``` make-cadir /etc/openvpn/easy-rsa cd /etc/openvpn/easy-rsa/ ln -s openssl-1.0.0.cnf openssl.cnf ``` 這個指令是安裝easy-rsa後會出現的指令。easy-rsa是一個用來產生CA認證的工具,屬於OpenVPN專案之一。 編輯`/etc/openvpn/easy-rsa/vars` ``` export KEY_COUNTRY=”TW” export KEY_PROVINCE=”TW” export KEY_CITY=”Kaohsiung” export KEY_ORG=”Kaohsiung” export KEY_EMAIL=”me@myself.mydomain” export KEY_OU=”MyCompany” ``` 基本上就依照實際狀況設定,這樣之後要新增server/client的金鑰共同部份就可以直接用預設值,不須重複輸入。 初始化`/etc/openvpn/easy-rsa/`環境 ``` source ./vars ./clean-all ``` 在執行這段時,系統會出現警告,說明執行這個指令會把原先放在`/etc/openvpn/easy-rsa/keys/`的資料給清掉。就清掉吧。 #### 建立CA和Diffie-Hellman PEM ``` cd /etc/openvpn/easy-rsa/ source ./vars ./build-ca ./build-dh ``` 執行`/bulid-dh`會需要一段時間,一些網頁上會用`openssl`來建立,此文件統一都用`easy-rsa`處理金鑰相關訊息。 #### 建立server端所需金鑰 ``` cd /etc/openvpn/easy-rsa/ source ./vars ./build-key-server server ``` 基本上都按照剛剛建立的預測值,再依照自己需求做增減。 以上建立的金鑰檔,路徑位置要跟server.conf裡的設定要一樣。 #### 建立client端所需金鑰 每一個client都有自己的金鑰,基本上OpenVPN預設值是一組金鑰在同一時間內,只允許一個連線,就像BBS一樣。 建立一個名為client1的一組金鑰 ``` cd /etc/openvpn/easy-rsa/ source ./vars ./build-key client1 (or) ./build-key-pass client1 ##這個指令會要你輸入密碼,之後使用這組金鑰建立連線時,系統會要求你輸入密碼,算是第二城保護 ``` 其他client端金鑰依此類推。 如果需要刪除client端金鑰 ``` cd /etc/openvpn/easy-rsa/ source ./vars ./revoke-full client2 ``` 這樣一來,client2這組金鑰就無法使用了。 #### 啟用OpenVPN服務 ``` systemctl enable openvpn.service systemctl start openvpn.service ``` 啟用後,可以用`netstat -tulnp | grep 1194`看1194 port有無listen,或是`ifconfig`看有沒有OpenVPN建立的網路界面:`tunXXX` ### 開通防火牆及IP forward功能。 使用VPN服務需要啟動以下功能: * IP forwarding * 防火牆允許VPN連線 * 防火牆開通NAT功能 設定IP forwarding ``` vim /etc/sysctl.conf net.ipv4.ip_forward=1 ## 這行取消註解。 sysctl --system ``` 可以下以下指令看有無生效:`sysctl -a`或`sysctl -p` 安裝Iptables-persistent並先啟用 ``` apt install iptables-persistent systemctl enable netfilter-persistent systemctl start netfilter-persistent ``` 先啟用的原因:如果先把設定檔寫好再啟動,如果選項沒選好,Iptables-persistent會把原先寫好的設定給洗掉。 設定相關防火牆規則 ``` vim /etc/iptables/ *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.8.0.0/24 -o ens160 -j MASQUERADE COMMIT *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i ens160 -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT -A INPUT -i tun+ -j ACCEPT -A FORWARD -i tun+ -j ACCEPT -A FORWARD -i tun+ -o ens160 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i ens160 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -o tun+ -j ACCEPT COMMIT ``` nat部份是設定NAT功能,這樣才有辦法再從OpenVPN server連到網際網路。 filter部份就是允許OpenVPN相關封包連線。`tun+`是OpenVPN server產生的網路界面。`ens160`是server上的網卡名稱,請按照實際機器名稱做相對硬的修改。 重啟Iptables-persistent ``` systemctl restart netfilter-persistent ``` 註:以上設定是針對OpenVPN設置,實際狀況還要加上其他設定,例如允許SSH,阻擋ICMP,等等。 下以下指令可以檢查規則有無生效:`iptables-save` 以上設定完後可以重啟機器,之後就可以就可準備client的部份。 ## Client端設定 以上已經建立名為`client1`的金鑰,現在就要把這金鑰打包給client端。 client上會需要的檔案。 ``` client1.ovpn ca.crt client1.crt client1.key ``` ### 在server端打包所需檔案 從預設檔複製出`client1.ovpn` ``` cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn vim /etc/openvpn/easy-rsa/keys/client.ovpn remote 192.0.2.0 1194 ##OpenVPN Server的連線IP user nobody group nogroup ##有些作業系統會禁止使用root權限執行程式。 ca ca.crt cert client1.crt key client1.key ##如果這三個檔案跟.ovpn放同一個目錄下,就不用額外設定路徑。不一樣就社路徑吧。 ``` 以上只列出需要修改的部份,其餘自己再研究吧。基本上就是增加安全性的設置。 打包檔案 ``` tar -C /etc/openvpn/easy-rsa/keys -cvzf /etc/openvpn/client1.tar.gz {ca.crt,client1.crt,client1.key,client.ovpn,ta.key} ``` 這個就把這個壓縮檔送到client端 ### client端啟用連線(Linux端) 安裝OpenVPN並解壓縮檔案 ``` apt install openvpn tar zxvf client1.tar.gz ``` 啟動連線 ``` cd /{PATH}/client1/ sudo openvpn client1.ovpn ##一定得用sudo權限 ``` 如果沒有錯誤訊息,就表示設定成功了。嘿嘿嘿可以進DMM......玩Kancolle啦! ## 參考資料 基本上都是參考這個文件。另外這篇還有說明一些更安全的設定。 [https://medium.com/linode-cube/set-up-openvpn-on-ubuntu-16-04-for-safetys-sake-d73b7ec7e465](https://medium.com/linode-cube/set-up-openvpn-on-ubuntu-16-04-for-safetys-sake-d73b7ec7e465) `./build-dh`參考網頁 [https://www.linode.com/docs/networking/vpn/secure-communications-with-openvpn-on-ubuntu-12-04-precise-and-debian-7/](https://www.linode.com/docs/networking/vpn/secure-communications-with-openvpn-on-ubuntu-12-04-precise-and-debian-7/) `./build-key-pass`參考網頁 [https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-16-04](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-16-04) 官方文件,還有怎麼刪除client的key。 [https://openvpn.net/index.php/open-source/documentation/howto.html#revoke](https://openvpn.net/index.php/open-source/documentation/howto.html#revoke) 防火牆設定參考 [https://arashmilani.com/post?id=53](https://arashmilani.com/post?id=53) Client(Linux)連線方式說明 [https://blog.longwin.com.tw/2010/11/ubunut-vpn-openvpn-set-2010/](https://blog.longwin.com.tw/2010/11/ubunut-vpn-openvpn-set-2010/)