使用 OpenVPN, Easy RSA 配置虚拟专用网络

使用 OpenVPN, Easy RSA 配置虚拟专用网络


警告

请勿将本文提到的任何技术用于非法用途.

遵守中华人民共和国刑法》《中华人民共和国网络安全法》《中华人民共和国治安管理处罚法》和/或当地其他相关法律法规.


重要: 免责声明

重要: 本博客的所有内容仅供教育和参考之用, 不构成法律, 财务或任何专业领域的建议. 使用虚拟专用网络 (VPN) 可能违反相关法律法规. 读者在使用本博客提供的信息或服务时, 应自行承担风险, 并在遵守所在国家或地区的法律法规的前提下行事. 本博客的作者和运营者对读者因使用本博客的信息或服务而可能产生的任何直接或间接后果, 概不负责.

请充分考虑再决定是否阅读本文.

具体而言, 本博客的目的是向读者介绍关于网络安全和隐私保护的基础知识, 强调合法合规的使用方式. 本博客内容不旨在介绍或鼓励任何违反法律的行为, 包括但不限于未经授权的VPN使用. 本博客的信息可能随时更改或更新, 且作者无法保证信息的准确性, 完整性和时效性. 因此, 读者在采取行动前应自行核实相关信息, 并在需要时寻求专业的法律建议. 对于因使用本博客信息或服务而可能导致的任何损失或损害, 包括但不限于数据丢失, 法律责任, 或网络攻击, 本博客的作者和运营者概不负责. 本免责声明适用于所有访问本博客或使用本博客提供的信息或服务的个人和组织.


重要: 法律适用声明

重要: 请注意, 使用虚拟私人网络服务可能违反特定国家或地区的法律法规. 读者在决定使用 VPN 服务时, 应自行承担责任, 并遵守适用法律法规. 我们建议读者在采取任何与网络安全相关的行动之前, 咨询具有相关资质的法律专业人士的意见, 以确保其行为的合法性和合规性.


重要: 关于加密技术的声明

重要: 许多国家都限制使用或出口加密技术. 如果您可能受到此类限制, 您应该在尝试开发或分发加密代码之前寻求专业的法律建议.

OpenVPN 和/或 Easy RSA (可能) 使用加密技术.


重要: 责任范围声明

重要: 本文中的任何声明并不排除或限制适用法律规定的责任范围, 若法律规定与本声明有冲突, 则以适用法律规定为准.


协议

特别说明: 本文按“原样”提供, 不做任何明示或暗示的担保, 包括但不限于对适用性, 正确性, 使用情景合法性的担保. 在和任何情况下, 作者均不对读者使用本文提及的内容造成的结果进行赔偿或承担任何责任.

本作品采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可. (CC-BY-ND 4.0)

当 CSDN 平台提供的版权协议与本协议 (CC-BY-ND 4.0) 不一致时, 以本协议为准.

Copyright © 2024, 还没想好昵称的新建p.

特别说明: 在转载时, 禁止对本文的任何内容进行修改.

特别说明: “警告”, “重要”和“协议”的全部内容应该按原样包含在本文的所有转载副本内容中.

如果您不同意协议中的任何一项, 请勿继续阅读或转载, 并关闭此页面.

日期内容变更
2024-07-12 16:04 UTC+0100发布

假设

在阅读本文前, 您应该对以下内容有所了解.

此外, 您应该拥有一台服务器的 root 权限, 例如 Ubuntu 24.04 LTS, 和一台客户端机器.

方法 1: 使用脚本

使用如下脚本可以安装 OpenVPN, 不是本文重点, 在此不在赘述.

curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
./openvpn-install.sh

方法 2: 使用软件包管理区

1. 更新, 安装 OpenVPN 和 Easy RSA

更新软件包管理器, 并安装 openvpn, easy-rsa (以 apt 为例).

sudo apt update
sudo apt install openvpn easy-rsa

2. 生成证书, 公钥和密钥

首先, 使用如下命令生成证书, 公钥和密钥.

make-cadir ~/openvpn-ca
cd openvpn-ca

然后, 编辑 vars, 设置 CA (证书颁发机构) 变量.

vim vars

