Featured image of post Openvpn打通北京和深圳两地办公室网络

Openvpn打通北京和深圳两地办公室网络

我们北京和深圳各有分部,但是由于网络原因,导致两边的资源不互通,经常做一些事情效率底下。现在进行网络调整优化,北京可以访问深圳网络,深圳可以访问北京网络,这样网络打通,资源共享方便,有助于提高工作效率和流程办事速度。。。。。。。。

背景:

在现代企业中,跨地区的办公室和数据中心之间的互联互通是非常常见的需求。企业可能拥有多个分支机构、数据中心(IDC),这些地点需要通过可靠的网络连接进行数据传输、资源共享和远程管理。传统上,企业可能会选择租用专线来连接不同地点的网络,但这种方式成本较高且实施复杂。为了在保持安全性和可靠性的同时降低成本,越来越多的企业选择使用 VPN(虚拟专用网络)技术,而 OpenVPN 是其中一种广受欢迎的解决方案。

OpenVPN 是一个开源的 VPN 解决方案,通过创建加密的隧道,确保不同网络之间的通信安全无虞。这种加密隧道不仅能有效保护数据传输,还能让不同地理位置的网络看起来像是在同一个局域网(LAN)内。这对于需要跨地域进行数据共享、资源访问和远程管理的企业来说,是一个非常实用的工具。

常见应用场景

  1. 分支机构与总部的网络互通: 分支机构的数据需要实时传输到总部进行处理。例如,一个公司在北京设有总部,在上海设有分支机构,北京的服务器需要实时接收和处理来自上海的业务数据。
  2. 办公室与 IDC 机房的网络互通: IT 运维或技术人员需要从办公室远程管理位于 IDC 机房的服务器。此外,IDC 内的服务器也可能需要访问办公室内网中的资源。例如,运维团队在北京的办公室,而服务器部署在上海的 IDC 机房中,通过 OpenVPN,可以让他们轻松远程管理这些服务器。
  3. 不同 IDC 机房之间的网络互通: 两个数据中心之间可能需要同步数据或共享资源。例如,一个企业在北京和上海都拥有数据中心,为了确保数据的高可用性和安全性,他们需要在两个数据中心之间建立一个加密的连接,确保数据能够在两个 IDC 之间安全传输。

我们使用的场景

我们北京和深圳各有分部,但是由于网络原因,导致两边的资源不互通,经常做一些事情效率底下。现在进行网络调整优化,北京可以访问深圳网络,深圳可以访问北京网络,这样网络打通,资源共享方便,有助于提高工作效率和流程办事速度。

为什么选择 OpenVPN

  • 安全性: OpenVPN 使用 SSL/TLS 协议进行加密,能够提供高水平的安全性,防止数据在传输过程中被窃取或篡改。
  • 成本效益: 与租用专线相比,使用 OpenVPN 可以大幅降低企业的网络连接成本。
  • 灵活性: OpenVPN 支持多种网络架构和配置,能够适应企业的多样化需求。不论是通过互联网连接不同地点,还是在复杂的网络环境下建立多点连接,OpenVPN 都能轻松应对。
  • 跨平台支持: OpenVPN 兼容多种操作系统,包括 Windows、Linux、macOS 以及各种移动设备,确保企业能够在不同的平台上实现无缝连接

北京和深圳两边网络双向互通流程

环境配置

主机 ip 用途
openvpn服务端(深圳) 172.17.10.20 openvpn-server
openvpn-server网段机器(深圳办公区域) 172.17.10.21 server同一网段机器
openvpn客户端(北京) 172.17.20.20 openvpn-client
openvpn-client网段机器(北京办公区域) 172.17.20.21 client同一网段机器
虚拟IP 10.10.10.0/24 openvpn的虚拟IP

部署流程

image-20220627093050143

安装openvpn、easy-rsa、iptables-server

1
2
yum install epel-* -y
yum -y install openvpn easy-rsa iptables-services

生成证书及相关文件

利用easy-rsa生成相关证书文件

CA根证书

openvpn服务器证书

Diffie-Hellman算法用到的key 复制easy-rsa脚本到/etc/openvpn下面,该脚本是用来生成CA证书和各种key文件

复制easy-rsa脚本到/etc/openvpn下面,该脚本是用来生成CA证书和各种key文件

1
cp -r /usr/share/easy-rsa/ /etc/openvpn/
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[root@openvpn openvpn]# cd /etc/openvpn/easy-rsa/3.0.8/
[root@openvpn 3.0.8]# ls
easyrsa  openssl-easyrsa.cnf    vars  x509-types
#新建vars文件,编辑变量,初始化
[root@openvpn 3.0.8]# vim vars 

