一、使用背景:
我们有许多终端需要和服务端通信,为了不直接向公网公开服务器的业务端口,所以配置了一条虚拟局域网用于终端通信。选用了当前普遍使用的UDP协议,因为终端部署在世界各地,有些地方的网络供应商对联网进行了限制,不能使用UDP协议,所以需要在这基础上增加一个TCP协议。而且还需要保障当前已分配的固定IP正常工作。
二、方案选型:
基于此背景,我决定对当前的服务改造,使其同时通过1194端口接受TCP和UDP的请求,当前的openvpn服务是通过yum安装在centos7。
三、方法:
3.1. 修改配置文件:
[root@localhost server]# pwd
/etc/openvpn/server
[root@localhost server]# cat udp.conf
local 192.168.1.2
port 1194
proto udp
dev tunudp
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
server 192.168.162.0 255.255.254.0
client-config-dir ipp
push "redirect-gateway def1 bypass-dhcp"
log /var/log/openvpn-udp.log
ifconfig-pool-persist ippudp.txt
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
verb 3
crl-verify crl.pem
explicit-exit-notify
[root@localhost server]# cat tcp.conf
local 192.168.1.2
port 1194
proto tcp
dev tuntcp
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
server 192.168.162.0 255.255.254.0
client-config-dir ipp
push "redirect-gateway def1 bypass-dhcp"
log /var/log/openvpntcp.log
ifconfig-pool-persist ipptcp.txt
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
verb 3
crl-verify crl.pem
3.2.修改/usr/lib/systemd/system下面服务文件:
[root@localhost system]# cat openvpn-udp.service
[Unit]
Description=OpenVPN service for %I
After=syslog.target network-online.target
Wants=network-online.target
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO
[Service]
Type=notify
PrivateTmp=true
WorkingDirectory=/etc/openvpn/server
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server/udp.conf
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
KillMode=process
RestartSec=5s
Restart=on-failure
[Install]
WantedBy=multi-user.target
[root@localhost system]# cat openvpn-tcp.service
[Unit]
Description=OpenVPN service for %I
After=syslog.target network-online.target
Wants=network-online.target
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO
[Service]
Type=notify
PrivateTmp=true
WorkingDirectory=/etc/openvpn/server
#ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2 --suppress-timestamps --config %i.conf
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server/tcp.conf
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
KillMode=process
RestartSec=5s
Restart=on-failure
[Install]
WantedBy=multi-user.target
3.3.此时执行
systemctl daemon-reload
systemctl enable openvpn-udp --now
systemctl enable openvpn-tcp --now
到这个时候两个服务都已经可以正常接受外部设备的注册了。
标题四、
按上述的操作完可以接受外部的请求,但是如果先启动udp再启动tcp的话,会导致udp注册的客户端无法连接,我们需要给每个IP设置固定的路由。
在/etc/openvpn/server/ipp目录下进行设置:
[root@localhost system]# cd /etc/openvpn/server/ipp/
[root@localhost ipp]# ls
udp1726 udp1757
[root@localhost ipp]# cat udp1757
ifconfig-push 192.168.162.30 255.255.254.0
我们给udp1757这个用户定义了一个IP 192.168.162.30 而且从名字来看它是一个udp用户
执行如下命令添加一条路由规则:
ip route add 192.168.162.30/32 via 0.0.0.0 dev tunudp
解析:tunudp这是我们在udp.conf里面指定的udp模式启动后使用的设备。
如果有其他的需求,我们只需要添加类似的路由规则即好了,如果要对某个终端的网络模式进行修改,只需要执行
ip route replace 192.168.162.30/32 via 0.0.0.0 dev tuntcp
需要做的更多的就是怎样把这一系列集成到用户名的颁发里面了,就不再细说。