在家办公需要访问企业内的网络/服务的时候 需要使用虚拟专用网络(VPN)来进行访问
那么搭建的方法也有很多,本文讲述使用一台多网卡虚拟机centos8来做中转站(vpn-server)来实现此功能
基于LINUX的VPN服务测试(centos-8)
实验环境;==========================================================================
系统Centos
内网wmnet:192.168.0.0/24 —> 企业内网(无法访问网络)
vmnet1-nta模式:192.168.3.0/24 —> internet外网
配置网络============================================================================
vmvere网络配置 (模拟网络环境)
内部网络:
192.168.0.0 255.255.255.0 192.168.0.1
外部网络:
桥接 vmnet1-nta模式 与电脑局域网相同
192.168.3.0 255.255.255.0 192.168.3.1
openvpn 主机网络配置
企业内部:
内网vmnet --> 192.168.0.10 255.255.255.0 192.168.0.1
编辑内网网卡配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.0.123
NETMAST=255.255.255.0
GATEWAY=192.168.0.1
HWADDR=00:0C:29:DC:98:5B
UUID=c96bc909-188e-ec64-3a96-6a90982b08ad
|
外部网路:
vmnet1-nta模式 --> 192.168.3.25 255.255.255.0 192.168.3.1
编辑外部网络网卡配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-ens35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
UUID=ff79240c-c4d0-445c-af47-e2e9b03afb59
NAME=ens35
ONBOOT=yes
IPADDR=192.168.3.36
GATEWAY=192.168.3.1
DNS1=192.169.3.1
HWADDR=00:0C:29:DC:98:65
|
企业内部网络配置
windows-server 2022 –> 内网vmnet–>192.168.0.128 255.255.255.0
外部公网网络配置
windows10:–>vmnet1——nta模式 —> 192.168.3.100 255.255.255.0 192.168.3.1
服务端配置:==========================================================================
安装软件:
1
2
3
4
5
| yum update
yum upgrade
yum install net-tools #ifconfig命令
yum install vim #vim编辑器
yum install openssh-server #安装openssh服务端
|
开启ssh远程连接
1
2
3
4
| vim /etc/ssh/sshd_config #编辑sshd配置文件
Port 22 #取消注释端口 使其能监听22端口
ListenAddress :: #取消注释端口
PermitRootLogin yes #允许root登陆
|
重新启动sshd服务
systemctl restart sshd.service
1
2
3
4
5
| yum install openvpn #安装openvpn(有一些yum源:没有可用软件包 openvpn)
yum install -y epel-release
yum update -y
yum install -y openssl lzo pam openssl-devel lzo-devel pam-devel
yum install -y openvpn
|
安装easy-ras 证书制作工具
yum install easy-rsa
向openvpn-server文件夹拷贝证书制作文件
cp -r /usr/share/easy-rsa/3.0.8/ /etc/openvpn/server/
进入服务端配置目录
cd /etc/openvpn/server/3.0.8
查看目录
1
2
| pwd
-->/etc/openvpn/server/3.0.8 ###输出消息###
|
拷贝一份配置文件备用
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/server/3.0.8/
重命名vars
mv vars.example vars
创建服务端证书
vi vars #编辑模版配置文件
1
2
3
4
5
6
| set_var EASYRSA_REQ_COUNTRY "cn"
set_var EASYRSA_REQ_PROVINCE "beijing"
set_var EASYRSA_REQ_CITY "beijng"
set_var EASYRSA_REQ_ORG "hckz"
set_var EASYRSA_REQ_EMAIL "123123123@qq.com"
set_var EASYRSA_REQ_OU "hckz"
|
初始化一个新的PKI文件夹
./easyrsa init-pki
新建ca证书文件
./easyrsa build-ca
密码 (用于ca对之后生成的server和client证书签名时使用)
password
再次输入密码 (用于ca对之后生成的server和client证书签名时使用)
password
回车 #回车(可以键入回车使用默认的,也可以手动更改 )
创建时nopass表示不加密 就不会提示Enter PEM pass phrase
./easyrsa build-ca nopass
注意 本次用加密方式!!!
创建server证书
./easyrsa gen-req server nopass
回车 #确认
签约服务端证书
1
2
3
4
| ./easyrsa sign server server
yes #确认生成
password #密码
./easyrsa gen-dh #创建 Diffie-Hellman
|
#创建客户端证书
创建客户端目录(已经有目录就不要创建了)
1
2
3
| mkdir /etc/openvpn/client
cp -r /usr/share/easy-rsa/3.0.8/ /etc/openvpn/client/ #拷贝文件
cp /etc/openvpn/server/3.0.8/vars /etc/openvpn/client/3.0.8/ #拷贝var模版文件(使用在刚刚server中编辑后的文件)
|
初始化一个新的PKI文件夹
./easyrsa init-pki
生成te s t的证书
1
2
3
4
5
| ./easyrsa gen-req test nopass
回车 #(可以键入回车使用默认的,也可以手动更)
./easyrsa gen-req wang nopass #生成wang的证书
回车 #(可以键入回车使用默认的,也可以手动更)
|
签约客户端证书
1
2
3
4
| ./easyrsa import-req /etc/openvpn/client/easy-rsa/pki/reqs/test.req test #签约客户test证书
./easyrsa sign client test #签约客户test证书
yes #确认
password #密码
|
服务器端所需文件整理:===========================================================
1
2
3
4
5
6
| mkdir /etc/openvpn/server/keys
cp /etc/openvpn/server/3.0.8/pki/dh.pem /etc/openvpn/server/keys/ #拷贝pem文件
cp /etc/openvpn/server/3.0.8/pki/ca.crt /etc/openvpn/server/keys/ #拷贝crt文件
cp /etc/openvpn/server/3.0.8/pki/issued/server.crt /etc/openvpn/server/keys/ #拷贝crt文件
cp /etc/openvpn/server/3.0.8/pki/private/server.key /etc/openvpn/server/keys/ #拷贝key文件
|
查看一下文件
1
2
3
| ls
> ca.crt dh.pem server.crt server.key #输出
#稍后会建立ta.key文件 现在显示4个 最后应该显示5个文件ca.crt dh.pem server.crt server.key ta.key
|
1
2
3
4
5
| mkdir /etc/openvpn/client/test #创建目录
cp /etc/openvpn/server/3.0.8/pki/ca.crt /etc/openvpn/client/test/ #拷贝crt文件
cp /etc/openvpn/server/3.0.8/pki/issued/test.crt /etc/openvpn/client/test/ #拷贝crt文件
cp /etc/openvpn/client/3.0.8/pki/private/test.key /etc/openvpn/client/test/ #拷贝key文件
cp /etc/openvpn/server/keys/ta.key /etc/openvpn/client/test/ #拷贝key文件(在最后拷贝)
|
查看一下文件
1
2
3
| ls
> ca.crt test.crt test.key #输出
#稍后会建立client.ovpn ta.key文件 现在显示3个 最后应该显示5个文件ca.crt client.ovpn test.crt test.key ta.key
|
制作服务器配置文件:==============================================================
1
2
3
| cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/server/
cd /etc/openvpn/server/
vim server.conf
|
对照内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
| ###########################################################################
###########################################################################
;local a.b.c.d
#定义openvpn监听的IP地址,如果是服务器单网卡的也可以不注明,但是服务器是多网卡的建议注明。
port 1194
#定义openvpn监听的的端口,默认为1194端口。
proto udp
#定义openvpn使用的协议,默认使用UDP。如果是生产环境的话,建议使用TCP协议。
;dev tap
dev tun
#定义openvpn运行时使用哪一种模式,openvpn有两种运行模式一种是tap模式,一种是tun模式。
#tap模式也就是桥接模式,通过软件在系统中模拟出一个tap设备,该设备是一个二层设备,同时支持链路层协议。
#
;dev-node MyTap
#
ca /etc/openvpn/server/keys/ca.crt
cert /etc/openvpn/server/keys/server.crt
key /etc/openvpn/server/keys/server.key
dh /etc/openvpn/server/keys/dh.pem
#定义openvpn使用的CA证书文件,该文件通过build-ca命令生成,CA证书主要用于验证客户证书的合法性。
#定义openvpn服务器端使用的证书文件。
#定义openvpn服务器端使用的秘钥文件,该文件必须严格控制其安全性。
#定义Diffie hellman文件。
#
;topology subnet
#
server 10.8.0.0 255.255.255.0
#定义openvpn在使用tun路由模式时,分配给client端分配的IP地址段。
#
ifconfig-pool-persist /var/log/openvpn/ipp.txt
#定义客户端和虚拟ip地址之间的关系。特别是在openvpn重启时,再次连接的客户端将依然被分配和断开之前的IP地址。
#
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
#
;server-bridge
#
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
push "route 10.8.0.0 255.255.255.0"
push "route 192.168.0.0 255.255.255.0"
#向客户端推送的路由信息,假如客户端的IP地址为10.8.0.2,要访问192.168.10.0网段的话,使用这条命令就可以了。
#双网卡 一定要都写上 一个写server网段一个写内网网段 不然不通
#
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
#
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
#这条命令可以指定客户端IP地址。
#使用方法是在/etc/openvpn/创建ccd目录,然后创建在ccd目录下创建以客户端命名的文件。比如要设置客户端 wang为10.8.0.100这个IP地址,只要在 /etc/openvpn/ccd/wang文件中包含如下行即可:
#ifconfig-push 10.8.0.100 10.8.0.101 前面的IP是给客户端的,后面的IP是服务端保留的,分配的地址都是30位掩码
#
;learn-address ./script
#
;push "redirect-gateway def1 bypass-dhcp"
#此条开启后VPN将代理所有流量,建议不开,此条不开 以下两条也不用开
#
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
#向客户端推送DNS信息
#
;client-to-client
#使客户端之间能相互访问,默认设置下客户端间是不能相互访问的。
#
;duplicate-cn
#定义openvpn一个证书在同一时刻是否允许多个客户端接入,默认没有启用。
#
keepalive 10 120
#定义活动连接保时期限
#
tls-auth /etc/openvpn/server/keys/ta.key 0
#定义openvpn服务器端使用的秘钥文件,该文件必须严格控制其安全性(这个是拒绝访问用的,提高安全性)
#
cipher AES-256-GCM
#加密方式
#
;compress lz4-v2
;push "compress lz4-v2"
#
;comp-lzo
#启用允许数据压缩,客户端配置文件也需要有这项。
#
;max-clients 100
#
;user nobody
#运行用户
;group nogroup
#运行组
#
persist-key
persist-tun
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys。
#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的。否则网络连接,会先linkdown然后再linkup。
#
status /var/log/openvpn/openvpn-status.log
#把openvpn的一些状态信息写到文件中,比如客户端获得的IP地址。
#
;log /var/log/openvpn/openvpn.log
;log-append /var/log/openvpn/openvpn.log
#记录日志,每次重新启动openvpn后追加原有的log信息。
#
verb 3
#设置日志记录冗长级别,日志级别0-9,等级越高,记录越多
# 0 表示静默运行,只记录致命错误。
# 4 表示合理的常规用法。
# 5 和 6 可以帮助调试连接错误。
# 9 表示极度冗余,输出非常详细的日志信息
#
;mute 20
#重复日志记录限额
#
explicit-exit-notify 1
#
#####################################################################################
#####################################################################################
|
客户端配置文件==================================================================
cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/client.conf /etc/openvpn/client/test/
1
2
| cd /etc/openvpn/client/test
vim client.conf
|
对照以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| ################################################################
client
#指定这是一个客户端,我们将从服务器获取某些配置文件指令
#
;dev tap
dev tun
#定义openvpn运行时使用哪一种模式,openvpn有两种运行模式一种是tap模式,一种是tun模式。这里和服务端一样
#
;dev-node MyTap
#
;proto tcp
proto udp
#和服务端配置相同协议!!!
#
;remote my-server-1 1194
;remote my-server-2 1194
remote 192.168.3.36 1194
#服务端外网IP VPN端口
#如果有多个VPN服务器,为了实现负载均衡,你可以设置多个remote指令。
#
;remote-random
#如果有多个VPN服务器,打开后可以随机访问。
#
resolv-retry infinite
#启用该指令,与服务器连接中断后将自动重新连接,这在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。
#
nobind
#大多数客户端不需要绑定本机特定的端口号
#
;user nobody
;group nogroup
#
persist-key
persist-tun
# 持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。
#
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
#
;mute-replay-warnings
#
ca ca.crt
cert test.crt
key test.key
#服务器生成的三个客户端文件---记得改名字 改名字 改名字(放在与本配置文件相同目录中即可)
#
remote-cert-tls server
# 这是预防潜在攻击的一种重要措施
# 为了使用该功能,你需要在生成服务器端证书时,将其中的nsCertType字段设为"server"
# easy-rsa文件夹中的build-key-server脚本文件可以达到该目的。
#
tls-auth ta.key 1
#服务器生成的ta.key文件
#
cipher AES-256-GCM
#加密方式 与服务器相同
#
;comp-lzo
# 在VPN连接中启用压缩。
# 该指令的启用/禁用应该与服务器端保持一致。
#
verb 3
# 设置日志文件冗余级别(0~9)。
# 0 表示静默运行,只记录致命错误。
# 4 表示合理的常规用法。
# 5 和 6 可以帮助调试连接错误。
# 9 表示极度冗余,输出非常详细的日志信息
#
;mute 20
#重复日志记录限额
|
拷贝并重命名文件
cp client.conf client.ovpn
开启openvpn前的准备!!===========================================================
1.启用路由转发功能
1
2
| echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
|
2.建立ta.key #拒绝证书目录
cd /etc/openvpn/server/keys/
#进入该目录下
openvpn --genkey --secret ta.key
#创建拒绝证书
配置iptables ======================================================================
因为内网不配置网关无法联网 也无法进行回传 导致ping不通 所以需要进行设置
1
2
3
4
5
6
7
8
9
| /sbin/iptables -I INPUT -p tcp --dport 1194 -j ACCEPT #开启1194端口
/sbin/iptables -I INPUT -p udp --dport 1194 -j ACCEPT #开启1194端口
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
iptables -L -t nat #查看规则
正常输出:>>>
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.8.0.0/24 anywhere
|
列出iptables的列表(删除时使用)=================================================
iptables -t nat -L -n --line-number
删除nat规则表的第一个
iptables -t nat -D POSTROUTING 1
启动openvpn服务==============================================================
1
2
3
4
5
| openvpn --daemon --config server.conf #启动openvpn并指定server.conf文件
netstat -lntup | grep 1194 #查看端口占用
root@ubuntu:/etc/openvpn# netstat -lntup | grep 1194
udp 0 0 192.168.3.25:1194 0.0.0.0:* 4261/openvpn #输出显示本条目证明 openvpn开启成功
|
经过一夜的测试,本文搭建的服务可以正常使用。
⚠️警告:本文所涉及内容严禁用于违法用途,否则后果自负!!!