export KEY_COUNTRY="CN"
export KEY_PROVINCE="ShangHai"
export KEY_CITY="ShangHai"
export KEY_ORG="YCZB"
export KEY_EMAIL="heian@heian.com"

[root@openvpn 3.0.8]# source ./vars

生成CA根证书

1
2
3
#初始化 pki 相关目录

./easyrsa init-pki

生成 CA 根证书, 输入 Common Name,名字随便起。

1
2
./easyrsa build-ca nopass 
这个命令是不生成密码

生成openvpn服务器证书和密钥,第一个参数是证书名称

1
./easyrsa build-server-full server nopass

生成Diffie-Hellman算法需要的密钥文件

1
/easyrsa gen-dh   #创建 Diffie-Hellman ,时间比较久一些

生成tls-auth key,为了防止DDOS和TLS攻击,这个属于可选安全配置

1
openvpn --genkey --secret ta.key

openvpn文件整理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
mkdir /etc/openvpn/server/certs 
cd /etc/openvpn/server/certs/
# SSL 协商时 Diffie-Hellman 算法需要的 key
cp /etc/openvpn/easy-rsa/3/pki/dh.pem ./  
# CA 根证书
cp /etc/openvpn/easy-rsa/3/pki/ca.crt ./  
# open VPN 服务器证书
cp /etc/openvpn/easy-rsa/3/pki/issued/yczbjt.crt ./server.crt 
# open VPN 服务器证书 key
cp /etc/openvpn/easy-rsa/3/pki/private/yczbjt.key ./server.key 
# tls-auth key
cp /etc/openvpn/easy-rsa/3/ta.key ./  
-----------------------------------

创建openvpn日志目录

1
2
3
4
5
[root@openvpnservice certs]# /etc/openvpn/cdd
#创建日志目录
[root@openvpnservice certs]# mkdir -p /var/log/openvpn/
#给予权限
[root@openvpnservice certs]# chown openvpn:openvpn /var/log/openvpn

配置OpenVPN

深圳服务端配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
port 1194
proto udp
dev tun
ca /etc/openvpn/server/certs/ca.crt
cert /etc/openvpn/server/certs/server.crt
key /etc/openvpn/server/certs/server.key
dh /etc/openvpn/server/certs/dh.pem
tls-auth /etc/openvpn/server/certs/ta.key 0
server 10.10.10.0 255.255.255.0
route 172.17.20.0 255.255.255.0
push "route 172.17.10.0 255.255.255.0"
ifconfig-pool-persist ipp.txt
client-to-client
compress lzo
keepalive 10 120
client-config-dir /etc/openvpn/ccd
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
log /var/log/openvpn/server.log
log-append /var/log/openvpn/server.log
status /var/log/openvpn/status.log
verb 3
explicit-exit-notify 1
script-security 2
client-connect /etc/openvpn/script/connect.sh
client-disconnect /etc/openvpn/script/disconnect.sh

connect.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
Time=`date +%F`
if [ -f /etc/openvpn/log/openvpn_$Time.log ];then
  touch /etc/openvpn/log/openvpn_$Time.log
  echo "`date '+%F %H:%M:%S'` User $common_name trust_ip $trusted_ip is login,Remote_ip is $ifconfig_pool_remote_ip, Mask is $route_netmask_1" >> /etc/openvpn/log/openvpn_$Time.log
else
  touch /etc/openvpn/log/openvpn_$Time.log
  echo "`date '+%F %H:%M:%S'` User $common_name trust_ip $trusted_ip is login,Remote_ip is $ifconfig_pool_remote_ip, Mask is $route_netmask_1" >> /etc/openvpn/log/openvpn_$Time.log
fi

disconnect.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
Time=`date +%F`
if [ -f /etc/openvpn/log/openvpn_$Time.log ];then
  touch /etc/openvpn/log/openvpn_$Time.log
  echo "`date '+%F %H:%M:%S'` User $common_name trust_ip $trusted_ip is logout,Remote_ip is $ifconfig_pool_remote_ip, Mask is $route_netmask_1" >> /etc/openvpn/log/openvpn_$Time.log
  else
  touch /etc/openvpn/log/openvpn_$Time.log
  echo "`date '+%F %H:%M:%S'` User $common_name trust_ip $trusted_ip is logout,Remote_ip is $ifconfig_pool_remote_ip, Mask is $route_netmask_1" >> /etc/openvpn/log/openvpn_$Time.log
fi

开启路由转发

1
2
 echo net.ipv4.ip_forward = 1 >>/etc/sysctl.conf
 sysctl -p