如果您使用了软件包管理器 make-cadir 命令, 则请 忽略 该文件的提示 (如下).

# NOTE: If you installed Easy-RSA from your distro's package manager, don't edit
# this file in place -- instead, you should copy the entire easy-rsa directory
# to another location so future upgrades don't wipe out your changes.

编辑 95 行附近, 设置您的组织的信息.

set_var EASYRSA_REQ_COUNTRY     "GB"
set_var EASYRSA_REQ_PROVINCE    "Hampshire"
set_var EASYRSA_REQ_CITY        "Southampton"
set_var EASYRSA_REQ_ORG         "."
set_var EASYRSA_REQ_EMAIL       "example@ieee.org"
set_var EASYRSA_REQ_OU          "."

设置 RSA 大小, CA 过期时间和证书过期时间.

set_var EASYRSA_KEY_SIZE        2048
# 省略若干行
set_var EASYRSA_CA_EXPIRE       3650
# 省略若干行
set_var EASYRSA_CERT_EXPIRE     825

接下来, 执行以下命令, 设置 PKI.

  1. 初始化 PKI:

    ./easyrsa init-pki
    
  2. 生成 CA:

    ./easyrsa build-ca
    
  3. 生成 CSR (证书签名请求):

    ./easyrsa gen-req server nopass
    

    其中, server 是 CN (common name), nopass 表明请求无需密码加密.

  4. 使用 CA 的私钥签名服务器的 CSR:

    ./easyrsa sign-req server server
    

    其中, 第一个 server 是请求类型 (服务器证书), 第二个 server 是 CSR 的 CN.

  5. 生成 Diffie-Hellman (DH) 变量:

    ./easyrsa gen-dh
    
  6. 生成 OpenVPN TLS 验证静态钥匙用于进一步防止数据包注入攻击:

    openvpn --genkey --secret pki/ta.key
    

完成 PKI 设置后, 证书和钥匙将存于 ~/openvpn-ca/pki 目录.

提示: 请注意文件权限. 使用 chownchmod 妥善配置文件的所有者和模式.

提示: 请妥善保管私钥.

3. 配置 OpenVPN

  1. 首先, 将 PKI 复制到 OpenVPN 目录:

    sudo cp pki/dh.pem pki/ca.crt pki/issued/server.crt pki/private/server.key /etc/openvpn/
    
  2. 然后, 复制一份服务器配置样例:

    sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server.conf
    
  3. 编辑 server.conf:

    注释以 #; 开始.

    # 使用 UDP (亦可使用 TCP)
    proto udp
    
    # 省略若干行
    
    dev tun
    
    # 省略若干行
    
    # 设置 SSL/TLS CA, cert, key 等
    ca ca.crt
    cert server.crt
    key server.key  # This file should be kept secret
    
    # 省略若干行
    
    # 设置 Diffie-Hellman
    dh dh2048.pem
    
    # 省略若干行
    
    # 设置服务器 VPN 子网
    server 10.8.0.0 255.255.255.0
    
    # 省略若干行
    
    # 将所有 IP 和 DNS 流量路由至 VPN
    push "redirect-gateway def1 bypass-dhcp"
    
    # 省略若干行
    
    # 配置 DNS
    push "dhcp-option DNS 8.8.4.4"
    push "dhcp-option DNS 8.8.8.8"
    
    # 省略若干行
    
    # 注释此行, 改为tls-crypt
    ;tls-auth ta.key 0 # This file is secret
    tls-crypt ta.key
    
    # 省略若干行
    
    # 降低权限
    user nobody
    group nobody
    
    # 省略若干行
    
    persist-key
    persist-tun
    

    此外, 如果您希望每个用户使用同一个客户端证书, 则取消注释此行, 但请注意其潜在安全问题 (在生产环境不应取消注释这一行):

    duplicate-cn
    

    此外, 您应该妥善配置日志.

  4. 启动操作系统 IP 转发:

    假设您的操作系统使用 systemd.

    sudo vim /etc/sysctl.conf
    
    # 取消注释此行
    net.ipv4.ip_forward=1
    

    然后, 应用设置.

    sudo sysctl -p
    

4. 启动 OpenVPN 服务

运行如下命令.

