加载中...
搭建openvpn实现外网访问内网资源
发表于:2022-12-27 | 分类: 应用软件
字数统计: 2.4k | 阅读时长: 10分钟 | 阅读量:

有时我们需要打通内网与外网某台指定机器的访问,so 需要使用vpn实现,这里记录一下搭建openvpn 服务并实现在外网机器访问内网

准备工作

需要的资源

一台能够同时接通内网与外网的机器 (示例中是DMZ的Ubuntu20.04)
用于vpn通信的证书
openvpn的server端与client端

服务器时间同步

该步骤不是必须要做的,由于我们需要签发证书,所以最好保证当前服务器时间为正确时间,这样生成的证书就避免了由于时间的问题导致不可用.
执行如下命令:

1
2
3
4
tzselect
# 选择到 Asia(4) China(10) Beijing(1)
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date -R
执行结果如下:

image.png
如果时间不正确,可以使用ntp进行更新:

1
2
sudo apt install -y ntpdate
ntpdate ntp.aliyun.com
再来查看时间就是正确的了:

image.png

下载需要的安装包和源码包

  • 我们使用lzo来作为openvpn的压缩,所以需要下载lzo的源码包进行编译安装

下载地址: http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
同时,由于是源码包,我们需要安装对应工具对其进行安装

1
2
3
4
5
6
sudo apt install -y make gcc g++
wget wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
tar -zxf lzo-2.10.tar.gz
cd lzo-2.10
./configure
make && make install

过程如图所示:
image.png
image.png
至此,若程序成功退出 则说明lzo成功安装.

  • 下载openvpn源码包并安装

首先,先安装使用openvpn的依赖ssl 一会儿生成证书也要用到
然后下载openvpn源码并准备编译安装
注意:每个版本的openvpn confiure的时候参数可能不同 一定要使用./configure –help 看一下
下载地址: https://swupdate.openvpn.org/community/releases/openvpn-2.5.8.tar.gz

1
2
3
4
5
6
sudo apt install -y openssl
wget https://swupdate.openvpn.org/community/releases/openvpn-2.5.8.tar.gz
tar -zxf openvpn-2.5.8.tar.gz
cd openvpn-2.5.8/
./configure --enable-lzo
make && make install

安装过程就不详细描述了,安装完毕后 可以使用 openvpn -v 来检查安装是否成功:
image.png

开始配置openVPN

生成需要的证书

这一步是非常重要的一步,我们需要生成openvpn链接使用的证书,这里要用到easyrsa工具

  1. 下载地址: git clone https://github.com/OpenVPN/easy-rsa.git
  2. 切换到稳定可用的分支: cd easy-rsa/easyrsa3 && git checkout v3.1.1
  3. 赋予easy-rsa 执行权限: chmod +x ./easyrsa
    1. 自建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/
    2. 使用自建的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/
    3. 使用自建CA证书为openvpn 客户端签发证书(密码留空为不设置密码,若设置密码则需要在连接vpn的时候输入密码)
      1
      2
      3
      mkdir -p /etc/openvpn/client
      cp pki/private/client.key /etc/openvpn/client
      cp pki/issued/client.crt /etc/openvpn/client
    4. 生成密钥交换协议文件
      1
      2
      3
      4
      # 生成交换文件
      ./easyrsa gen-dh
      # 拷贝到指定目录
      cp pki/dh.pem /etc/openvpn/certs/

服务端配置

首先,复制一份模板配置文件到指定目录下:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
local 0.0.0.0
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/openvpnserver.crt
key /etc/openvpn/certs/openvpnserver.key
dh /etc/openvpn/certs/dh.pem
server 10.10.20.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "172.24.10.0 255.255.255.0"
client-to-client
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
verb 3

转发配置

  • 允许ipv4 转发:

    1
    2
    3
    sysctl -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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat > /usr/lib/systemd/system/openvpn.service << EOF
[Unit]
Description="openvpn server"
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/openvpn --config /etc/openvpn/server.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target

EOF

# 激活服务
systemctl enable openvpn.service
# 启动
service openvpn start
# 状态
service openvpn status

启动成功的状态:
image.png

配置客户端

将证书复制到客户端指定位置

本例我使用windows 连接 在指定目录新建home文件夹,并将之前生成的两个证书和ca证书文件放到文件夹下:
image.png
然后再在该目录下新建一个 home.ovpn 文件并使用记事本打开,里面的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
client
dev tun
proto tcp
remote 1.2.3.4 9999 # 改成机器对应的公网ip和端口
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt # ca证书的路径 这里我使用的是相对路径
cert client.crt # 证书 这里我使用的是相对路径
key client.key # key 这里我使用的是相对路径
ns-cert-type server
comp-lzo
verb 3

下载客户端连接工具

下载地址: https://openvpn.net/vpn-client/ 根据自己的操作系统自行下载即可

尝试连接

image.png

尝试访问内网地址

image.png
完毕!

上一篇:
mysql索引导致慢查询
下一篇:
在k8s中使用ingress进行web访问
本文目录
本文目录