添加IPtables

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[root@bt script]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Sun Jun 26 10:24:16 2022
*filter
:INPUT ACCEPT [1248:200636]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2012:242515]
-A FORWARD -j ACCEPT
COMMIT
# Completed on Sun Jun 26 10:24:16 2022
# Generated by iptables-save v1.4.21 on Sun Jun 26 10:24:16 2022
*nat
:PREROUTING ACCEPT [2:162]
:INPUT ACCEPT [1:78]
:OUTPUT ACCEPT [271:36649]
:POSTROUTING ACCEPT [72:5056]
-A POSTROUTING -s 172.17.10.0/24 -j MASQUERADE
-A POSTROUTING -s 10.10.10.0/24 -o ens33 -j SNAT --to-source 172.17.10.20
COMMIT
# Completed on Sun Jun 26 10:24:16 2022

这是一些iptables规则,用于网络地址转换(NAT)和IP数据包过滤。这些规则可能在Linux操作系统上的iptables防火墙中使用。

第一个规则的意思是将来自172.17.10.0/24子网中的数据包的源地址改为防火墙的IP地址,以便将数据包传递到互联网,并确保响应数据包可以正确返回。使用MASQUERADE选项的目的是自动根据防火墙的出口IP地址进行地址转换。

第二个规则的意思是将来自10.10.10.0/24子网的数据包的源IP地址改为172.17.10.20,并在防火墙的网络接口(ens33)上发送。这个规则可能会用于特殊情况,例如需要使用特定的IP地址来绕过某些防火墙或网络限制。

加载防火墙

1
iptables-restore > /etc/sysconfig/iptables

image-20220627100616142

ccd

1
2
3
[root@bt openvpn]# cat ccd/fujinfu 
iroute 172.17.20.0 255.255.255.0
配置客户端推送的路由

添加客户端用户配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[root@openvpnservice ~]# cd /etc/openvpn/client/
[root@openvpnservice client]# touch sample.ovpn
[root@openvpnservice client]# vim sample.ovpn
client
proto udp
dev tun
remote 49.234.26.34 1194  #openvpn公网映射的ip地址和端口
ca ca.crt
cert admin.crt
key admin.key
tls-auth ta.key 1
remote-cert-tls server
persist-tun
persist-key
comp-lzo
verb 3
mute-replay-warnings

创建用户脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
yum install -y zip,unzip

[root@bt client]# cat bash_openuser.sh 
# ! /bin/bash
set -e
OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_VERSION=3
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
PKI_DIR=$EASY_RSA_DIR/$EASY_RSA_VERSION/pki

for user in "$@"
do
  if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
    rm -rf $OVPN_USER_KEYS_DIR/$user
    rm -rf  $PKI_DIR/reqs/$user.req
    sed -i '/'"$user"'/d' $PKI_DIR/index.txt
  fi
  cd $EASY_RSA_DIR/$EASY_RSA_VERSION
  # 生成客户端 ssl 证书文件
  ./easyrsa build-client-full $user nopass
  # 整理下生成的文件
  mkdir -p  $OVPN_USER_KEYS_DIR/$user
  cp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/   # CA 根证书
  cp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/   # 客户端证书
  cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/  # 客户端证书密钥
  cp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件
  sed -i 's/admin/'"$user"'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
  cp /etc/openvpn/server/certs/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key  # auth-tls 文件
  cd $OVPN_USER_KEYS_DIR
  zip -r $user.zip $user
done
exit 0

北京客户端配置

image-20220627101729042

iptables设置

开启转发路由

1
2
3
4
5
6
7
systemctl stop firewalld
systemctl mask firewalld
setenforce 0				# 临时关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

echo net.ipv4.ip_forward = 1 >>/etc/sysctl.conf
sysctl -p

根据下图设置IPtables的规则

1
2
3
4
5
6
7
8
vim  /etc/sysconfig/iptables

-A POSTROUTING -s 172.17.20.0/24 -j MASQUERADE
-A POSTROUTING -s 10.10.10.0/24 -o ens33 -j SNAT --to-source 172.17.20.20


加载防火墙
iptables-restore > /etc/sysconfig/iptables

image-20220627101812143

交换机配置

深圳访问北京的机器

1
route add -net 172.17.20.0/24 gw 172.17.10.20

如果使用的是华为交换机(Huawei),命令则如下:

1
ip route-static 172.17.20.0 255.255.255.0 172.17.10.20

请根据具体使用的交换机型号和品牌,选择相应的命令格式。

北京机器访问深圳段的机器

1
route add -net 172.17.10.0/24 gw 172.17.20.20

如果使用的是华为交换机(Huawei),命令则如下:

1
ip route-static 172.17.10.0 255.255.255.0 172.17.20.20

上面是临时加到机器上,我们应该加到交换机上,这样整个网段都可以访问

在实际的环境中可以在内网的路由器上做,这样就不需要在主机上配,比较省事.

参考文档:

https://ownit.top/p/202407290930/

https://www.cnblogs.com/huangweimin/articles/7700892.html

未来的你,会感谢今天仍在努力奋斗的你