科技 > 操作系统 > Windows

Centos7环境实现内网服务访问方式

7人参与 2025-12-19 Windows

什么是 openvpn

openvpn 原理

openvpn 核心机制就是在 openvpn 服务器和客户端所在的计算机上都安装一个虚拟网卡 (又称虚拟网络适配器),并获得一个对应的虚拟 ip 地址

openvpn 的服务器和多个客户端就可以通过虚拟网卡,使用这些虚拟 ip 进行相互访问了

vpn 的常用实现方式

vpn 分类

摘抄自 深信服社区

vpn 技术:在公有网络中构建专用虚拟网络

按协议分类:

按协议层分类:

数据链路层 [ 第二层 ]

网络层 [ 第三层 ]

pptp vpn

点对点隧道协议

一种支持多协议虚拟专用网络(vpn)的网络技术

以同样工作在第二层的点对点传输协议ppp )为基础,

pptp vpn 的实现需要:

l2tp vpn

二层隧道协议:

l2f - 第二层转发协议

结合 pptpl2f 两种二层隧道协议的优点

l2tp 基于 udp 协议

l2tp 的实现与 pptp 不同

mpls vpn

多协议标签交换:

一种用于快速数据包交换路由的体系

传统的 vpn 是基于 pptpl2tp 等隧道协议来实现私有网络间数据流在公网上的传送

mpls vpn 网络主要由 cepep 等 3 部分组成

ipsec vpn

internet 协议安全性:

ipsec 不是一个单独的协议,它给出了应用于 ip 层上网络数据安全的一整套体系结构,该体系结构包括:

ipsec 可以在两种模式下运行

传输模式 - 被用来计算 ah 或 esp 头,ah 或 esp 头以及 esp 加密的用户数据被放置在原 ip 包头后面。通常,传输模式应用在两台主机之间的通讯,或一台主机和一个安全网关之间的通讯

隧道模式 - 用户的整个 ip 数据包被用来计算 ah 或 esp 头,ah 或 esp 头以及 esp 加密的用户数据被封装在一个新的 ip 数据包中。通常,隧道模式应用在两个安全网关之间的通讯。由此可知隧道模式可以掩盖原 ip 地址实现异地网络访问内部网络,也就是 vpn

ipsec vpn 可在 windowslinux 环境下搭建

或者通过配置防火墙路由器第三方软件实现

gre vpn

通用路由封装协议(generic routing encapsulation)

ssl vpn

·安全套接层协议( secure sockets layer )·

ssl 协议可分为两层

openvpn

基于 ssl 加密的应用层 vpn 协议:

服务程序可以在应用层打开虚拟网卡

openvpn 部署

openvpn 需要 epel

