現在越來越多的互聯網公司選擇和使用雲服務商的產品,方便便捷的同時也給運維工作增加了不小的挑戰。辦公網和雲服務兩個局域網(or任意兩個不同局域網),相互隔離。但是在日常運維、研發過程中,需要在辦公網訪問雲服務網絡。如果都通過公網ip繞,既不方便,也不安全,但是拉專線到機房成本又非常高,這里我給大家推薦通過現有資源(雲服務器)來實現這個目標。
這里有3種方案,一種是通過OpenVPN,一種是IPsecVPN,這兩種方法都比較安全,這里不在贅述孰優孰劣。如果公司是固定公網IP的話其實也可以通過建立GRE隧道來實現,但是可能大部分公司都不太滿足要求。
OpenVPN
簡述
OpenVPN 是一個高級的開源 VPN 解決方案,由 “OpenVPN technologies” 支持,並且已經成為開源網絡領域里的事實標准。OpenVPN 使用成熟的 SSL/TLS 加密協議。
架構
OpenVPN架構圖
OpenVPN服務器配置
系統版本 Centos 6.5,配置要求不限。
安裝VPN服務
我這邊用yum安裝,當然你也可以自己編譯安裝(從這個頁面下載:http://openvpn.net/index.php/download.html)
# yum install -y openvpn easy-rsa
初始化VPN服務端
復制配置文件
# cp /usr/share/doc/openvpn-2.3.14/sample/sample-config-files/server.conf /etc/openvpn/
# cp -r /usr/share/easy-rsa/2.0/* /etc/openvpn/
注:openvpn-2.3.14需要改為你安裝的OpenVPN版本
修改配置文件並修改權限
# cd /etc/openvpn/
# vi vars
將 "export KEY_SIZE=” 這行,根據情況把1024改成2048或者4096
# chmod +x vars
做ssl配置文件軟鏈
ln -s openssl-1.0.0.cnf openssl.cnf
證書配置
生成證書
# source ./vars
注意:如果執行 ./clean-all, 會清除/etc/openvpn/keys下所有key文件.
清除舊key文件
# ./clean-all
生成服務端CA證書
# ./build-ca
命令行提示內容可以根據具體情況填寫,也可以不填寫,一路回車.
生成服務器證書
# ./build-key-server openvpn.example.com
生成服務器端密鑰證書, 后面這個openvpn.example.com就是服務器名,可以自定義.
`
生成DH驗證文件
# ./build-dh
生成diffie hellman參數,用於增強openvpn安全性(生成需要漫長等待),讓服務器飛一會。
生成客戶端Key證書
# ./build-key client1
# ./build-key client2
# ./build-key client3
(名字任意,建議寫成你要發給的人的姓名,方便管理)
注:這里與生成服務端證書配置類似,中間一步提示輸入服務端密碼,其他按照提示填寫或一路回車即可。
生成ta.key 文件
# openvpn --genkey --secret /etc/openvpn/keys/ta.key
修改配置文件
# vi /etc/openvpn/server.conf
# 設置監聽IP,默認是監聽所有IP
;local a.b.c.d
# 設置監聽端口,必須要對應的在防火牆里面打開
port 1194
# 設置用TCP還是UDP協議?
;proto tcp
proto udp
# 設置創建tun的路由IP通道,還是創建tap的以太網通道,由於路由IP容易控制,所以推薦使用tunnel;
# 但如果如IPX等必須使用第二層才能通過的通訊,則可以用tap方式,tap也就是以太網橋接
;dev tap
dev tun
# 這里是重點,必須指定SSL/TLS root certificate (ca),
# certificate(cert), and private key (key)
# ca文件是服務端和客戶端都必須使用的,但不需要ca.key
# 服務端和客戶端指定各自的.crt和.key
# 請注意路徑,可以使用以配置文件開始為根的相對路徑,
# 也可以使用絕對路徑
# 請小心存放.key密鑰文件
ca keys/ca.crt
cert keys/openvpn.example.com.crt
key keys/openvpn.example.com.key
# 指定Diffie hellman parameters.
(默認是2048,如果生成ca的時候修改過dh參數“export KEY_SIZE”則改為對應的數字)
dh keys/dh2048.pem
# 配置VPN使用的網段,OpenVPN會自動提供基於該網段的DHCP服務,但不能和任何一方的局域網段重復,保證唯一
server 10.20.0.0 255.255.255.0
# 維持一個客戶端和virtual IP的對應表,以方便客戶端重新連接可以獲得同樣的IP
ifconfig-pool-persist ipp.txt
# 為客戶端創建對應的路由,以另其通達公司網內部服務器
# 但記住,公司網內部服務器也需要有可用路由返回到客戶端
;push "route 192.168.20.0 255.255.255.0"
push "route 10.X.0.0 255.255.0.0" (X按照機房網段修改)
# 若客戶端希望所有的流量都通過VPN傳輸,則可以使用該語句
# 其會自動改變客戶端的網關為VPN服務器,推薦關閉
# 一旦設置,請小心服務端的DHCP設置問題
# push "redirect-gateway def1 bypass-dhcp"
# 用OpenVPN的DHCP功能為客戶端提供指定的DNS、WINS等
#push "dhcp-option DNS 208.67.222.222"
#push "dhcp-option DNS 208.67.220.220"
# 默認客戶端之間是不能直接通訊的,除非把下面的語句注釋掉
client-to-client
# 下面是一些對安全性增強的措施
# For extra security beyond that provided by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
# openvpn --genkey --secret ta.key
#
# The server and each client must have a copy of this key.
# The second parameter should be 0 on the server and 1 on the clients.
# tls-auth ta.key 0 # This file is secret
(這句要注釋掉)
# 使用lzo壓縮的通訊,服務端和客戶端都必須配置
comp-lzo
# 輸出短日志,每分鍾刷新一次,以顯示當前的客戶端
status /var/log/openvpn/openvpn-status.log
# 缺省日志會記錄在系統日志中,但也可以導向到其他地方
# 建議調試的使用先不要設置,調試完成后再定義
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
# 設置日志的級別
#
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 3
創建日志目錄
# mkdir -p /var/log/openvpn/
啟動OpenVPN服務
啟動服務
# service openvpn start
如果遭遇啟動失敗的情況,可以在配置文件中加上一行log-append openvpn.log
再嘗試啟動,然后到/var/log/openvpn/檢查openvpn.log文件來查看錯誤發生原因。
設置開機自啟動
# chkconfig openvpn on
開啟路由轉發功能
+ 開啟路由轉發功能
# vim /etc/sysctl.conf
找到net.ipv4.ip_forward 把0改成1
# sysctl -p
+設置IPtables
做DNAT,保障數據可以正常到達同內網其他主機
# iptables -t nat -A POSTROUTING -s X.X.0.0/24 -o eth0 -j MASQUERADE
(X按照機房網段修改)
# service iptables save
公司服務器配置
安裝客戶端
# yum install openvpn -y
將服務器端生成的key(ca.crt,client.crt,client.key,ta.key)下載到 /etc/openvpn/config
# cd /etc/openvpn/config
# vi client.ovpn
client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
ca ca.crt
cert xxx.crt
key xxx.key
#tls-auth ta.key 0 (這句要注釋掉)
comp-lzo
user nobody
group nobody
persist-key
persist-tun
啟動服務
openvpn --daemon --config client.ovpn
這個時候這台服務器已經和雲環境所有的服務器內網打通了~