• 主页
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux
lufei0920 北京邮电大学 计算机科学技术  02月26日
Centos7搭建openvpn(1)
centos7安装配置openssl服务端+客户端
在CentOS 7环境下搭建OpenVPN服务,Windows客户端、Linux客户端通过OpenVPN服务访问后端机器。

1、环境要求
OpenVPN软件版本
Linux 安装:openvpn-2.4.9.tar.gz # GitHub地址:https://github.com/OpenVPN/openvpn
Linux 安装:easy-rsa-3.0.7.tar.gz # GitHub地址:https://github.com/OpenVPN/easy-rsa
widows安装:openvpn-install-2.4.9-I601-Win10.exe # OpenVPN官网

如果widows安装软件在官方访问失败,那么可以从如下地址下载:
https://www.techspot.com/downloads/5182-openvpn.html

环境需要有外网IP或通过防护墙可将内网IP做代理

2、VPN服务端配置要求:
OpenVPN机器配置必要修改:
开启转发功能并生效
## 不存在该配置则添加
grep 'net.ipv4.ip_forward = 1' /etc/sysctl.conf || echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
iptables配置
## 添加如下配置
iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -d 172.17.0.0/16 -o eth0 -j MASQUERADE # 添加转发策略,-s是设置的vpn的虚拟IP段,-d是设置的服务器内网环境IP
iptables-save > /etc/sysconfig/iptables # 保存转发策略
iptables -L -n -t nat # 查看设置的策略

原因:客户端连接VPN后,默认分配的10.8.0.0/24网段地址,不能直接访问web01或web02机器【这两台是172.16.10.0/24网段】,因此需要在iptables进行nat配置。

删除上面的iptables配置信息命令如下。作用:对比正常的访问和异常的访问
iptables -t nat -D POSTROUTING 1

系统时间与硬件时间同步:
crontab -l
*/10 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1

ll /etc/localtime # 使用上海时间
lrwxrwxrwx. 1 root root 33 Mar 9 03:59 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

hwclock --show # 查看硬件时间
hwclock --systohc # 系统时间同步到硬件时间

说明:如果时间不同步,那么VPN登录访问就可能存在问题。

3、服务端安装openvpn服务
安装依赖包
yum install -y lz4-devel lzo-devel pam-devel openssl-devel systemd-devel sqlite-devel
阿里服务器需要另外安装如下安装包
yum install -y autoconf automake libtool libtool-ltdl

从github上下载openvpn源代码包并解压后编译安装,最后建立软连接
wget https://github.com/OpenVPN/openvpn/archive/v2.4.9.tar.gz
mv v2.4.9.tar.gz openvpn-2.4.9.tar.gz
tar xf openvpn-2.4.9.tar.gz
cd openvpn-2.4.9/
autoreconf -i -v -f
./configure --prefix=/usr/local/openvpn --enable-lzo --enable-lz4 --enable-crypto --enable-server --enable-plugins --enable-port-share --enable-iproute2 --enable-pf --enable-plugin-auth-pam --enable-pam-dlopen --enable-systemd
make && make install
ln -s /usr/local/openvpn/sbin/openvpn /usr/local/sbin/openvpn

配置文件修改
# vim /usr/local/openvpn/lib/systemd/system/openvpn-server@.service
### 找到 ExecStart 这行,改为如下
ExecStart=/usr/local/openvpn/sbin/openvpn --config server.conf

配置系统服务,并开机自启动
cp -a /usr/local/openvpn/lib/systemd/system/openvpn-server@.service /usr/lib/systemd/system/openvpn.service
systemctl enable openvpn.service

4、服务端生成证书
easy-rsa下载与配置修改

下载easy-rsa并解压
cd /root/
wget https://github.com/OpenVPN/easy-rsa/archive/v3.0.7.tar.gz
mv v3.0.7.tar.gz easy-rsa-3.0.7.tar.gz
tar xf easy-rsa-3.0.7.tar.gz

根据easy-rsa-3.0.7/easyrsa3/vars.example文件生成全局配置文件vars
cd easy-rsa-3.0.7/easyrsa3
cp -a vars.example vars

修改vars文件,根据需要去掉注释,并修改对应值;或者直接在文件末尾追加如下信息:
# 国家
set_var EASYRSA_REQ_COUNTRY "CN"
# 省
set_var EASYRSA_REQ_PROVINCE "BJ"
# 城市
set_var EASYRSA_REQ_CITY "BeiJing"
# 组织
set_var EASYRSA_REQ_ORG "zhang"
# 邮箱
set_var EASYRSA_REQ_EMAIL "zhang@test.com"
# 拥有者
set_var EASYRSA_REQ_OU "ZJ"

# 长度
set_var EASYRSA_KEY_SIZE 2048
# 算法
set_var EASYRSA_ALGO rsa