yum provides /usr/*bin/openvpn

没有 epel 源会有下面的报错

no matches found

使用下面的命令可以安装 epel 源

yum install -y epel-release.noarch

epel 源 就会输出相关的信息

loaded plugins: fastestmirror, langpacks
loading mirror speeds from cached hostfile
openvpn-2.4.12-1.el7.x86_64 : a full-featured ssl vpn solution
repo        : epel
matched from:
filename    : /usr/sbin/openvpn

安装 openvpn

easy-rsa 可以用来生成 open vpn 服务端需要的证书

yum install -y openvpn easy-rsa

配置服务端配置文件

cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/
###########################################################################
# 针对多客户端的openvpn 2.0 的服务器端配置文件示例                           
# 
# 本文件用于多客户端<->单服务器端的openvpn服务器端配置                       
#
# openvpn也支持单机<->单机的配置(更多信息请查看网站上的示例页面)              
#
# 该配置支持windows或者linux/bsd系统。此外,在windows上,记得将路径加上双引号,
# 并且使用两个反斜杠,例如:"c:\\program files\\openvpn\\config\\foo.key" 
#
# '#' or ';'开头的均为注释内容
###########################################################################

# openvpn应该监听本机的哪些ip地址
# 该命令是可选的,如果不设置,则默认监听本机的所有ip地址
;local a.b.c.d

# openvpn 应该监听哪个 tcp/udp 端口
# 如果你想在同一台计算机上运行多个 openvpn 实例,你可以使用不同的端口号来区分它们
# 此外,你需要在防火墙上开放这些端口
port 1194

# openvpn 使用 tcp 还是 udp 协议
;proto tcp
proto udp

# 指定 openvpn 创建的通信隧道类型
# "dev tun" 将会创建一个路由ip隧道
# "dev tap" 将会创建一个以太网隧道
# 如果你是以太网桥接模式,并且提前创建了一个名为 "tap0" 的与以太网接口进行桥接的虚拟接口,则你可以使用 "dev tap0"
# 如果你想控制 vpn 的访问策略,你必须为 tun/tap 接口创建防火墙规则
# 在非windows系统中,你可以给出明确的单位编号(unit number),例如"tun0"
# 在 windows 中,你也可以使用 "dev-node"
# 在多数系统中,除非你部分禁用或者完全禁用了 tun/tap 接口的防火墙,否则 vpn 将不起作用
;dev tap
dev tun

# 如果你想配置多个隧道,你需要用到网络连接面板中 tap-win32 适配器的名称(例如 "mytap" )
# 在 xp sp2 或更高版本的系统中,你可能需要有选择地禁用掉针对 tap 适配器的防火墙
# 通常情况下,非windows系统则不需要该指令
;dev-node mytap

# 设置ssl/tls根证书(ca)、证书(cert)和私钥(key)
# 每个客户端和服务器端都需要它们各自的证书和私钥文件
# 服务器端和所有的客户端都将使用相同的ca证书文件
# 通过 easy-rsa 目录下的一系列脚本可以生成所需的证书和私钥
# 记住,服务器端和每个客户端的证书必须使用唯一的 common name
# 你也可以使用遵循 x509 标准的任何密钥管理系统来生成证书和私钥。
# openvpn 也支持使用一个 pkcs #12 格式的密钥文件(详情查看站点手册页面的 "pkcs12" 指令)
ca ca.crt
cert server.crt
# 该文件应该保密
key server.key

# diffie hellman parameters 算法
# 你可以使用如下名称命令生成你的文件:
#   openssl dhparam -out dh1024.pem 1024
# 如果你使用的是2048位密钥,使用2048替换其中的1024
dh dh2048.pem

# 网络拓扑结构
# 应为子网(通过 ip 寻址),除非必须支持 windows 客户端 v2.0.9 或更低版本
# (然后是 net30,即每个客户端一个 /30)
# 默认值为 net30(不推荐)
topology subnet

# 设置服务器端模式,并提供一个 vpn 子网,以便于从中为客户端分配 ip 地址
# 在此处的示例中,服务器端自身将占用 10.8.0.1,其他的将提供客户端使用
# 如果你使用的是以太网桥接模式,请注释掉该行。更多信息请查看官方手册页面
server 10.8.0.0 255.255.255.0

# 指定用于记录客户端和虚拟 ip 地址的关联关系的文件
# 当重启 openvpn 时,再次连接的客户端将分配到与上一次分配相同的虚拟ip地址
ifconfig-pool-persist ipp.txt

# 该指令仅针对以太网桥接模式
# 首先,你必须使用操作系统的桥接能力将以太网网卡接口和tap接口进行桥接
# 然后,你需要手动设置桥接接口的ip地址、子网掩码;在这里,我们假设为 10.8.0.4 和 255.255.255.0
# 最后,我们必须指定子网的一个ip范围 (例如从 10.8.0.50 开始,到 10.8.0.100 结束),以便于分配给连接的客户端
# 如果你不是以太网桥接模式,直接注释掉这行指令即可
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

# 该指令仅针对使用 dhcp 代理的以太网桥接模式,
# 此时客户端将请求服务器端的 dhcp 服务器,从而获得分配给它的 ip 地址和 dns 服务器地址
# 在此之前,你也需要先将以太网网卡接口和 tap 接口进行桥接
# 注意:该指令仅用于 openvpn 客户端,并且该客户端的 tap 适配器需要绑定到一个 dhcp 客户端上
;server-bridge

# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网
# (简而言之,就是允许客户端访问 vpn 服务器自身所在的其他局域网)
# 记住,这些私有子网也要将 openvpn 客户端的地址池( 10.8.0.0/255.255.255.0 )反馈回 openvpn 服务器
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"

# 为指定的客户端分配指定的 ip 地址,或者客户端背后也有一个私有子网想要访问 vpn,
# 那么你可以针对该客户端的配置文件使用ccd子目录
# (简而言之,就是允许客户端所在的局域网成员也能够访问vpn)
# 举个例子:假设有个 common name 为 "thelonious" 的客户端背后也有一个小型子网想要连接到 vpn,
# 该子网为 192.168.40.128/255.255.255.248
# 首先,你需要去掉下面两行指令的注释:
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# 然后创建一个文件 ccd/thelonious,该文件的内容为:
#     iroute 192.168.40.128 255.255.255.248
# 这样客户端所在的局域网就可以访问vpn了
# 注意,这个指令只能在你是基于路由、而不是基于桥接的模式下才能生效
# 比如,你使用了 "dev tun" 和 "server" 指令

# 再举个例子:假设你想给 thelonious 分配一个固定的ip地址 10.9.0.1
# 首先,你需要去掉下面两行指令的注释:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# 然后在文件 ccd/thelonious 中添加如下指令:
#   ifconfig-push 10.9.0.1 10.9.0.2

# 如果你想要为不同群组的客户端启用不同的防火墙访问策略,你可以使用如下两种方法:
# (1) 运行多个 openvpn 守护进程,每个进程对应一个群组,并为每个进程(群组)启用适当的防火墙规则
# (2) (进阶)创建一个脚本来动态地修改响应于来自不同客户的防火墙规则
# 关于 learn-address 脚本的更多信息请参考官方手册页面
;learn-address ./script

# 如果启用该指令,所有客户端的默认网关都将重定向到vpn,这将导致诸如 web 浏览器、dns 查询等所有客户端流量都经过vpn
# (为确保能正常工作,openvpn 服务器所在计算机可能需要在 tun/tap 接口与以太网之间使用 nat 或桥接技术进行连接)
;push "redirect-gateway def1 bypass-dhcp"

# 某些具体的 windows 网络设置可以被推送到客户端,例如 dns 或 wins 服务器地址
# 下列地址来自 opendns.com 提供的 public dns 服务器
;push "dhcp-option dns 208.67.222.222"
;push "dhcp-option dns 208.67.220.220"
;push "dhcp-option dns 114.114.114.114"

# 去掉该指令的注释将允许不同的客户端之间相互"可见"(允许客户端之间互相访问)
# 默认情况下,客户端只能"看见"服务器
# 为了确保客户端只能看见服务器,你还可以在服务器端的 tun/tap 接口上设置适当的防火墙规则
;client-to-client

# 如果多个客户端可能使用相同的证书/私钥文件或 common name 进行连接,那么你可以取消该指令的注释。
# 建议该指令仅用于测试目的。对于生产使用环境而言,每个客户端都应该拥有自己的证书和私钥。
# 如果你没有为每个客户端分别生成 common name 唯一的证书/私钥,你可以取消该行的注释 (但不推荐这样做)
;duplicate-cn

# keepalive 指令将导致类似于 ping 命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭
# 每 10 秒钟 ping一次,如果 120 秒内都没有收到对方的回复,则表示远程连接已经关闭
keepalive 10 120

# 出于 ssl/tls 之外更多的安全考虑,创建一个 "hmac 防火墙" 可以帮助抵御 dos 攻击和 udp 端口淹没攻击
# 你可以使用以下命令来生成:
#   openvpn --genkey --secret ta.key
# 服务器和每个客户端都需要拥有该密钥的一个拷贝
# 第二个参数在服务器端应该为'0',在客户端应该为'1'
# 该文件应该保密
tls-auth ta.key 0

# 选择一个密码加密算法。
# 该配置项也必须复制到每个客户端配置文件中
# 注意,v2.4 客户端 / 服务器将在 tls 模式下自动协商 aes-256-gcm
# 另请参阅手册页中的 ncp 密码选项
cipher aes-256-cbc

# 在 vpn 链接上启用压缩并将该选项推送到客户端(仅限 v2.4+,早期版本请参见下文)
;compress lz4-v2
;push "compress lz4-v2"

# 在vpn连接上启用压缩
# 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它
;comp-lzo

# 客户端最大连接数
max-clients 100

# 在完成初始化工作之后,降低 openvpn 守护进程的权限是个不错的主意
# 该指令仅限于非 windows 系统中使用
;user nobody
;group nobody

# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源
persist-key
persist-tun

# 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次
status openvpn-status.log

# 默认情况下,日志消息将写入 syslog (在 windows 系统中,如果以服务方式运行,日志消息将写入 openvpn 安装目录的 log 文件夹中)
# 你可以使用 log 或者 log-append 来改变这种默认情况
# "log" 方式在每次启动时都会清空之前的日志文件
# "log-append" 这是在之前的日志内容后进行追加
# 你可以使用两种方式之一(但不要同时使用)
;log         openvpn.log
;log-append  openvpn.log

# 为日志文件设置适当的冗余级别 (0~9)
# 冗余级别越高,输出的信息越详细
# 0 表示静默运行,只记录致命错误
# 4 表示合理的常规用法
# 5 和 6 可以帮助调试连接错误
# 9 表示极度冗余,输出非常详细的日志信息
verb 3

# 重复信息的沉默度
# 相同类别的信息只有前 20 条会输出到日志文件中
;mute 20

# 通知客户端,当服务器重新启动时,它可以自动重新连接 [ 这个必须 proto 配置为 udp 才行 ]
# 如果不是 udp 模式,会报错 'options error: --explicit-exit-notify can only be used with --proto udp'
explicit-exit-notify 1

根据自己的实际情况,配置好服务端的配置文件

port 31194
proto tcp
dev tun
ca /etc/openvpn/server/cert/ca.crt
# 这里要以自己实际的证书文件名称来命名,以自己的实际场景为准
cert /etc/openvpn/server/cert/chen2ha.crt
# 这里要以自己实际的证书文件名称来命名,以自己的实际场景为准
key /etc/openvpn/server/cert/chen2ha.key
dh /etc/openvpn/server/cert/dh2048.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0 255.255.252.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option dns 114.114.114.114"
keepalive 10 120
cipher aes-256-cbc
comp-lzo
max-clients 100
persist-key
persist-tun
status /etc/openvpn/server/logs/openvpn-status.log
log-append  /etc/openvpn/server/logs/openvpn.log
verb 3
mute 20

创建相关的路径

mkdir /etc/openvpn/server/{cert,logs}

生成 ca 证书

复制 easy-rsa 文件

cp -r /usr/share/easy-rsa /etc/openvpn/

复制 easy-rsa 变量配置文件

cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/3/vars

配置变量文件

# 所在的国家
set_var easyrsa_req_country "cn"
# 所在的省份
set_var easyrsa_req_province "shang hai"
# 所在的城市
set_var easyrsa_req_city "shang hai"
# 所属的组织
set_var easyrsa_req_org "devops"
# 邮件地址
set_var easyrsa_req_email "chen2ha@devops.com"
# 组织单位,部门
set_var easyrsa_req_ou "openvpn"
# 密钥长度
set_var easyrsa_key_size 2048
# 算法
set_var easyrsa_algo rsa
# ca 有效期,单位为天
set_var easyrsa_ca_expire 365000
# 服务端和客户端证书有效期,单位为天
set_var easyrsa_cert_expire 3650

初始化 pki 相关目录和文件

cd /etc/openvpn/easy-rsa/3
./easyrsa init-pki

创建 ca 机构

common name (eg: your user, host, or server name) [easy-rsa ca]: 可以随意填写,也可以直接回车

./easyrsa build-ca nopass

完成后,会提示 ca 证书的路径

your new ca certificate file for publishing is at:
/etc/openvpn/easy-rsa/3/pki/ca.crt

复制 ca 证书到配置文件指定的路径下

cp /etc/openvpn/easy-rsa/3/pki/ca.crt /etc/openvpn/server/cert/

创建服务端证书流程

以下的申请文件和颁发,可以归结成一个命令

cd /etc/openvpn/easy-rsa/3
./easyrsa build-server-full chen2ha nopass

创建服务端证书申请文件

chen2ha 表示生成的 申请文件的名称,生成的文件名称为:chen2ha.reqchen2ha.key

common name (eg: your user, host, or server name) [chen2ha]: 直接回车

cd /etc/openvpn/easy-rsa/3
./easyrsa gen-req chen2ha nopass

完成后,会提示证书的路径

keypair and certificate request completed. your files are:
req: /etc/openvpn/easy-rsa/3/pki/reqs/chen2ha.req
key: /etc/openvpn/easy-rsa/3/pki/private/chen2ha.key

复制证书到配置文件指定的路径下

cp /etc/openvpn/easy-rsa/3/pki/private/chen2ha.key /etc/openvpn/server/cert/chen2ha.key

颁发服务端证书

server 表示类型

./easyrsa sign server chen2ha

完成后,会提示证书的路径

certificate created at: /etc/openvpn/easy-rsa/3/pki/issued/chen2ha.crt

复制证书到配置文件指定的路径下

cp /etc/openvpn/easy-rsa/3/pki/issued/chen2ha.crt /etc/openvpn/server/cert/chen2ha.crt

创建 diffie-hellman 密钥

注意 -out 参数后面的路径和文件名称要改成和配置文件里面的一致

openssl dhparam -out /etc/openvpn/server/cert/dh2048.pem 2048

服务端开启 ip_forward 功能

查看服务端是否开启了

grep net.ipv4.ip_forward /etc/sysctl.conf

如果返回为空,执行下面的命令

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

如果返回 net.ipv4.ip_forward = 0,执行下面的命令

sed -i 's/net.ipv4.ip_forward.*/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf

