有时我们需要打通内网与外网某台指定机器的访问,so 需要使用vpn实现,这里记录一下搭建openvpn 服务并实现在外网机器访问内网
准备工作
需要的资源
一台能够同时接通内网与外网的机器 (示例中是DMZ的Ubuntu20.04)
用于vpn通信的证书
openvpn的server端与client端
服务器时间同步
该步骤不是必须要做的,由于我们需要签发证书,所以最好保证当前服务器时间为正确时间,这样生成的证书就避免了由于时间的问题导致不可用.
执行如下命令:
1 | tzselect |
执行结果如下:
如果时间不正确,可以使用ntp进行更新:
1 | sudo apt install -y ntpdate |
再来查看时间就是正确的了:
下载需要的安装包和源码包
- 我们使用lzo来作为openvpn的压缩,所以需要下载lzo的源码包进行编译安装
下载地址: http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
同时,由于是源码包,我们需要安装对应工具对其进行安装
1 | sudo apt install -y make gcc g++ |
过程如图所示:
至此,若程序成功退出 则说明lzo成功安装.
- 下载openvpn源码包并安装
首先,先安装使用openvpn的依赖ssl 一会儿生成证书也要用到
然后下载openvpn源码并准备编译安装
注意:每个版本的openvpn confiure的时候参数可能不同 一定要使用./configure –help 看一下
下载地址: https://swupdate.openvpn.org/community/releases/openvpn-2.5.8.tar.gz
1 | sudo apt install -y openssl |
安装过程就不详细描述了,安装完毕后 可以使用 openvpn -v 来检查安装是否成功:
开始配置openVPN
生成需要的证书
这一步是非常重要的一步,我们需要生成openvpn链接使用的证书,这里要用到easyrsa工具
- 下载地址: git clone https://github.com/OpenVPN/easy-rsa.git
- 切换到稳定可用的分支: cd easy-rsa/easyrsa3 && git checkout v3.1.1
- 赋予easy-rsa 执行权限: chmod +x ./easyrsa
- 自建CA证书:
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生成vars 文件 根据需要修改自己的信息
cat > vars << EOF
if [ -z "\$EASYRSA_CALLER" ]; then
echo "You appear to be sourcing an Easy-RSA 'vars' file." >&2
echo "This is no longer necessary and is disallowed. See the section called" >&2
echo "'How to use this file' near the top comments for more details." >&2
return 1
fi
set_var EASYRSA_DN "org"
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "LiaoNing"
set_var EASYRSA_REQ_CITY "Dalian"
set_var EASYRSA_REQ_ORG "xiaobai1202.com"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "4bpa"
set_var EASYRSA_NS_SUPPORT "yes"
EOF
通过vars 初始化pki
./easyrsa init-pki
创建ca证书 nopass 是不使用密码
./easyrsa build-ca nopass
生成的证书拷贝到指定目录
mkdir -p /etc/openvpn/certs
cp pki/ca.crt /etc/openvpn/certs/ - 使用自建的CA证书为openvpn服务端签发证书(注意密码留空即可)
1
2
3
4
5生成证书
./easyrsa build-server-full openvpnserver nopass
拷贝到指定目录
cp pki/private/openvpnserver.key /etc/openvpn/certs/
cp pki/issued/openvpnserver.crt /etc/openvpn/certs/ - 使用自建CA证书为openvpn 客户端签发证书(密码留空为不设置密码,若设置密码则需要在连接vpn的时候输入密码)
1
2
3mkdir -p /etc/openvpn/client
cp pki/private/client.key /etc/openvpn/client
cp pki/issued/client.crt /etc/openvpn/client - 生成密钥交换协议文件
1
2
3
4生成交换文件
./easyrsa gen-dh
拷贝到指定目录
cp pki/dh.pem /etc/openvpn/certs/
- 自建CA证书:
服务端配置
首先,复制一份模板配置文件到指定目录下:
cp ~/openvpn-2.5.8/sample/sample-config-files/server.conf /etc/openvpn/ && vi /etc/openvpn/server.conf
配置文件参数说明:
- local 192.168.100.5:表示 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”: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 目录,服务端第二个参数为 0。同时客户端也要有此文件,且 client.conf 中此指令的第二个参数需要为 1。
- 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:日志记录的详细级别。
这里是我的配置文件完整内容:
1 | local 0.0.0.0 |
转发配置
允许ipv4 转发:
1
2
3sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
/etc/init.d/procps restart开启nat转发内网请求:
1
2注意 转发的ip就是vpn中指定的客户端ip段
iptables -t nat -A POSTROUTING -s 10.10.20.0/24 -j MASQUERADE
启动openVPN服务
由于我们希望他是在后台运行 所以将他注册成service:
1 | cat > /usr/lib/systemd/system/openvpn.service << EOF |
启动成功的状态:
配置客户端
将证书复制到客户端指定位置
本例我使用windows 连接 在指定目录新建home文件夹,并将之前生成的两个证书和ca证书文件放到文件夹下:
然后再在该目录下新建一个 home.ovpn 文件并使用记事本打开,里面的内容如下:
1 | client |
下载客户端连接工具
下载地址: https://openvpn.net/vpn-client/ 根据自己的操作系统自行下载即可
尝试连接
尝试访问内网地址
完毕!