# CA证书过期时间,单位天
set_var EASYRSA_CA_EXPIRE 36500
# 签发证书的有效期是多少天,单位天
set_var EASYRSA_CERT_EXPIRE 36500

生成服务端和客户端证书
初始化与创建CA根证书
./easyrsa init-pki
输入yes

初始化,会在当前目录创建PKI目录,用于存储一些中间变量及最终生成的证书
./easyrsa build-ca

操作说明:在这部分需要输入PEM密码 PEM pass phrase,输入两次,此密码必须记住,不然以后不能为证书签名。
还需要输入common name 通用名,如:openvpen,这个你自己随便设置个独一无二的。

生成服务端证书:
./easyrsa build-server-full server nopass
为服务端生成证书对并在本地签名。nopass参数生成一个无密码的证书;在此过程中会让你确认ca密码

创建Diffie-Hellman,确保key穿越不安全网络的命令,时间会有点长,耐心等待
./easyrsa gen-dh

生成客户端证书:
生成多个客户端证书
/root/easy-rsa-3.0.7/easyrsa3
./easyrsa build-client-full client nopass # 无密码,实际应用中不推荐,客户端有密码可提高安全性
./easyrsa build-client-full zhangsan # 先让你输入密码,后需要输入PEM密码,后续VPN连接时会使用
./easyrsa build-client-full lisi
./easyrsa build-client-full wangwu

为客户端生成证书对并在本地签名。nopass参数生成一个无密码的证书;在此过程中都会让你确认ca密码

为了提高安全性,生成ta.key
openvpn --genkey --secret ta.key

加强认证方式,防攻击。如果配置文件中启用此项(默认是启用的),就需要执行上述命令,并把ta.key放到/etc/openvpn/server目录。配置文件中服务端第二个参数为0,同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1。【服务端有该配置,那么客户端也必须要有】

整理服务端证书
mkdir -p /etc/openvpn/server/
cp -a pki/ca.crt /etc/openvpn/server/
cp -a pki/private/server.key /etc/openvpn/server/
cp -a pki/issued/server.crt /etc/openvpn/server/
cp -a pki/dh.pem /etc/openvpn/server/
cp -a ta.key /etc/openvpn/server/

创建服务端配置文件
参照openvpn-2.4.9/sample/sample-config-files/server.conf文件

cat /etc/openvpn/server/server.conf # 配置文件内容
local 0.0.0.0
port 1194
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.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 172.17.0.0 255.255.0.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

配置文件参数说明
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协议是可用

启动openvpn服务并查看进程与端口
systemctl start openvpn.service
ps -ef | grep 'open'
ss -tnl|grep 32311

日志文件说明:
/var/log/openvpn.log 所有日志信息
/etc/openvpn/server/openvpn-status.log 输出当前的连接信息,每分钟截断并重写一次该文件
/etc/openvpn/server/ipp.txt IP连接信息


5、Windows客户端配置与访问
安装完毕后会在「网络连接」中会多出一个本地连接

客户端client用户配置文件
备注:文件名 windows为client.ovpn,Linux为client.conf
需要的证书与配置文件如下:
注意路径,在OpenVPN/config目录下建立了client目录
ca.crt、client.crt、client.key、ta.key、client.ovpn都是之前创建好的,只有client.ovpn需要单独下载并修改。
备注:
client.crt,此文件是根据用户名创建的文件,查找方式find / -name "idc-ludonggui.crt"

client.ovpn内容如下:
client
dev tun
proto tcp
remote 10.0.0.190 1194 注:此ip是外网ip+端口
resolv-retry infinite
nobind
;user nobody
;group nobody
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
compress lz4-v2
verb 3
;mute 20

客户端zhangsan用户配置文件
备注:文件名 windows为zhangsan.ovpn,Linux为zhangsan.conf

需要的证书与配置文件如下
说明:
1、注意路径,在OpenVPN/config目录下建立了zhangsan目录
2、ca.crt、zhangsan.crt、zhangsan.key、ta.key、zhangsan.ovpn都是之前创建好的,只有zhangsan.ovpn需要单独下载并修改。

zhangsan.ovpn内容如下:
client
dev tun
proto tcp
remote 10.0.0.190 1194 #这里的地址需要修改为服务端的外网IP地址
resolv-retry infinite
nobind
;user nobody
;group nobody
persist-key
persist-tun
ca ca.crt
cert zhangsan.crt
key zhangsan.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
# 服务端用的什么,客户端就用的什么
#
...全文
浏览 点赞 收藏 回复
写回复
回复

还没有回复,快来抢沙发~

发动态
发帖子
Linux/Unix社区
创建于2007-08-27

7021

社区成员

7.3w+

社区内容

Linux/Unix社区 应用程序开发区
社区公告
暂无公告