最近上線了一個項目,服務器放在鄭州的IDC機房,運維需要在廣州辦公室遠程管理服務器,因此采用OPENVPN架設vpn服務器,打通辦公室和IDC機房之間的網絡。
服務器和網絡規划如下:

我們的目的是讓廣州辦公室內網 172.16.0.0/24、172.16.2.0/24 網段可以和鄭州IDC機房內網172.16.101.0/24、10.140.3.100/24網段互通
環境說明:
- 在鄭州IDC機房選一台主機 172.25.101.105 作為openvpn服務器,監聽在10000端口,映射為外網的 222.143.53.139 的10000端口
- 在廣州辦公室選一台主機 172.16.0.55 作為 openvpn客戶端,連接openvpn服務器端
- 客戶端連接成功后可以把廣州(vpnclient)和 (vpnserver)看成兩個路由
- 廣州辦公室的內網主機如果想訪問鄭州IDC機房的內網主機,需要添加靜態路由,把去往鄭州IDC機房的目標網段下一跳指到 (vpnclient)172.16.0.55
- 鄭州IDC機房的內網主機如果想訪問廣州辦公室內網主機,需要添加靜態路由,把去往廣州辦公室的目標網段下一跳指到 (vpnserver)172.25.101.105
一、鄭州opevpn服務配置 (172.25.101.105)
端口映射
將openvpn服務器172.25.101.105的10000端口映射為外網222.143.53.199的10000端口(因為沒有公網地址,在實際的生產環境有公網地址、雙網卡是最好的)
開啟路由轉發
編輯 /etc/sysctl.conf 文件將 net.ipv4.ip_forward = 0 改為 net.ipv4.ip_forward = 1,然后執行
sysctl -p
配置openvpn服務端
編輯服務端配置文件/etc/openvpn/server.conf
local 172.25.101.105 port 10000 proto tcp dev tun ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/vpnserver.crt key /etc/openvpn/easy-rsa/keys/vpnserver.key dh /etc/openvpn/easy-rsa/keys/dh2048.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 172.25.101.0 255.255.255.0" # 推送路由給客戶端,通知客戶端添加靜態路由,讓客戶端去這兩個網段走vpn接口(tun0) push "route 10.140.3.0 255.255.255.0" route 172.16.0.0 255.255.255.0 # 給openvpn服務器添加靜態路由,目的是讓openvpn服務器知道怎么去客戶端網段,走vpn接口(tun0) client-config-dir /etc/openvpn/ccd keepalive 10 120 comp-lzo max-clients 120 user nobody group nobody client-to-client duplicate-cn # 多個用戶用同一個證書,根據生產環境需求配置 persist-key persist-tun status /var/log/openvpn/openvpn-status.log log /var/log/openvpn/openvpn.log writepid /var/run/openvpn/server.pid verb 3 mute 20
為廣州客戶端生成證書
# cd /etc/openvpn/easy-rsa # ./build-key gz
指定gz客戶端配置
/etc/openvpn/ccd/gz
iroute 172.16.0.0 255.255.255.0 # 客戶端聲明自己的網段是172.16.0.0 ifconfig-push 10.8.0.5 10.8.0.6 # 配置客戶端IP
啟動openvpn服務端
# service openvpn start # chkconfig --add openvpn # chkconfig --level 35 openvpn on
查看tun0接口和路由表
# ifconfig tun0 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:9909 errors:0 dropped:0 overruns:0 frame:0 TX packets:561 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:784296 (765.9 KiB) TX bytes:130132 (127.0 KiB)
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.8.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 # 主機路由 10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0 # 靜態路由,去目標網段10.8.0.0下一跳是10.8.0.2 走vpn接口(tun0) 172.16.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0 # 靜態路由,去目標網段172.16.0.0下一跳是10.8.0.2 走vpn接口(tun0) 172.25.101.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 # 直連路由 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 # 直連路由 0.0.0.0 172.25.101.254 0.0.0.0 UG 0 0 0 eth0 # 直連路由
二、廣州openvpn客戶端配置(172.16.0.55)
開啟路由轉發,編輯 /etc/sysctl.conf 文件將 net.ipv4.ip_forward = 0 改為 net.ipv4.ip_forward = 1,然后執行
sysctl -p
編輯客戶端配置文件/etc/openvpn/client.conf
client dev tun proto tcp remote 222.143.53.139 10000 resolv-retry infinite nobind persist-key persist-tun ca keys/ca.crt cert keys/gz.crt key keys/gz.key remote-cert-tls server
auth-nocache user nobody group nobody comp-lzo status /var/log/openvpn/openvpn-status.log log /var/log/openvpn/openvpn.log writepid /var/run/openvpn/client.pid verb 3 mute 20
啟動openvpn客戶端
service openvpn start
chkconfig --add openvpn chkconfig --level 35 openvpn on
查看tun0接口和路由表
# ifconfig tun0 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.5 P-t-P:10.8.0.6 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:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.8.0.6 0.0.0.0 255.255.255.255 UH 0 0 0 tun0 10.140.3.0 10.8.0.6 255.255.255.0 UG 0 0 0 tun0 10.8.0.0 10.8.0.6 255.255.255.0 UG 0 0 0 tun0 172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 172.25.101.0 10.8.0.6 255.255.255.0 UG 0 0 0 tun0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
測試到openvpn服務端是不是通的,如果能通說明OK
# ping 172.25.101.105 PING 172.25.101.105 (172.25.101.105) 56(84) bytes of data. 64 bytes from 172.25.101.105: icmp_seq=1 ttl=64 time=27.5 ms 64 bytes from 172.25.101.105: icmp_seq=2 ttl=64 time=28.0 ms 64 bytes from 172.25.101.105: icmp_seq=3 ttl=64 time=26.3 ms 64 bytes from 172.25.101.105: icmp_seq=4 ttl=64 time=26.8 ms
--- 172.25.101.105 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3076ms rtt min/avg/max/mdev = 26.365/27.202/28.081/0.690 ms
此時廣州的vpn客戶端和鄭州的vpn服務端可以看成兩個路由
三、功能驗證
1、廣州的172.16.0.0段和鄭州的172.25.101.0段互通
方法一: 廣州172.16.0.0段主機與鄭州172.25.101.0段主機分別添加路由
廣州172.16.0.0段主機添加靜態路由,去目標網絡 172.25.101.0 段下一跳是vpn客戶端 ( 172.16.0.55 )
ip route add 172.25.101.0/24 via 172.16.0.55 //linux
route add 172.25.101.0/24 mask 255.255.255.0 172.16.0.55 //windows
鄭州 172.25.101.0 段主機添加靜態路由,去目標網絡 172.25.101.0 段下一跳是vpn服務端 ( 172.25.101.105 )
ip route add 172.16.0.0/24 via 172.25.101.105 //linux route add 172.16.0.0/24 mask 172.25.101.105 //windows
但是這種方法有個問題,如果主機數量很多,每台主機就需要添加路由,比較麻煩,所以推薦方法二
方法二、 在內網路由設備添加靜態路由
在廣州172.16.0.0段的網關設備(內網路由器)上添加靜態路由,讓目標網絡 172.25.101.0 的下一跳是 172.16.0.55
在鄭州州172.25.101.0段的網關設備(內網路由器)上添加靜態路由,讓目標網絡 172.16.0.0 的下一跳是 172.25.101.105
這種方式好處就是在路由器上配置,不用在主機上添加路由,比較省事。(注:內網路由器通常是網關設備,比如路由器、三層交換機等,可以讓負責這塊的人配置)
最后測試廣州和鄭州兩個網段能不能互通,如果可以說明ok了
在廣州172.16.0.0段的主機ping鄭州172.25.101.10這台主機
# ping 172.25.101.10 # ok PING 172.25.101.10 (172.25.101.10) 56(84) bytes of data. 64 bytes from 172.25.101.10: icmp_seq=1 ttl=62 time=28.3 ms 64 bytes from 172.25.101.10: icmp_seq=2 ttl=62 time=27.0 ms 64 bytes from 172.25.101.10: icmp_seq=3 ttl=62 time=26.9 ms --- 172.25.101.10 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2472ms rtt min/avg/max/mdev = 26.916/27.440/28.319/0.653 ms
跟蹤下路由表,看包的走向
# traceroute 172.25.101.10 traceroute to 172.25.101.10 (172.25.101.10), 30 hops max, 60 byte packets 1 172.16.0.1 (172.16.0.1) 8.032 ms 8.959 ms 10.025 ms # 先到內網路由器(網關),我這里是(172.16.0.1) 2 172.16.0.55 (172.16.0.55) 0.468 ms 0.482 ms 0.478 ms # 數據轉發到廣州vpn客戶端 (172.16.0.55) 3 10.8.0.1 (10.8.0.1) 27.439 ms 54.006 ms 80.127 ms # vpn客戶端轉發給vpn服務端(這步已經到了服務端) 4 172.25.101.10 (172.25.101.10) 80.131 ms 80.130 ms 80.119 ms # 最后包到了目標主機
在鄭州的 172.25.101.0段的主機ping廣州172.16.0.31這台主機
# ping 172.16.0.31 # ok PING 172.16.0.31 (172.16.0.31) 56(84) bytes of data. 64 bytes from 172.16.0.31: icmp_seq=1 ttl=125 time=27.1 ms 64 bytes from 172.16.0.31: icmp_seq=2 ttl=125 time=26.5 ms 64 bytes from 172.16.0.31: icmp_seq=3 ttl=125 time=27.0 ms 64 bytes from 172.16.0.31: icmp_seq=4 ttl=125 time=26.9 ms ^C --- 172.16.0.31 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3147ms rtt min/avg/max/mdev = 26.524/26.917/27.159/0.242 ms
跟蹤下路由表,看包的走向
# traceroute 172.16.0.31 traceroute to 172.16.0.31 (172.16.0.31), 30 hops max, 60 byte packets 1 172.25.101.254 (172.25.101.254) 0.230 ms 0.210 ms 0.125 ms # 先到內網路由器(網關),我這里是(172.25.101.254) 2 172.25.101.105 (172.25.101.105) 0.170 ms 0.140 ms 0.125 ms # 然后到vpn服務端(172.25.101.105) 3 10.8.0.5 (10.8.0.5) 72.398 ms 138.712 ms 138.710 ms # 數據轉發給廣州vpn客戶端 4 bogon (172.16.0.31) 138.697 ms * * # 最后到目標主機
2、廣州的172.16.2.0段能通鄭州的172.25.101.0段
如果想讓廣州內網172.16.2.0通鄭州的172.25.101.0端,可以在廣州的vpn客戶端(172.16.0.55) 上添加SNAT規則
讓源地址是172.16.2.0段的偽裝成vpn客戶端172.16.0.55
# iptables -t nat -A POSTROUTING -s 172.16.2.0/24 -j SNAT --to-source 172.16.0.55
# service iptables save
