使用openv屁恩實現辦公室和IDC機房互通


最近上線了一個項目,服務器放在鄭州的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM