最近機關疊代一個平台,功能跟微信公衆号有關聯,要開發API接口受理微信調用。平台測試伺服器在内網,一開始我覺得這事很容易,在機關路由器上做虛拟伺服器就行了。沒想到試了好幾次都不成功,找營運商技術支援一問才知道,我們用的是5G上網,營運商不給開放通路端口,我也真是醉了。
後來想到:測試伺服器能上公網,機關也有雲伺服器,如果把兩者通過VPN組成一個區域網路,然後在雲伺服器上用iptables把端口指向到測試伺服器,應該就能解決問題了。
具體連接配接方式如下圖:
确定方案之後就開始搭建VPN伺服器,我使用的是開源的OpenVPN服務。首先要制作證書,從 https://github.com/OpenVPN/easy-rsa/tree/release/2.x 可以下載下傳證書制作工具,下載下傳後是easy-rsa-release-2.x.zip。把easy-rsa-release-2.x.zip解壓縮之後上傳到VPN伺服器/root目錄。如下圖:
進入/root/easy-rsa-release-2.x/easy-rsa/2.0/,咱們制作證書的所有指令都在這個目錄裡。如下圖:
在目錄裡有vars檔案,可以配置制作證書的參數。編輯這個檔案 vim vars ,咱們隻要調整下面這些配置的值就可以了。
export KEY_COUNTRY="CN"
export KEY_PROVINCE="BeiJing"
export KEY_CITY="HaiDian"
export KEY_ORG="XXXXXX"
export KEY_EMAIL="[email protected]"
export KEY_OU="Beijing XXXXXXX Technology Co.,Ltd."
其他的都不用修改。如下圖:
vars改好之後儲存,執行 source vars 使vars配置生效。如下圖:
下面執行 ./clean-all 指令,執行後系統會在目前目錄下自動建立一個keys目錄,用來存放咱們生成的證書、私鑰、連接配接檔案等。如下圖:
接下來開始生成根證書和密鑰,執行 ./build-ca 指令。因為咱們之前已經在vars檔案裡把參數都配置好了,是以現在一直按回車就可以。如下圖:
執行完成後,在keys目錄下會生成根證書檔案ca.crt和跟密鑰檔案ca.key。目錄下的其他檔案暫時用不上,忽略就行。如下圖:
下面生成服務端證書和密鑰,執行 ./build-key-server server 指令,指令中後面紅色的server是服務端密鑰的名稱,可以根據自己的情況随意起名。執行指令後一路回車,遇到[y/n]就直接y。如下圖:
執行完成後可以看到,keys目錄下多了服務端證書檔案server.crt、服務端私鑰檔案server.key和服務端請求檔案server.csr。如下圖:
下一步咱們制作用戶端證書和密鑰,執行 ./build-key client 指令。指令中後面紅色的client是用戶端密鑰的名稱,可以根據自己的情況随意起名。執行指令後一路回車,遇到[y/n]就直接y。如下圖:
執行完成後可以看到,keys目錄下多了用戶端證書檔案client.crt、用戶端私鑰檔案client.key和用戶端請求檔案client.csr。如下圖:
下面制作密鑰交換檔案,執行 ./build-dh 指令。這個執行時間比較長,耐心多等一會。如下圖:
執行完成後,會在keys目錄下出現密鑰交換檔案dh2048.pem。到此咱們要用到的所有證書就已經制作完成了,下面開始安裝配置OpenVPN的伺服器端。
在VPN伺服器上,執行 yum -y install openvpn 指令,我安裝的是2.4.12版本。如下圖:
安裝完成後,會在 /etc 下出現openvpn目錄,裡面有server和client兩個子目錄。我們執行 mkdir /etc/openvpn/keys 指令建立一個新的keys目錄用來放置要用的各種證書和密鑰檔案。如下圖:
接下來把要用到的證書和密鑰檔案複制到這個keys目錄中。執行:
cp /root/easy-rsa-release-2.x/easy-rsa/2.0/keys/server.crt /etc/openvpn/keys/
cp /root/easy-rsa-release-2.x/easy-rsa/2.0/keys/server.key /etc/openvpn/keys/
cp /root/easy-rsa-release-2.x/easy-rsa/2.0/keys/ca.crt /etc/openvpn/keys/
cp /root/easy-rsa-release-2.x/easy-rsa/2.0/keys/dh2048.pem /etc/openvpn/keys/
執行完成後,/etc/openvpn/keys/中有四個檔案。如下圖:
然後咱們複制openvpn的配置檔案,執行 cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/ 指令。如下圖:
接下來編輯server.conf 配置檔案。先修改咱們前面複制到 /etc/openvpn/keys/ 目錄下四個檔案的位置:
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh2048.pem
如下圖:
然後再修改VPN虛拟IP擷取的網段,server 10.0.1.0 255.255.255.0 。如下圖:
接下來增加允許路由的網段,push "route 10.0.1.0 255.255.255.0" 。如下圖:
下一步修改拒絕服務攻擊證書檔案的位置,tls-auth keys/ta.key 0 。如下圖:
最後修改vpn的加密模式,cipher AES-256-GCM 。如下圖:
上面幾項都修改完成後儲存配置檔案,啟用路由轉發功能。
執行 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 指令;
然後再執行 sysctl -p 指令,使路由轉發配置生效。如下圖:
接下來制作拒絕服務攻擊證書。先進入 /etc/openvpn/keys 目錄,執行 openvpn --genkey --secret ta.key 指令。執行完成後會在 /etc/openvpn/keys 目錄下出現ta.key檔案。如下圖:
下一步啟動openvpn服務,
進入/etc/openvpn目錄,執行 openvpn --daemon --config server.conf 指令;
然後再執行 lsof -i:1194 指令。如果1194端口被openvpn監聽,就說明服務已經成功啟動了。如下圖:
到此,咱們VPN服務端的工作就全部完成了,接下來咱們先檢查一下iptebles的配置。VPN是udp協定,是以要把iptables上1194端口的udp協定開放。如果雲伺服器有防火牆,也要開放1194的udp協定。如下圖:
下面開始配置用戶端。首先是在用戶端上安裝openvpn服務,安裝過程跟服務端一樣。在VPN用戶端上執行 yum -y install openvpn 指令。如下圖:
安裝成功後進入 /etc/openvpn/client 目錄:
把VPN伺服器端生成的:ca.crt、client.crt、client.key和ta.key,這四個檔案傳送到目前目錄下;
把用戶端伺服器 /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/client.conf 也複制到/etc/openvpn/client 目錄下;
如下圖:
下面修改 client.conf 配置檔案,先修改證書檔案的目錄:
ca client/ca.crt
cert client/client.crt
key client/client.key
tls-auth client/ta.key 1
如下圖:
再修改VPN加密方式:
cipher AES-256-GCM
如下圖:
最後修改VPN服務端的IP位址和端口:
remote XXX.XXX.XXX.XXX 1194
上面幾項都修改完成後,儲存檔案。然後啟動用戶端服務:
在 /etc/openvpn 目錄下執行 openvpn --daemon --config client/client.conf --log-append /var/log/openvpn.log
如下圖:
可以看一下 /var/log/openvpn.log 這個日志檔案,如果顯示 Initialization Sequence Completed 就可以了。也可以在用戶端執行 ifconfig 指令。如果有虛拟網卡,IP是10.0.1.X,就說明正常了。 如下圖:
現在VPN服務端和用戶端已經連接配接起來了,服務端的虛拟IP是10.0.1.1,用戶端的虛拟IP是10.0.1.6。下面在服務端執行:
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8081 -j DNAT --to-destination 10.0.1.6:8081
把服務端的8081端口指向到VPN用戶端伺服器10.0.1.6:8081上。用浏覽器通路服務端的公網IP,能夠正常傳回。如下圖:
大功告成!