这几天闲着没事干去折腾openvpn,没想到一路下来踩了无数坑,几乎所有的问题都遇到了(我自认为),经过不懈的努力,现在起码是能用了,接下来想将过程记录下来,以便大家能参考一下。
Ⅰ.服务端的配置
首先我们先安装3个依赖:
1.openvpn(服务器端)
2.easy-rsa(证书生成管理)
3.iptables-service(流量转发,服务器用作代理需要)
注:如果你想用自带的firewalld也是可以的,那么你就不用下载iptables了!但是,正所谓一山不容二虎,你不能同时两个都开起来啊,不然会导致连接不上的!但是我更推荐用iptables,问题比较少!
yum -y install openvpn easy-rsa iptables-services
1.生成服务端证书
将easy-rsa复制一份到openvpn文件目录下,方便我们整理操作
cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa
复制easy-rsa配置文件到/etc/openvpn/easy-rsa/3.0.8目录下,并重命名为vars(如果报错提示不存在这个路径 请查看文件路径的easy-rsa-3.0.8版本是不是与我的不同,如果是,则下你自己的版本路径即可)
cp -r /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/3.0.8/vars
选做:修改证书内容(主要是修改个人信息,反正我懒最后也没修改)
vim /etc/openvpn/easy-rsa/3.0.8/vars
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "GUANGDONG"
set_var EASYRSA_REQ_CITY "GUANGZHOU"
set_var EASYRSA_REQ_ORG "ROCK" #组织
set_var EASYRSA_REQ_EMAIL "24721009098@qq.com"
set_var EASYRSA_REQ_OU "LittleROCK" # 拥有者
初始化证书(之后如果想换证书需要从这里重新开始)
cd /etc/openvpn/easy-rsa/3.0.8
./easyrsa init-pki
接下来我们生成无密码ca证书(方便后续登录,反正也是个人使用)
./easyrsa build-ca nopass
创建server端证书和私钥文件
./easyrsa gen-req server nopass
给server端证书签名 期间需要输入yes确认
./easyrsa sign server server
创建dh文件,秘钥交换算法
./easyrsa gen-dh
创建tls认证秘钥
openvpn --genkey --secret ta.key
接下来将生成的证书拷贝到openvpn的文件目录下 方便管理
mkdir /etc/openvpn/certs
cp ./pki/ca.crt /etc/openvpn/certs/
cp ./pki/dh.pem /etc/openvpn/certs/
cp ./pki/issued/server.crt /etc/openvpn/certs
cp ./pki/private/server.key /etc/openvpn/certs
cp ta.key /etc/openvpn/certs
2.创建server配置文件
将openvpn的模板拷贝到文件夹中(当然你也可以自己创建一个同名文件)
同样,提示文件路径不存在注意查看openvpn的版本号是不是一样,不一样则换成自己的版本号(或者直接打开文件路径查看文件夹名称即可)
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/
修改配置文件
cd /etc/openvpn
vim server.conf
接下来我列出我的配置信息之后再逐一解释:
# 监听本机ip地址
local (这里填本机地址 你服务器的ip 在网卡中查看 ifconfig -> eth0 -> inet后面就是)
# 监控本机端口号
port 1149 #你运行的端口
# 指定采用的传输协议,可以选择tcp或udp
proto tcp
dev tun # 指定创建的通信隧道类型,可选tun或tap,window服务器必须是tap(tun支持手机上使用)
# 指定CA证书的文件路径
ca /etc/openvpn/certs/ca.crt
# 指定服务器端的证书文件路径
cert /etc/openvpn/certs/server.crt
# 指定服务器端的私钥文件路径
key /etc/openvpn/certs/server.key
# 指定迪菲赫尔曼参数的文件路径
dh /etc/openvpn/certs/dh.pem
# 指定虚拟局域网占用的IP地址段和子网掩码,不能和服务器eth0同网段
server 10.8.0.0 255.255.255.0
# 服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次 分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
ifconfig-pool-persist ipp.txt
# 自动推送客户端上的网关及DHCP,此项开启了流量转发,有这项才能使用服务器代理上网
push "redirect-gateway def1 bypass-dhcp"
# OpenVPN的DHCP功能为客户端提供指定的 DNS、WINS等
push "dhcp-option DNS 8.8.8.8"
# 备用DNS
push "dhcp-option DNS 8.8.4.4"
# 允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
client-to-client
# 允许同一个客户端证书多次登录,看需配置 这里前面的 ; 表示注释掉
;duplicate-cn
# 这个选项我选择注释掉的原因非常关键 建议大家先打开看看,文章的最后会补充我这里不开启的原因
;keepalive 10 120
# 开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
tls-auth /etc/openvpn/certs/ta.key 0
# 加密认证算法,2.4之前是AES-256-CBC
cipher AES-256-GCM
# 使用lzo压缩的通讯,服务端和客户端都必须配置
comp-lzo
# 最大连接用户
;max-clients 100
# 定义运行的用户和组,openvpn用户是安装的时候系统自动创建的
user openvpn
group openvpn
# 重启时仍保留一些状态
persist-key
persist-tun
# 输出短日志,每分钟刷新一次,以显示当前的客户端
status /var/log/openvpn-status.log
# 日志保存路径
log /etc/openvpn/log/openvpn.log
log-append /etc/openvpn/log/openvpn.log
# 指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细 3为普通运行等级 5-6是调试等级(如果你发现无法连接等问题可开启)
verb 3
#相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中
mute 20
# 下面这项只能udp连接开启
#explicit-exit-notify 1
# n秒后重新协商data chan. key (默认值=3600) 这里我设置为0意思是不协商 以防经常断连
reneg-sec 0
3.配置系统转发,如果想要代理上网的必须配置
允许转发
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
配置立即生效
sysctl -p
防火墙配置(使用iptables)注:推荐使用iptables,网上大部分都是用这个,问题比较少
关闭firewall防火墙
systemctl stop firewalld
systemctl disable firewalld
启动iptables
systemctl enable iptables
systemctl start iptables
配置iptables转发流量,代理主要以iptables转发实现
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
允许tcp/udp 通过防火墙(你用的什么协议就只写哪一条 写多了可能导致转发失败)
iptables -I INPUT -p tcp --dport 1194(你开放的openvpn端口) -j ACCEPT
iptables -I INPUT -p udp --dport 1194(你开放的openvpn端口) -j ACCEPT
保存规则并重启
service iptables save
systemctl restart iptables
防火墙配置(使用firewalld)
关闭iptables
systemctl stop iptables
systemctl disable iptables
启动firewalld
systemctl start firewalld
配置firewalld转发流量,代理主要以firewalld转发实现
开启防火墙伪装,开启后才能转发端口
firewall-cmd --add-masquerade --permanent
1111 端口转发 TCP 流量到 10.8.0.0:24 端口(1111端口可以设置成你喜欢的 如果你是udp那么将tcp改为udp 想删掉这些规则将add改为remove即可)
firewall-cmd --add-forward-port=port=1111:proto=tcp:toaddr=10.8.0.0:toport=24 --permanent
重启firewall
firewall-cmd --reload
4.创建启动的服务脚本文件
因centos可能没有unit文件(就算有也需要按照下面修改内容),还需要自己新建/修改一个才能启动openvpn服务,写入以下内容
vim /lib/systemd/system/openvpn@.service
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target
[Service]
Type=notify
PrivateTmp=true
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf
[Install]
WantedBy=multi-user.target
设置openvpn开机启动
systemctl enable openvpn@server
启动openvpn
systemctl start openvpn@server
查看是否成功启动
systemctl status openvpn@server
如果启动失败,打开日志文件夹查看日志
cd /etc/openvpn/log
cat openvpn.log
根据日志内容修改错误部分(一般错误都是由于server.conf文件配置错误导致的)
常见的错误有:
- 服务器监听ip输入错误
- 服务器端口被占用
- ca证书路径输入错误(或压根没写)
- 设置了 udp 却忘记开启explicit-exit-notify 1
- 设置了 tcp 却开启了 explicit-exit-notify 1
Ⅱ.客户端的配置
这里使用windows下的openvpn-2.4.8来演示,在网上下载好安装即可
1.导入证书
在服务端上,生成用户证书
cd /etc/openvpn/easy-rsa/3.0.8
生成客户端1的证书,客户端2依次类推
./easyrsa gen-req client1 nopass
注册客户端1的证书,要输入yes
./easyrsa sign client client1
将证书拷贝到一个目录存着
cp ./pki/issued/client1.crt /etc/openvpn/client
cp ./pki/private/client1.key /etc/openvpn/client
将client1.crt client1.key ta.key ca.crt四个文件下载到本地客户端目录的config目录下
配置客户端配置文件,拷贝客户端sample-config目录下的client.ovpn文件到config目录下
我这里采用Xftp来进行Linux和Windows的文件传输,非常方便。
2.配置客户端配置文件
下面简要写出我所有的配置内容
# 客户端
client
# 隧道类型,与服务器一致
dev tun
# tcp还是udp,与服务器一致
proto tcp
# 服务器ip和端口
remote 202.146.220.146 25000
# 自动重连
resolv-retry infinite
# 不绑定本地特定的端口
nobind
# 服务器重启后保持一些状态
persist-key
persist-tun
# 客户端证书目录
ca ca.crt
cert client1.crt
key client1.key
# 不明,推测是远程证书验证之类的
remote-cert-tls server
# tls握手秘钥,与服务器保持一致,服务器0,客户端1
tls-auth ta.key 1
# 加密方式与服务器一致
cipher AES-256-GCM
# 开启数据压缩与服务器一致
comp-lzo
verb 3
# 相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中
mute 20
# 使客户端中所有流量经过VPN,所有网络连接都使用vpn
redirect-gateway def1 bypass-dns
# 不保存密码
auth-nocache
如果你是云服务器,记得打开云服务器安全组里面的1194端口(你设置的端口)
至此,所有东西已经设置完成,尝试连接服务器并访问内网,尝试成不成功吧!
如果不成功或中途遇到问题,请看接下来我遇到的所有坑和解决方法:
Ⅲ.遇到的问题和解决方法
1.安装openvpn过程遇到的问题
- 你可能发现,当你直接输入openvpn的时候显示不存在这个命令,那么你一定是安装失败了,使用yum来安装比用wget安装来的方便,重新安装吧!
2.配置证书遇到的问题
- 你可能发现你输入我上文移动证书时的cp指令会失效,那么你一定是没看到我的注释!赶紧翻回去看看吧!
3.客户端无法连接服务器
- 查看客户端配置文件配置是否正确,常见错误:没有放齐4个证书(client1.crt client1.key ta.key ca.crt)
- 证书配置名称与证书名称不匹配(比如配置里面写的是client1.crt而实际名称是client.crt)
- 客户端证书不需要写路径(谁知道你会不会一时糊涂写上去了呢)
- 传输协议是否与服务器对应(两端必须同时为tcp或udp,tun或tap)
- 服务器连接ip、端口是否正确(一般ip不是你在服务端看到的ip,是你外网连接服务器的ip)
- 服务器和客户端是否同时设置了comp-lzo,加密算法是不是同时是cipher AES-256-GCM
- 请检查你的防火墙,转发设置是否正确,端口是否占用,是否只开了一个防火墙(firewalld 或 iptables)一般很大程度上连接不上都是防火墙设置有误导致的!
4.连接上了,能Ping通服务端(10.8.0.1)但是却不能访问互联网
- 检查你的防火墙流量转发设置有没有正确
- 查看防火墙设置是不是混入了奇怪的规则(比如同时设置了tcp和udp传输限制)使用:iptables -F (flush 清除所有的已定规则)、iptables -X (delete 删除所有用户“自定义”的链(tables))、iptables -Z (zero 将所有的chain的计数与流量统计都归零)重新输入防火墙规则,如果还是不行那么就仅写入iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE 规则看看行不行(如果可以 可能是你端口写错了)
- 关掉windows防火墙(一般不是这个原因,最简单的测试方法就是换一台电脑再试一次)
5.连接上了,也能访问互联网,但是一段时间过后自己断开,并且需要换一个端口才能重新连上,并且一段时间自己断开,并且需要换一个端口......
这个问题真的是困扰了我好久,最主要的是还会禁用端口!(我的1145端口以及很多其他端口也就再也连不上了)并且我是个Linux小白,并不知道具体原因,但是通过我的修改了配置文件里的参数莫名其妙就好了
- 将 keepalive规则注释掉(这个非常重要!具体原因未知,应该是tcp协议种种问题导致的)这个是保持客户端与服务器之间的连接所需要的参数,但是让我一直断开并且封禁我端口是咋回事啊喂!
Ⅳ.小结
至此,所有内容写完,如果大家还是有问题,可以将配置文件里面的verb设置成5或6,然后打开log文件(/etc/openvpn/log/openvpn.log)复制错误信息上网百度一下。在安装openvpn的这3天里,踩了无数的坑,希望看到这篇文章的你能通过这篇文章,少走弯路,建立一个属于你自己的vpn!
本文参考链接:
Comments | 4 条评论
博主 Lunar eclipse
wow,真厉害
博主 苏寅
关闭OpenVPN服务:
重启OpenVPN服务:
博主 苏寅
前边的都成功了,到客户端这里出错了:
╰─# ./easyrsa sign client client1
Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/3.0.8/vars
Using SSL: openssl OpenSSL 1.1.1u 30 May 2023
Easy-RSA error:
No request found for the input: ‘client1’
Expected to find the request at: /etc/openvpn/easy-rsa/3.0.8/pki/reqs/client1.req
博主 苏寅
卸载 OpenVPN