使功能立即生效

sysctl -p

添加 snat 规则

iptables -t nat -a postrouting -s 10.8.0.0/24 -j masquerade

如果没有其他 iptables 规则,可以执行 iptables save 保存这条规则,如果不确定,可以把这条命令追加到 /etc/rc.d/rc.local 文件内

/etc/rc.d/rc.local 文件必须要有执行权限才能保证开机后会被读取

echo 'iptables -t nat -a postrouting -s 10.8.0.0/24 -j masquerade' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local

启动 openvpn 服务

实际的 unit 文件名称是 openvpn@.service

systemctl enable --now openvpn@server

验证隧道网卡是否创建成功

ifconfig tun0

创建客户端证书

同样可以总结成一个命令

cd /etc/openvpn/easy-rsa/3
./easyrsa build-client-full zhangsan nopass

创建客户端证书申请文件

和服务端的操作方式一致,只需要将 zhangsan 替换成自己需要分配的人员名称即可

cd /etc/openvpn/easy-rsa/3
./easyrsa gen-req zhangsan nopass

颁发客户端证书

./easyrsa sign client zhangsan

配置客户端配置文件

需要以 .ovpn 后缀,配置的解释和 server 端的一致

client
dev tun
proto tcp
remote <公网 ip> 1194
# 无限期地尝试解析 openvpn 服务器的主机名
## 对于笔记本电脑等未永久连接到互联网的机器非常有用
resolv-retry infinite
# 大多数客户端不需要绑定到特定的本地端口号
nobind
persist-key
persist-tun
ca ca.crt
# 用户的证书文件名称
cert <用户名称>.crt
key <用户名称>.key
remote-cert-tls server
verb 3
comp-lzo
route <ip> <netmask> vpn_gateway
# 客户端路由配置
# route-nopull - openvpn 连接后不会添加路由,也就是不会有任何网络请求走 openvpn
# vpn_gateway - 指定 ip 的网络请求走 openvpn
# net_gateway - 和 vpn_gateway 相反,表示在默认出去的访问全部走 openvpn 时,强行指定部分 ip 访问不通过 openvpn 出去
## max-routes 参数表示可以添加路由的条数,默认只允许添加 100 条路由,如果少于 100 条路由可不加这个参数

