使用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