最全面的内网open虚拟专用网络通道搭建过程

世界杯开幕式视频

内网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