打包客户端证书

mkdir /etc/openvpn/client/zhangsan
vim /etc/openvpn/client/zhangsan/zhangsan.ovpn
client
dev tun
proto tcp
remote <公网 ip> 31194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert zhangsan.crt
key zhangsan.key
remote-cert-tls server
verb 3
comp-lzo
route 10.0.0.0 255.255.252.0 vpn_gateway

汇总证书文件

cp /etc/openvpn/easy-rsa/3/pki/ca.crt /etc/openvpn/client/zhangsan/
for i in crt key;do find /etc/openvpn/easy-rsa/3/pki/ -name "zhangsan.${i}" -exec cp {} /etc/openvpn/client/zhangsan/ \;;done

打包证书和配置文件

cd /etc/openvpn/client/
tar czf zhangsan.tgz zhangsan/*

删除客户端证书

执行完命令后,相关的证书文件都会被删除,如果做了上面的证书汇总的操作,也要记得把汇总的文件删除了,避免后期的管理混乱

cd /etc/openvpn/easy-rsa/3
./easyrsa revoke zhangsan

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

centos7访问windows系统的共享文件夹详解

12-19

Win11开始菜单怎么添加文件夹快捷入口?

12-19

系统崩溃的全新后悔药! Win11时间点还原功能使用指南

12-19

Win11怎么使用AI操作功能一键处理图片和文档?

12-19

Win11怎么启用和禁用文件资源管理器预加载功能?

12-19

win11系统怎么重置Windows Defender防火墙规则?

12-19

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论