OpenVPN
实验室OpenVPN使用场景
- 首先有一个常年挂网络通的,可以校外网IP直连的机器A。
- 使用OpenVPN,将对内网机器的ssh请求,通过A机器转发。
所以如果没有可以校外网IP直连的机器A,OpenVPN是没有意义的。
配置OpenVPN服务器端
google openvpn查看 ubuntu https://ywnz.com/linuxyffq/3952.html
- 安装OpenVPN服务
- 安装easy-rsa,用来制作证书
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.5/EasyRSA-nix-3.0.5.tgz
- 生成CA证书(crt=cert) 有ca.crt和ca.key两个文件
- 生成server端证书
- KEY_NAME = qszyvpn
- 应有qszyvpn.crt、qszyvpn.csr、qszyvpn.key三个文件
- 为服务器生成加密交换时的秘钥协议,应有dh2018.pem文件
- 生成Client端证书
- 应有client1.crt、client1.csr、client1.key三个文件
- 修改配置文件server.conf
- 配置规则
- 运行
- 查看端口占用
具体服务器端文件生成命令
test on snode0
# 安装
sudo apt-get install openvpn
sudo apt-get install easy-rsa
# 配置easy-rsa
cd /etc/openvpn/server
cp -r /usr/share/easy-rsa/ .
## 拷贝模板并修改vars的参数
cp vars.example vars
vim vars
# 配置Easyrsa及生成公钥
./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/server/easy-rsa/pki
./easyrsa build-ca nopass
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:acsa
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/server/easy-rsa/pki/ca.crt
# 生成服务器私钥和请求
./easyrsa gen-req shaojie nopass
Common Name (eg: your user, host, or server name) [shaojie]:
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/server/easy-rsa/pki/reqs/shaojie.req
key: /etc/openvpn/server/easy-rsa/pki/private/shaojie.key
# 拷贝服务器私钥文件到openvpn配置文件目录下
cp pki/private/shaojie.key /etc/openvpn/server
# 生成服务器证书
mv pki/reqs/shaojie.req pki/reqs/shaojieServer.req
./easyrsa import-req pki/reqs/shaojieServer.req shaojie
Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020
The request has been successfully imported with a short name of: shaojie
You may now use this name to perform signing operations on this request.
./easyrsa sign-req server shaojie
cp pki/ca.crt pki/issued/shaojie.crt /etc/openvpn/server
# 生成加密文件(可选,可以提高VPN安全性),这个比较慢,需要稍等几分钟
./easyrsa gen-dh
DH parameters of size 2048 created at /etc/openvpn/server/easy-rsa/pki/dh.pem
openvpn --genkey --secret ta.key #生成随机密钥(仅适用于非TLS静态密钥加密模式):--genkey : 生成一个随机密钥作为共享密钥
cp ta.key pki/dh.pem /etc/openvpn/server
openvpn配置文件
# 拷贝解压
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server
gzip -d /etc/openvpn/server/server.conf.gz
vim /etc/openvpn/server/server.conf
# 监听的端口号,默认1194,如果要改的话防火墙也要相应修改。(可选)
port 1194
#TCP或UDP,如改成tcp的话,通常端口相应修改成443
;proto tcp
proto udp
# 设置SSL/TLS根证书(ca)、证书(cert)和私钥(key),记得我的服务器名是axvpn,这里也要相应修改 (必选)
ca ca.crt
cert shaojie.crt
key shaojie.key
# 指定迪菲·赫尔曼参数。
# 默认是dh2048.pem, 记得我们生成了dh.pem,改下 (必选)
dh dh.pem
# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。 (可选)
# 就是允许客户端访问VPN服务器自身所在的其他局域网
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
push "route 10.111.0.0 255.255.0.0"
# 如果启用该指令,所有客户端的默认网关都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。(可选)
;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 8.8.8.8"
# 如果有注释的话,取消这句的注释,再加一句 (必选)
#防DDOS攻击,openvpn控制通道的tls握手进行保护,服务器端0,客户端1
tls-auth ta.key 0 # 该文件应该保密
key-direction 0
# 选择一个密码加密算法。
# 该配置项也必须复制到每个客户端配置文件中。
# 添加SHA256算法
cipher AES-256-CBC
auth SHA256
# 在完成初始化工作之后,降低OpenVPN守护进程的权限, (最好取消注释)
# 该指令仅限于非Windows系统中使用。
user nobody
group nobody
# Notify the client that when the server restarts so it
# can automatically reconnect.
# 如果协议改成了TCP,这里数值要改成0
explicit-exit-notify 1
#推送一条路由信息给客户端
#推送路由,若是推送失败,需要检查server 是否设置正常,该故障我遇到过,设置ifconfig-pool了,发现推送失效
push "route 192.168.11.0 255.255.255.0" #(即这个网段的IP的信息都经过VPN)
#记录日志,每次重新启动openvpn后追加原有的log信息
log-append /var/log/openvpn.log
配置OpenVPN客户器端
或者设置isc.ovpn(中间两项是client的)
OneDrive下有snode6的ovpn文件具体客户器端文件生成命令
# 生成客户端私钥和请求
./easyrsa gen-req tsjclient nopass
Common Name (eg: your user, host, or server name) [tsjclient]:
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/server/easy-rsa/pki/reqs/tsjclient.req
key: /etc/openvpn/server/easy-rsa/pki/private/tsjclient.key
# 同理生成证书
mv pki/reqs/tsjclient.req pki/reqs/tsjclient2.req
./easyrsa import-req pki/reqs/tsjclient2.req tsjclient
./easyrsa sign-req client tsjclient
# 保存所需密钥、证书和之前的ta.key ca.crt
cp pki/private/tsjclient.key pki/issued/tsjclient.crt ta.key pki/ca.crt ../../client
OpenVPN的查看
sudo service openvpn status
● openvpn.service - OpenVPN service
Loaded: loaded (/lib/systemd/system/openvpn.service; enabled; vendor preset: enabled)
Active: active (exited) since Sat 2021-04-24 20:40:13 UTC; 2 months 22 days ago
Main PID: 1691 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 154190)
Memory: 0B
CGroup: /system.slice/openvpn.service
Warning: journal has been rotated since unit was started, output may be incomplete.
$ cat server.conf
local 202.38.73.26
port 1194
proto udp
dev tun #tun路由模式,tap桥模式,据说tun效率高于tap,但是tun只能转发IP数据,tap是二层可以封装任何协议,window下只有tap模式
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-crypt tc.key # 新加入 ,不使用 tls-auth ta.key 0 改用 tls-crypt tc.key openvpn 2.4 版的新參數
topology subnet # OpenVPN默认的拓扑方式是net30:表示掩码30位,有地址浪费
server 10.8.0.0 255.255.255.0 #定义分配给客户端的IP段,服务端自己默认使用第一个可用地址
ifconfig-pool-persist ipp.txt #在openvpn重启时,再次连接的客户端将依然被分配和以前一样的IP地址
# push表示推送,即将配置推送给客户端,让客户端也使用
push "redirect-gateway def1 bypass-dhcp" #重定向默认网关 此设置将路由/强制所有流量通过VPN。
push "dhcp-option DNS 202.38.64.56" #指定客户端使用的主DNS
push "dhcp-option DNS 202.38.64.17" #指定客户端使用的备DNS
server-ipv6 2001:0db8:ee00:abcd::/64
push "route-ipv6 2001:da8:d800:811:ae1f:6bff:fe8a:e4ba/64"
push "route-ipv6 2000::/3"
keepalive 10 120 #表示每隔10秒ping一下客户端/服务端,若是120秒内无响应,认为down,随即重启openvpn(强烈开启)
auth SHA512 # 加密算法
cipher AES-256-CBC
user nobody # 待openvpn初始化完成后,将其降级为nobody权限运行
group nogroup
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-tun #通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup
status openvpn-status.log #状态文件:定期(默认60s)把状态信息写到该文件,以便自己写程序计费或者进行其他操作(需要关闭selinux)
verb 3 #日志记录级别,可选0-9,0只记录错误信息,4能记录普通的信息,5和6在连接出现问题时能帮助调试,9显示所有信息,甚至连包头等信息都显示(像tcpdump)
crl-verify crl.pem # crl证书 ./easyrsa gen-crl产生,默认180天过期
explicit-exit-notify # 如果协议改成了TCP,这里数值要改成0
subnet(子网拓扑)
注意用户ccd文件固定ip时候写法变成了:
10.8.0.3是给VPN用户分配的虚拟IP,其服务端是server 10.8.0.0 255.255.255.0,也就是10.8.0.0/24,用户只能获取到10.8.0.X的虚拟IP,去掉10.8.0.1、10.8.0.255就只剩下253个可分配的IP池了。重定向默认网关
为什么要重定向网关:vpn客户端是经常出差的,网络环境不安全,希望它将所有流量传到公司,经公司出口
其中包含的flags有"local autolocal def1 bypass-dhcp bypass-dns block-local ipv6 !ipv4"(多个标志之间用空格分隔),
推荐使用def1,它使用0.0.0.0/1和128.0.0.0/1而不是0.0.0.0/0来覆盖默认网关,即有新路由也保留原始默认网关,只是优先匹配而已
block-local 是表示当客户端拨入后,阻断其除与本地网关的访问外,本地的其他IP都不允许访问
PKI
Public Key Infrastructure(PKI),中文叫做公开密钥基础设施,也就是利用公开密钥机制建立起来的基础设施。
- PKI的核心是身份证明书的发行
- PKI的世界里,这个身份证明书,被叫做“证明书”。发行“证明书”的机关叫做“认证机关”。还有一个就是统一管理证明书的证书“档案库/证书库”。这三个东西加起来,就是PKI的主要构成要素。
- 证明书是被存放在硬盘或者IC卡里面的。证明书的文件构造是一种叫做 X.509 的协议规定的。另一方面,认证机关也其实就是一个网络应用程序。
- PKI提供的证明书可以用来 身份确认 和 通信加密。
- 用“证明书中的密钥”加密过的内容,只能用自己才有的另一个“私人的密钥”才能解密。这样的话,如果你发送给自己的内容被他人窃取的话,他人也无法解密。
- 在PKI机制中,放在“证明书里面的密钥”可以被任意自由分发,这里的“证明书里的密钥”被叫做“公开密钥(Public Key)”。与此相对,本人保管的那个“私人的密钥”就要做“私有密钥(Private Key)”。
- 认证机关的可信度,直接与证书的可信度挂钩,也就是与整个PKI机制的可信度息息相关。
- 在技术上,伪造证明书是非常简单的。所谓假的证明书,比如说有一个所谓的“比尔的证明书”,但是里面含有的公开密钥是史提芬的公开密钥。那么,别人发给比尔的信息,史蒂芬可以解密,反而比尔自己不能解密。
如何查看OpenVPN已连接的用户
将标志--management IP port [pw-file]添加或将相同的指令添加到您的中server.conf,例如:
management localhost 7505
这将允许您远程登录到该端口,并为您提供要运行的命令列表:
telnet localhost 7505
help
需要进一步的研究学习
暂无
遇到的问题
暂无
参考文献
https://www.wsfnk.com/archives/698.html