内网open虚拟专用网络通道搭建过程
文章目录
- 内网open虚拟专用网络通道搭建过程
- 前言
- 一、环境准备
- 二、安装open虚拟专用通道
- 2.1、安装依赖包
- 2.2、开始安装
- 三、证书配置
- 3.1、easy-rsa配置修改
- 3.2、初始化与创建CA根证书
- 3.3、生成服务端证书
- 3.4、生成客户端证书
- 3.5、创建服务端配置文件
- 四、客户端client用户配置文件
- 五、开启转发功能并生效
- 5.1、Open虚拟专用通道服务器端iptables的设置(关键设置)
- 5.2、Open虚拟专用通道客户端端iptables的设置(关键设置)
- 5.3、测试数据库端口转发
前言
Open虚拟专用通道 是一个基于 OpenSSL 库的应用层实现。和传统 虚拟专用通道 相比,它的优点是简单易用。
它大量使用了OpenSSL加密库中的SSLv3/TLSv1 协议函式库。OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Windows 2000/XP/Vista上运行,并包含了许多安全性的功能。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软件包兼容。
Open虚拟专用通道使用通用网络协议(TCP与UDP)
在选择协议时候,需要注意2个加密隧道之间的网络状况,如有高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致要隧道上层的协议进行重传,效率非常低下。
一、环境准备
应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)格式有,JPEG、ASCll、EBCDIC、加密格式等
会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6)
数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验 [3] 等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层
建立、维护、断开物理连接。(由底层网络定义协议)
如下图所示,测试的虚拟机我准备了四台机器,当然根据实际情况而定测试不通的场景。
二、安装open虚拟专用通道
2.1、安装依赖包
[root@openvpn ~]# yum -y install lz4-devel lzo-devel pam-devel openssl-devel systemd-devel sqlite
-devel autoconf automake libtool libtool-ltdl
[root@openvpn ~]# rpm -q lz4-devel lzo-devel pam-devel openssl-devel systemd-devel sqlite-devel a
utoconf automake libtool libtool-ltdl
lz4-devel-1.8.3-1.el7.x86_64
lzo-devel-2.06-8.el7.x86_64
pam-devel-1.1.8-23.el7.x86_64
openssl-devel-1.0.2k-25.el7_9.x86_64
systemd-devel-219-78.el7_9.7.x86_64
sqlite-devel-3.7.17-8.el7_7.1.x86_64
autoconf-2.69-11.el7.noarch
automake-1.13.4-3.el7.noarch
libtool-2.4.2-22.el7_3.x86_64
libtool-ltdl-2.4.2-22.el7_3.x86_64
如果无网,在有网的虚拟机上下载rpm包,传上去安装
http://rpmfind.net/linux/rpm2html/search.php?query=vulkan-filesystem&submit=Search+…&system=&arch=
EasyRSA-3.1.2.tgz下载地址
https://github.com/OpenVPN/easy-rsa/releases/tag/v3.1.2
https://rhel.pkgs.org/
openvpn-2.5.6.tar.gz下载地址
https://swupdate.openvpn.org/community/releases/openvpn-2.5.6.tar.gz
2.2、开始安装
[root@openvpn openvpn-2.5.6]# autoreconf -i -v -f
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force -I m4
autoreconf: configure.ac: tracing
autoreconf: running: libtoolize --copy --force
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
autoreconf: Leaving directory `.'
[root@openvpn openvpn-2.5.6]# ./configure --prefix=/usr/local/openvpn --enable-lzo --enable-lz4 --enable-plu
gins --enable-port-share --enable-iproute2 --enable-pf --enable-plugin-auth-pam --enable-pam-dlopen --enable-systemd
[root@openvpn openvpn-2.5.6]# make && make install
建立软连接
[root@openvpn openvpn-2.5.6]# ln -s /usr/local/openvpn/sbin/openvpn /usr/local/sbin/openvpn
来到文件配置端
[root@openvpn openvpn-2.5.6]# cd /usr/local/openvpn/lib/systemd/system/
[root@openvpn system]# ll
total 8
-rw-r--r--. 1 root root 716 Jan 15 03:49 openvpn-client@.service
-rw-r--r--. 1 root root 838 Jan 15 03:49 openvpn-server@.service
复制2份到系统开机注册下
[root@openvpn system]# cp -a /usr/local/openvpn/lib/systemd/system/openvpn-server@.service /usr/lib/systemd/
system/openvpn-tcp.service
[root@openvpn system]# cp -a /usr/local/openvpn/lib/systemd/system/openvpn-server@.service /usr/lib/systemd/
system/openvpn-udp.service
找到 ExecStart 这行,注释改为如下
然后新增
ExecStart=/usr/local/openvpn/sbin/openvpn --config server-tcp.conf
同理udp的也改
vim openvpn-udp.service
三、证书配置
3.1、easy-rsa配置修改
关于这个工具前面已经提到过如何下载了
根据 EasyRSA-3.1.2/vars.example文件生成全局配置文件vars
需要修改的
国家
set_var EASYRSA_REQ_COUNTRY “CN”
省
set_var EASYRSA_REQ_PROVINCE “SC”
城市
set_var EASYRSA_REQ_CITY “LeShan”
组织
set_var EASYRSA_REQ_ORG “yang”
邮箱
set_var EASYRSA_REQ_EMAIL “yang@123.com”
拥有者
set_var EASYRSA_REQ_OU “yxl”
长度
set_var EASYRSA_KEY_SIZE 2048
算法
set_var EASYRSA_ALGO rsa
CA证书过期时间,单位天
set_var EASYRSA_CA_EXPIRE 36500
签发证书的有效期是多少天,单位天
3.2、初始化与创建CA根证书
[root@openvpn EasyRSA-3.1.2]# ./easyrsa init-pki
[root@openvpn EasyRSA-3.1.2]# ./easyrsa build-ca
shigj66
这个密码必须记住,否则后续无法自签名。
还需要输入common name 通用名(这里不支持删除键),如: openvpen ,这个你自己随便设置个独一无二的。
3.3、生成服务端证书
[root@openvpn EasyRSA-3.1.2]# ./easyrsa build-server-full server nopass
为服务端生成证书对并在本地签名。nopass参数生成一个无密码的证书;在此过程中会让你确认ca密码
创建Diffie-Hellman,确保key穿越不安全网络的命令,时间会有点长,耐心等待
[root@openvpn EasyRSA-3.1.2]# ./easyrsa gen-dh
3.4、生成客户端证书
./easyrsa build-client-full client nopass # 无密码,实际应用中不推荐,客户端有密码可提高安全性 //不推荐 不做测试
[root@openvpn EasyRSA-3.1.2]# ./easyrsa build-client-full shigj
shigj888
为了提高安全性,openvpn生成ta.key
加强认证方式,防攻击。如果配置文件中启用此项(默认是启用的),就需要执行上述命令,并把ta.key放到/etc/openvpn/server目录。配置文件中服务端第二个参数为0,同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1【服务端有该配置,那么客户端也必须要有】
[root@openvpn EasyRSA-3.1.2]# openvpn --genkey secret ta.key
整理服务端证书
[root@openvpn EasyRSA-3.1.2]# mkdir -p /etc/openvpn/server/
[root@openvpn EasyRSA-3.1.2]# cp -a pki/ca.crt /etc/openvpn/server/
[root@openvpn EasyRSA-3.1.2]# cp -a pki/private/server.key /etc/openvpn/server/
[root@openvpn EasyRSA-3.1.2]# cp -a pki/issued/server.crt /etc/openvpn/server/
[root@openvpn EasyRSA-3.1.2]# cp -a pki/dh.pem /etc/openvpn/server/
[root@openvpn EasyRSA-3.1.2]# cp -a ta.key /etc/openvpn/server/
这些文件都是openvpn服务器需要的
3.5、创建服务端配置文件
文件参数说明
local 0.0.0.0
表示openvpn服务端的监听地址
port 1194
监听的端口,默认是1194
proto tcp
使用的协议,有udp和tcp。建议选择tcp
dev tun
使用三层路由IP隧道(tun)还是二层以太网隧道(tap)。一般都使用tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
ca证书、服务端证书、服务端密钥和密钥交换文件。如果它们和server.conf在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用
server 10.8.0.0 255.255.255.0
vpn服务端为自己和客户端分配IP的地址池。
服务端自己获取网段的第一个地址(此处为10.8.0.1),后为客户端分配其他的可用地址。以后客户端就可以和10.8.0.1进行通信。
注意:该网段地址池不要和已有网段冲突或重复。其实一般来说是不用改的。除非当前内网使用了10.8.0.0/24的网段。
ifconfig-pool-persist ipp.txt
使用一个文件记录已分配虚拟IP的客户端和虚拟IP的对应关系,
以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的IP。也就是自动续借IP的意思。
server-bridge XXXXXX
使用tap模式的时候考虑此选项。
push “route 10.0.10.0 255.255.255.0”
push “route 192.168.10.0 255.255.255.0”
vpn服务端向客户端推送vpn服务端内网网段的路由配置,以便让客户端能够找到服务端内网。多条路由就写多个Push指令
client-to-client
让vpn客户端之间可以互相看见对方,即能互相通信。默认情况客户端只能看到服务端一个人;
默认是注释的,不能客户端之间相互看见
duplicate-cn
允许多个客户端使用同一个VPN帐号连接服务端
默认是注释的,不支持多个客户登录一个账号
keepalive 10 120
每10秒ping一次,120秒后没收到ping就说明对方挂了
tls-auth ta.key 0
加强认证方式,防攻击。如果配置文件中启用此项(默认是启用的)
需要执行openvpn --genkey --secret ta.key,并把ta.key放到/etc/openvpn/server目录
服务端第二个参数为0;同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1。
cipher AES-256-CBC
#选择一个密码。如果在服务器上使用了cipher选项,那么您也必须在这里指定它。注意,v2.4客户端/服务器将在TLS模式下自动协商AES-256-GCM。
compress lz4-v2
push “compress lz4-v2”
openvpn 2.4版本的vpn才能设置此选项。表示服务端启用lz4的压缩功能,传输数据给客户端时会压缩数据包。
Push后在客户端也配置启用lz4的压缩功能,向服务端发数据时也会压缩。如果是2.4版本以下的老版本,则使用用comp-lzo指令
comp-lzo
启用lzo数据压缩格式。此指令用于低于2.4版本的老版本。且如果服务端配置了该指令,客户端也必须要配置
max-clients 100
并发客户端的连接数
persist-key
persist-tun
通过ping得知超时时,当重启vpn后将使用同一个密钥文件以及保持tun连接状态
status openvpn-status.log
在文件中输出当前的连接信息,每分钟截断并重写一次该文件
;log openvpn.log
;log-append openvpn.log
默认vpn的日志会记录到rsyslog中,使用这两个选项可以改变。
log指令表示每次启动vpn时覆盖式记录到指定日志文件中,
log-append则表示每次启动vpn时追加式的记录到指定日志中。
但两者只能选其一,或者不选时记录到rsyslog中
verb 3
日志记录的详细级别。
;mute 20
沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志。
explicit-exit-notify 1
当服务器重新启动时,通知客户端,以便它可以自动重新连接。仅在UDP协议是可用
[root@openvpn server]# pwd
/etc/openvpn/server
创建配置文件
[root@openvpn server]# vim server-tcp.conf
local 0.0.0.0
port 1115
proto tcp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
server 10.123.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.10.0 255.255.255.0"
;client-to-client
;duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
;comp-lzo
max-clients 1000
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3
;explicit-exit-notify 1
[root@openvpn server]# vim server-udp.conf
local 0.0.0.0
port 1229
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
server 10.124.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.10.0 255.255.255.0"
;client-to-client
;duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
;comp-lzo
max-clients 1000
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3
;explicit-exit-notify 1
注册开机认证
[root@openvpn server]# systemctl enable openvpn-tcp.service
Created symlink from /etc/systemd/system/multi-user.target.wants/openvpn-tcp.service to /usr/lib/systemd/sys
tem/openvpn-tcp.service.[root@openvpn server]# systemctl enable openvpn-udp.service
Created symlink from /etc/systemd/system/multi-user.target.wants/openvpn-udp.service to /usr/lib/systemd/sys
tem/openvpn-udp.service.
启动openvpn服务并查看进程与端口
[root@openvpn server]# systemctl start openvpn-tcp.service
[root@openvpn server]# systemctl status openvpn-tcp.service
同时也会新增一个网卡tun0
同理启动
systemctl start openvpn-udp.service
systemctl status openvpn-udp.service
[root@openvpn server]# ps -ef|grep openvpn
同时也会新增一个网卡
四、客户端client用户配置文件
下载并安装客户端
用户的配置文件需要放到config下
创建用户目录存放用户配置文件
说明:
1、注意路径,在OpenVPN/config目录下建立了shigj目录
2、ca.crt、server.crt、 server.key、ta.key都是之前创建好的,只有server.ovpn需要单独下载并修改。
整理客户证书。
如果是公司给员工开通vpn,需要打包
( ca.crt、 shigj.crt、 shigj.key、ta.key, shigj-tcp.ovpn,shigj-udp.ovpn )
发给员工,员工只需要安装客户端,放入配置文件即可.
[root@openvpn server]# cd /home/EasyRSA-3.1.2
[root@openvpn EasyRSA-3.1.2]# mkdir /opt/shigj
[root@openvpn EasyRSA-3.1.2]# cp -a pki/ca.crt /opt/shigj/
[root@openvpn EasyRSA-3.1.2]# cp -a pki/issued/shigj.crt /opt/shigj/
[root@openvpn EasyRSA-3.1.2]# cp -a pki/private/shigj.key /opt/shigj/
[root@openvpn EasyRSA-3.1.2]# cp -a ta.key /opt/shigj/
首先这个用户是用window连接的
来到目录下
cd /opt/shigj/
创建客户端配置文件
vim shigj-tcp.ovpn
client
dev tun
proto tcp
remote 172.10.10.13 1115
resolv-retry infinite
nobind
;user nobody
;group nobody
persist-key
persist-tun
ca ca.crt
cert shigj.crt
key shigj.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
compress lz4-v2
verb 3
;mute 20
继续创建一份udp的
client
dev tun
proto udp
remote 172.10.10.13 1229
resolv-retry infinite
nobind
;user nobody
;group nobody
persist-key
persist-tun
ca ca.crt
cert shigj.crt
key shigj.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
compress lz4-v2
verb 3
;mute 20
配置文件参数说明
# 文件名 windows为client.ovpn,Linux为client.conf
client
# 标识这是个客户端
dev tun
# 使用三层路由IP隧道(tun)还是二层以太网隧道(tap)。服务端是什么客户端就是什么
proto tcp
# 使用的协议,有udp和tcp。服务端是什么客户端就是什么
remote 10.0.0.190 1194
# 服务端的地址和端口
resolv-retry infinite
# 一直尝试解析OpenVPN服务器的主机名。
# 在机器上非常有用,不是永久连接到互联网,如笔记本电脑。
nobind
# 大多数客户机不需要绑定到特定的本地端口号。
;user nobody
;group nobody
# 初始化后的降级特权(仅非windows)
persist-key
persist-tun
# 尝试在重新启动时保留某些状态。
ca ca.crt
cert client.crt
key client.key
# ca证书、客户端证书、客户端密钥
# 如果它们和client.conf或client.ovpn在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用
remote-cert-tls server
# 通过检查certicate是否具有正确的密钥使用设置来验证服务器证书。
tls-auth ta.key 1
# 加强认证方式,防攻击。服务端有配置,则客户端必须有
cipher AES-256-CBC
# 选择一个密码。如果在服务器上使用了cipher选项,那么您也必须在这里指定它。注意,v2.4客户端/服务器将在TLS模式下自动协商AES-256-GCM。
compress lz4-v2
# 服务端用的什么,客户端就用的什么
# 表示客户端启用lz4的压缩功能,传输数据给客户端时会压缩数据包。
verb 3
# 日志级别
;mute 20
# 沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志。
打包发给自己
启动openvpn
看见2个连接
首先确定openvpn服务器对应端口开启
[root@openvpn ~]# firewall-cmd --add-port=1115/tcp
success
[root@openvpn ~]# firewall-cmd --add-port=1115/tcp --per
success
[root@openvpn ~]# firewall-cmd --add-port=1229/udp
success
[root@openvpn ~]# firewall-cmd --add-port=1229/udp --per
success
[root@openvpn ~]# firewall-cmd --zone=public --list-ports
1115/tcp 1229/udp
输入用户的密码
如果右下角的tcp和udp均可以链接就意味着成功了一半
然后通过内网的IP就可以通过ssh登陆了,到目前为止只能链接到openvpn服务端内网地址,而其他地址暂时还不能ping通或者直接远程链接
五、开启转发功能并生效
5.1、Open虚拟专用通道服务器端iptables的设置(关键设置)
修改配置
[root@openvpn ~]# grep 'net.ipv4.ip_forward = 1' /etc/sysctl.conf || echo 'net.ipv4.ip_forward = 1' >> /etc/
sysctl.conf
[root@openvpn ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@openvpn server]# iptables -t nat -A POSTROUTING -j MASQUERADE
此时宿主机的远程桌面mstsc就可以通过内网地址进行访问了。
5.2、Open虚拟专用通道客户端端iptables的设置(关键设置)
首先确保网络畅通
[root@slave01 ~]# iptables -t nat -A POSTROUTING -j MASQUERADE
内网其他机器将22端口转发出去,变成4444端口
[root@slave01 ~]# iptables -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 22
此时就可以正常通过ssh远程到内网地址其他服务器当中
5.3、测试数据库端口转发
需要在内网服务器添加转发端口即可,比如我的数据库端口为3308,则在该服务器上添加端口转发
[root@slave02 ~]# iptables -t nat -A PREROUTING -p tcp --dport 3308 -j REDIRECT --to-ports 3308
删除转发端口操作
[root@slave02 ~]# iptables -t nat -D PREROUTING -p tcp --dport 3306 -j REDIRECT --to-ports 3306
查看端口配置规则情况
[root@openvpn ~]# iptables -L -n -t nat