一、OPENVPN原理
OpenVPN的技术核心是虚拟网卡,其次是SSL协议实现。
在OpenVPN中,如果用户访问一个远程的虚拟地址,则操作系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,会通过SOCKET从外网上发送出去。这完成了一个单向传输的过程,反之亦然。当远程服务程序通过SOCKET从外网上接收到数据,并进行相应的处理后,又会发送回给虚拟网卡,则该应用软件就可以接收到发回的数据。

OpenVPN使用OpenSSL库来加密数据与控制信息。这意味着,它能够使用任何OpenSSL支持的算法。它提供了可选的数据包HMAC功能以提高连接的安全性。
OpenVPN提供了多种身份验证方式,用以确认连接双方的身份,包括:
- 预享私钥
预享密钥最为简单,但它只能用于创建点对点的VPN - 第三方证书
基于PKI的第三方证书提供了最完善的功能,但是需要额外维护一个PKI证书系统 - 用户名/密码组合
OpenVPN2.0后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍需要一份服务器证书用作加密。
连接后,你仿佛置身于服务端内网,可通过内网互联,解除限制,且公网IP也是服务端IP
二、服务端安装
脚本项目地址:https://github.com/angristan/openvpn-install
一键安装脚本:
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
bash openvpn-install.sh
由于脚本里需要在线下载软件,在大陆可能无法正常运行该脚本,所以修改了脚本,将需要联网下载的文件提前下载了本地,并且修改了配置文件,只允许10.8.0.0/24网段走openvpn网卡,其他网络请求走本地网卡。
修改后的文件下载地址
根据提示选择。若局域网用了NAT,则需要输入公网IP地址或者主机名。

如果是拨号宽带,公网IP会经常变,建议出口路由器配置动态域名解析(DDNS)

这样,这里填上动态域名就可以了,不惧公网IP变化。
允许客户端之间直接通信
如果想让客户端之间相互访问,可修改以下配置
vim /etc/openvpn/server.conf
# 添加以下内容
client-to-client
# 重启服务
systemctl daemon-reload
systemctl restart openvpn-server@server
重启服务
# 重启加载配置文件
systemctl daemon-reload
# 开机自启动服务
systemctl enable openvpn-server@server
# 重启服务
systemctl restart openvpn-server@server
客户端分配固定 IP
修改 OpenVPN 服务器配置文件
vim /etc/openvpn/server.conf
# 添加以下内容,这表示 OpenVPN 会将客户端 IP 分配记录保存在 /etc/openvpn/ipp.txt 文件中。
ifconfig-pool-persist /etc/openvpn/ipp.txt
# 重启服务
systemctl restart openvpn-server@server
手动分配 IP 地址(默认自动生成。若未生成可手动添加)
vim /etc/openvpn/ipp.txt
# 为客户端分配固定 IP
client1,10.8.0.100,
client2,10.8.0.101,
三、端口映射
需配置安全组,将服务器的端口(默认1194)映射到外网,否则客户端无法连接到服务。
四、客户端安装
openvpn客户端下载链接:
https://build.openvpn.net/downloads/releases/

安装后,导入配置文件(上一步中生成的配置文件)


测试IP地址已变成服务器公网IP

访问内网测试:

linux服务器连接:
# 安装客户端
yum install openvpn
# 启动服务
nohup /usr/sbin/openvpn --config /etc/openvpn/client/jumpserver.ovpn > /var/log/openvpn.log 2>&1 &
五、配置IP转发
目标:
有个RabbitMQ服务(106.11.22.33:15672),只允许让连接了 OpenVPN 的客户端能通过公网地址访问,未连接的无法访问。
实现方法:
- 在 OpenVPN 客户端添加静态路由:route 106.11.22.33 255.255.255.255,指定目标 IP 通过 OpenVPN 网卡转发;
- 用 tracert -d 106.11.22.33验证客户端流量是否经 OpenVPN 网卡传输;
- 在 OpenVPN 服务器配置路由转发功能,确保网络链路打通。
当前状态:
按上述步骤配置后未达预期效果,后续需排查问题(留坑待填)。
【实战一】
项目需求
背景
公司海外服务器部署在 AWS 上,但由于 AWS 服务器未对大陆网络进行优化,导致大陆用户访问体验较差。为了改善这一问题,我们购买了一台 CN2 GIA 线路的服务器作为跳板机,并在该跳板机上搭建了 OpenVPN 服务器。AWS 服务器和开发人员客户端通过 OpenVPN 客户端连接到该跳板机。
现状
OpenVPN 服务器(跳板机):位于 CN2 GIA 线路,用于优化大陆用户的网络访问。
AWS 服务器(线上服务器):部署在海外,未对大陆网络优化。
客户端(开发人员):位于大陆,通过 OpenVPN 客户端连接到跳板机。
由于 OpenVPN 服务器、AWS 服务器和客户端不在同一个局域网,需要解决以下问题:
目标
访问控制:
开发人员可以通过 OpenVPN 服务器(跳板机)访问 AWS 服务器。
AWS 服务器的指定端口仅允许 OpenVPN 客户端访问,确保安全性。
解决方案
配置 OpenVPN 服务器(跳板机):
在跳板机上搭建 OpenVPN 服务器,并配置路由,使 OpenVPN 客户端可以访问 AWS 服务器。
启用 client-to-client 选项,允许客户端之间通信。
实现方法参考本文“允许客户端之间直接通信”
注意:
在配置模板(/etc/openvpn/client-template.txt)里设置:
- 只允许在访问openvpn网段的流量时走openvpn的虚拟网卡,否则客户端的任何网络请求都会走openvpn网卡出去了:
route 10.8.0.0 255.255.255.0 - 强制客户端使用OpenVPN服务器提供的DNS,否则当你同时翻墙+openvpn时,内部系统的域名解析走的是翻墙的DNS,导致内部解析失效:
dhcp-option DNS 10.8.0.1
配置 AWS 服务器:
在 AWS 服务器上安装 OpenVPN 客户端,并连接到跳板机。
在AWS的后台配置服务器的防火墙,仅允许来自 OpenVPN 网络(如 10.8.0.0/24)的流量访问指定端口。
实现方法参考本文“linux服务器连接”
配置开发人员客户端:
开发人员通过 OpenVPN 客户端连接到跳板机。
连接后,开发人员可以通过跳板机访问 AWS 服务器,享受 CN2 GIA 线路的网络优化。
实现方法参考本文“配置文件模板”
【实战二】
目标:公司线上业务10.23.0.0/16和10.25.0.0/16,这些机器上有很多内部系统不能对外开放,只能公司内部访问。计划创建一个服务器,安装openVPN服务端+DNS+NG反代,这样客户端连上VPN后,可以通过该服务器跳转到线上真实后端应用服务器。
在该网段中新建一台openvpn服务器,安装openVPN-server服务
放开该云主机的服务端口
在PC下载客户端:https://build.openvpn.net/downloads/releases/OpenVPN-2.6.8-I001-amd64.msi
将服务端生成的配置文件放到PC指定的目录,连接–OK
但是发现一个问题,任何连上OPENVPN的客户端都可以ping通连上线上的所有IP,比如10.23.0.0/16
配置openvpn的iptables规则
-
需在这台OPENVPN服务器上配置iptables
# 启动firewalld服务: sudo yum install iptables-services sudo systemctl enable iptables sudo systemctl start iptables -
禁止OpenVPN服务器上的VPN流量访问10.23.0.0/16和10.25.0.0/16
# 允许OpenVPN流量通过 iptables -A INPUT -p tcp --dport 1194 -j ACCEPT # 拒绝从10.8.0.0/16网段到10.25.0.0/16网段的所有流量。 sudo iptables -A FORWARD -s 10.8.0.0/16 -d 10.25.0.0/16 -j DROP # 允许从10.8.0.0/16网段到10.16.253.210的所有流量。 sudo iptables -A FORWARD -s 10.8.0.0/16 -d 10.16.214.250 -j ACCEPT # 这样,当OpenVPN客户端连接到服务器后,它们将无法访问10.25.0.0/16网段,只能访问10.16.253.210这个地址。 -
保存配置
iptables规则在重启服务器后将被清除。如果希望规则在重启后仍然生效,可以将这些规则添加到iptables持久化配置中,# 这将把当前的iptables规则保存到`/etc/sysconfig/iptables`文件中。 service iptables save -
修改配置
iptables规则按照顺序进行匹配和应用。当有数据包流经防火墙时,防火墙会按照规则列表中的顺序逐个匹配规则,直到找到匹配的规则,然后执行该规则指定的操作。一旦匹配到一条规则并执行了相应的操作,后续的规则将不再被考虑。
可以使用iptables -L FORWARD –line-numbers命令来查看FORWARD链中的规则列表以及它们的顺序。如果需要重新调整规则的顺序,您可以使用iptables命令的–insert选项或–append选项来插入或追加规则。# 删除第二条: iptables -D FORWARD 2 # 插入规则 iptables -I FORWARD 1 -s 10.8.0.0/16 -d 10.16.214.250 -j ACCEPT
配置反向代理服务器
nginx反向代理服务器用宝塔搭建安装。
客户端修改hosts文件
修改客户端本机的hosts文件,将指定系统解析到openvpn服务端,
在域名解析里解析到反向代理的内网IP,默认其他人解析到内网地址了也无法访问,只有连上了vpn才可使用。免去本地修改hosts或者内部DNS的麻烦
修改VPN路由
因为我需要的是想走VPN的IP走VPN,但其他的网络访问都不走VPN。这样就需要自定义路由。主要由route-nopull、vpn_gateway、net_gateway三个参数决定。其中:
-
route-nopull:当客户端加入这个参数后,openvpn 连接后不会添加路由,也就是不会有任何网络请求走 openvpn。
-
vpn_gateway:当客户端加入 route-nopull 后,所有出去的访问都不从 Openvpn 出去,但可通过添加 vpn_gateway 参数使部分IP访问走 Openvpn 出去。
-
net_gateway:这个参数和 vpn_gateway 相反,表示在默认出去的访问全部走 Openvpn 时,强行指定部分IP访问不通过 Openvpn 出去. max-routes 参数表示可以添加路由的条数,默认只允许添加100条路由,如果少于100条路由可不加这个参数。
比较常用做法是在客户端配置文件中加上 route-nopull 再使用 vpn-gateway 逐条添加需要走 Openvpn 的 ip。设置如下:
route-nopull
route 10.16.214.250 255.255.255.255 vpn_gateway
如果想让之后生成的客户端配置都加上这个,需要在该文件添加上述两条:
vim /etc/openvpn/server/client-common.txt
设置好后我们进行验证可以发现,tracert -d www.baidu.com 走的出口是本地网卡,而10.16.214.250是走的openvpn的虚拟网卡
怎么查看openvpn的使用记录呢?
留坑

评论(0)