sudo systemctl start openvpn@server 
sudo systemctl enable openvpn@server

其中, @server 是您在配置文件中使用的名称 (参见上文).

5. 配置防火墙

  • 如果您使用 UFW, 则:

    sudo ufw allow 1194/udp
    sudo ufw route allow in on eth0 out on tun0
    sudo ufw route allow in on tun0 out on eth0
    

    其中, 1194/udp 是您配置的端口和协议, eth0 是服务器的网络接口, tun0 是 VPN 的虚拟网络接口 (使用 ifconfig 查询).

  • 如果您使用 iptables, 则:

    sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    sudo iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
    

如果您使用云服务 (如 AWS, Azure 等), 则应开放相应的端口/服务.

提示: 请根据需求和您的用例正确配置防火墙.

6. 配置客户端

  1. 类似于配置服务器 PKI, 使用如下命令配置客户端 client1 :

    ./easyrsa gen-req client1 nopass
    ./easyrsa sign-req client client1
    sudo cp pki/private/client1.key /etc/openvpn/client/
    sudo cp pki/issued/client1.crt /etc/openvpn/client/
    sudo cp pki/{ca.crt,ta.key} /etc/openvpn/client/
    
  2. 复制客户端配置文件样例:

    sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/openvpn-ca/
    
  3. 编辑客户端配置文件:

    vim client.conf
    
    # 降低权限
    user nobody
    group nobody
    
    # 省略若干行
    
    # 注释以下内容, 稍后会将这些信息写入配置文件
    ;ca ca.crt
    ;cert client.crt
    ;key client.key
    
    # 省略若干行
    
    remote-cert-tls server
    
    # 省略若干行
    
    # 注释以下内容, 稍后会将这些信息写入配置文件
    ;tls-auth ta.key 1
    
  4. 编辑写入相关证书, 钥匙等的脚本:

    vim config_gen.sh
    

    写入如下内容.

    #!/bin/bash
    # 此脚本第1个参数是客户端标识符
    KEY_DIR=/etc/openvpn/client
    OUTPUT_DIR=/home/您的用户名/openvpn-ca/client-files # 改为输出目录
    BASE_CONFIG=/home/您的用户名/openvpn-ca/client.conf # 改为client.conf所在位置
    cat ${BASE_CONFIG} \
        <(echo -e '<ca>') \
        ${KEY_DIR}/ca.crt \
        <(echo -e '</ca>\n<cert>') \
        ${KEY_DIR}/${1}.crt \
        <(echo -e '</cert>\n<key>') \
        ${KEY_DIR}/${1}.key \
        <(echo -e '</key>\n<tls-crypt>') \
        ${KEY_DIR}/ta.key \
        <(echo -e '</tls-crypt>') \
        > ${OUTPUT_DIR}/${1}.ovpn
    

    更改脚本权限:

    sudo chmod 700 /root/openvpn-ca/config_gen.sh
    

    运行脚本, 生成 client1.ovpn:

    sudo ./config_gen.sh client1
    

7. 客户端操作

在客户端安装 OpenVPN, 并导入 client1.ovpn.

可以通过 ipinfo.io 验证客户端的 IP.

curl ipinfo.io

例如, 客户端在连接 OpenVPN 前, 使用英国 JISC 提供的高等教育网络 (AS786) :

{
  "ip": "(隐藏)",
  "hostname": "(隐藏)",
  "city": "Southampton",
  "region": "England",
  "country": "GB",
  "loc": "(隐藏)",
  "org": "AS786 Jisc Services Limited",
  "postal": "SO15",
  "timezone": "Europe/London",
  "readme": "https://ipinfo.io/missingauth"
}

在连接到 OpenVPN 后, 使用伦敦 Microsoft 的网络 (AS8051) :

{
  "ip": "(服务器的IP地址)",
  "city": "London",
  "region": "England",
  "country": "GB",
  "loc": "(隐藏)",
  "org": "AS8075 Microsoft Corporation",
  "postal": "E1W",
  "timezone": "Europe/London",
  "readme": "https://ipinfo.io/missingauth"
}

Enjoy!

请勿将本文提到的任何技术用于非法用途.


参考文献

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值