OpenVpn虚拟网络服务详解

前提:

首先你需要拥有一台公网ip的服务器,你的需求是与这台服务器建立连接达到用服务器访问互联网的目的。在你看这篇文章之前我必须提醒你本文章只是技术探讨,切勿运用此技术做违反国家法律及触及道德的事情,违者一切后果自负。


一、制作密钥和证书

1. 安装openvpn和easy-rsa

openvpn在Ubuntu的默认仓库中是可用的,所以我们可用使用apt来安装。我们还需安装一个easy-rsa包,这个包可以帮助我们建立一个内部CA(certificate authority)用于使用我们vpn。

sudo apt-get update
sudo apt-get install openvpn easy-rsa

2. 建立CA目录

openvpn是一个TLS/SSLvpn,这意味着它需要使用证书来在客户端和服务器之间加密数据。为了发布可信的证书,我需要建立我们自己的简单CA(certificate authority)。

下面两种创建方法任选其一:

make-cadir ~/openvpn-ca
mkdir ~/openvpn-ca
cp -r /usr/share/easy-rsa/*  ~/openvpn-ca

进入CA目录

cd ~/openvpn-ca
ls

显示如下内容说明CA目录创建成功

3. 配置CA变量

vim vars

将这些红色的值编辑成任何你喜欢的,但不要让它们空着,比如我的:

4. 制作CA

上面目录及相关配置已经制作完成了,接下用easy-rsa包来制作服务器和客户端CA文件

source vars
./easyrsa init-pki #这个相当于 ./clean-all 指令(easyrsa 2 版本)
./easyrsa build-ca nopass #生成根证书和密钥
./easyrsa build-server-full vpnrobin_server nopass #生成服务器证书和密钥,其中“vpnrobin_server”你可以写成自己喜欢的名字
./easyrsa build-client-full vpnrobin_client nopass #生成客户端证书和密钥,其中“vpnrobin_client”你可以写成自己喜欢的名字
./easyrsa gen-dh #生成密钥交换文件

将制作好的服务器证书和密钥文件放到一个文件夹里,方便后续处理(客户端的证书和密钥文件同样操作,后面有步骤,这一步可以先不处理)

mkdir server_certificate_key client_certificate_key
cp pki/ca.crt server_certificate_key/
cp pki/issued/vpnrobin_server.crt server_certificate_key/
cp pki/private/vpnrobin_server.key server_certificate_key/
cp pki/dh.pem server_certificate_key/

二、配置openvpn服务器

1. 修改配置文件

从openvpn自带的配置模板中复制配置文件到/etc/openvpn下,然后修改该配置文件:

cd /etc/openvpn/
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf ./
vim server.conf

根据自己的情况修改以下内容:

监听地址

监听端口号及监听协议,建议不要使用默认的1194端口

采用路由隧道模式

cacertkeydh是上一步生成的证书及密钥文件,输入相应的文件路径

给客户端分配地址池,注意:不能和vpn服务器内网网段有相同

网关

dhcp分配dns

安全系数更高的加密协议

传输数据压缩

该配置文件增加以下内容开启用户名密码认证(可以不增加)

# use username and password login
# 加上client-cert-not-required代表只使用用户密码方式验证登录,不加则代表需要证书和用户名密码双重验证登录
# client-cert-not-required 这里我注释掉这一行,采用证书加用户名密码双重认证
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env # 新加此行,开启密码验证脚本
username-as-common-name # 新加此行,使用客户提供的UserName作为Common Name
# 该指令提供对OpenVPN使用外部程序和脚本的策略级别的控制。较低的 水平 值更具限制性,较高的值更宽松。
# 0- 完全不调用外部程序。
# 1- (默认)仅调用内置可执行文件,例如ifconfig,ip,route或netsh。
# 2- 允许调用内置的可执行文件和用户定义的脚本。
# 3- 允许通过环境变量将密码传递给脚本(可能不安全)。
# 特别注意如果没有这个配置项会导致服务端校验密码时无法获取到密码,导致校验失败
script-security 3

2. 配置账号密码

如果上一步server.conf文件中没有增加最后一步开启用户名密码认证,则可以直接跳过这一步,如果开启了用户名密码认证,则执行以下步骤:

增加密码验证脚本
vim /etc/openvpn/checkpsw.sh
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
###########################################################

PASSFILE="/etc/openvpn/user_passwd.txt"
LOG_FILE="/var/log/openvpn/openvpn-login.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`

if [ ! -r "${PASSFILE}" ]; then
  echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
  exit 1
fi

CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`

if [ "${CORRECT_PASSWORD}" = "" ]; then 
  echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  exit 1
fi

if [ "${password}" = "${CORRECT_PASSWORD}" ]; then 
  echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
  exit 0
fi

echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1

为密码验证脚本checkpsw.sh添加可执行性权限,执行以下命令

chmod +x /etc/openvpn/checkpsw.sh
配置账号密码文件

配置账号/密码文件user_passwd.txt的内容,新增账号/密码到这个文件,一行一个账号,账号密码用空格隔开(密码需要使用字母加数字,特殊字符等,且不能以数字开头)

vim /etc/openvpn/user_passwd.txt
robin 123456

为了安全起见,修改账号密码文件的访问权限

cd /etc/openvpn/
chmod 400 user_passwd.txt

3. 建立ta.key文件(拒绝服务攻击证书)

openvpn --genkey --secret ta.key

三、配置openvpn客户端

1. 修改配置文件

将服务器上生成的客户端证书和密钥文件拷贝到一个文件夹中

cd ~/openvpn-ca
cp pki/ca.crt client_certificate_key/
cp pki/issued/vpnrobin_client.crt client_certificate_key/
cp pki/private/vpnrobin_client.key client_certificate_key/
cp /etc/openvpn/ta.key client_certificate_key/

从openvpn自带的配置模板中复制配置文件到上面的文件夹下,然后修改该配置文件:

cd ~/openvpn-ca/client_certificate_key
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ./
vim client.conf

根据自己的情况修改以下内容:

如果服务器配置了用户名密码认证,则需要增加以下内容

auth-user-pass # 新增账号/密码验证方式

如果服务器采用只使用用户名密码认证不用证书认证的方式,则注释掉以下类容

# 注释掉客户端密钥认证方式
;cert vpnrobin_client.crt
;key vpnrobin_client.key

2. 以上5个文件,打包上传到客户端

如果要在windows系统上,需要将clinet.conf 改成clinet.ovpn


四、连通服务器和客户端

1. 启动服务器端openvpn服务

iptables 设置nat 规则和打开路由转发

iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -j MASQUERADE
iptables -vnL -t nat
vim /etc/sysctl.conf # 文件底部增加net.ipv4.ip_forward = 1
sysctl -p

启动openvpn服务

 openvpn /etc/openvpn/server.conf

查看端口是否处于监听状态

netstat -lntup|grep 2299

设置开机启动

每次开机都要执行以上操作很麻烦,可以设置开机启动,先写一个openvpn.sh脚本放在/etc/openvpn/目录下,脚本内容如下

#!/bin/sh
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -j MASQUERADE
iptables -vnL -t nat
sysctl -p
/usr/sbin/openvpn --config /etc/openvpn/server.conf

再将该脚本加入/etc/rc.d/rc.local文件中,/etc/rc.d/rc.local文件如下

#!bin/bash
nohup sh /etc/openvpn/openvpn.sh &

重启服务器查看openvpn服务是否启动。

2. 客户端启动openvpn连接软件

配置客户端连接过程中,可以查看服务器的连接日志(下面第三步),方便排查错误

windows平台:

Windows和Linux的客户端配置文件、ca证书、客户端证书、客户端秘钥、TLS-auth密钥都是保存在不同的文件里,然后配置文件里配置路径和文件名的方式来读取这些证书和秘钥(也可以将这些文件揉成一个文件,直接添加这个文件即可,ios平台配置中会讲解步骤)。连接步骤:下载openvpn软件,打开软件选择上传FILE,选择clinet.ovpn文件,然后连接。连接成功后如下

ios平台:

ios像windows那样操作是不行的,需要直接把证书和秘钥写在配置文件里

原本如下:

ca.crtclient.crtclient.key文件以txt文本形式打开复制到clinet.ovpn文件中(如果需要ta.key文件,同样处理)

修改后如下:

<ca>
-----BEGIN CERTIFICATE-----
MIIFBjCCA+6gAwIBAgIJALZFY/44uEgsMA0GCS***********
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
MIIFQjCCBCqgAwIBAgIBLjANBgkqhkiG9w0BAQ***********
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwgg***********
-----END PRIVATE KEY-----
</key>

key-direction 1
<tls-auth>
-----BEGIN @××× Static key V1-----
993053371598d5b178f0cafe6b21eca9***********
-----END @××× Static key V1-----
</tls-auth>

修改完以后将clinet.ovpn文件发送到设备上,用openvpn app打开就行(openvpn app可以在苹果商店下载,如果搜索不到就用国外苹果ID登陆苹果商店)。连接成功后如下

Linux平台:

有两种方法,我推荐第二种

a.和服务器一样,安装openvpn
sudo apt-get update
sudo apt-get install openvpn

将证书秘钥文件放在client.conf文件中指定的位置,将client.conf文件放到/etc/openvpn目录下,调用如下命令即可启动服务

sudo openvpn /etc/openvpn/client.conf

注意了,linux下openvpn客户端默认是开机自启的,如果想取消openvpn服务的开机自启,则将/etc/default/openvpn文件中AUTOSTART="none"一项前的注释去掉,如下

cd /etc/default/
vim openvpn

如果连接正常,一切似乎没有任何问题,但是无法访问google等网站,则可能是linux下没有push DNS,你可以在配置文件中添加DNS

sudo vim /etc/resolv.conf

添加以下两行

nameserver 8.8.8.8
nameserver 8.8.4.4
b.用ubuntu自带的openvpn

相比a方案每次用命令行连接和断开vpn,b方案更方便易用,这是我推荐b方案的主要原因。当然了,如果你使用的是centos或者其他版本的linux系统,得看系统有没有支持openvpn协议的vpn服务,我这里只提供ubuntu22.04的解决方案

网关填服务器ip地址,设置完后点击“高级”,这里面的配置按照client.conf里面修改过的内容填写即可,如果有ta.key文件不要忘记了

填好配置后,连接成功屏幕右上方会出现vpn的图标

同样的,如果不能访问google等网站,你需要像a步骤最后一步一样,往/etc/resolv.conf文件中添加 DNS地址。

3. 查看服务器连接日志

tail -f /var/log/openvpn/openvpn.log # 查看openvpn服务日志
vim /var/log/openvpn/openvpn-login.log # 如果第二步中配置了用户名密码认证方式,/etc/openvpn/checkpsw.sh脚本中会将用户登陆记录保存到/var/log/openvpn/openvpn-login.log文件,这个路径可以自己设置
vim /var/log/openvpn-status.log # 查看当前登陆的用户及使用流量

五、防封策略

1. ip端口检测

检测ip端口是否可用,国外可以访问国内无法访问说明被GWF封锁ip或者端口,如果都无法访问则检查服务器网络配置。(检测工具:IP可用性检测工具 – Tools大全在线工具 (toolsdaquan.com)

2. 启用TLS-Crypt 流量混淆

到目前为止,OpenVPN支持 TLS-Auth 参数,这是一项确保没有人篡改 OpenVPN 流量的功能。 通俗地说,是一种确保 TLS 控制通道真实性的验证方法,其中包含建立 VPN 隧道的验证过程。 此功能已被弃用,取而代之的是 TLS-Crypt,它更进一步并添加了 混淆整个流量. 如果你居住在一个试图通过分析流量模式来阻止 VPN 连接的受压迫国家,这将非常有用。

TLS-Crypt 通过使用预先配置的静态密钥对每个 OpenVPN 数据包添加一轮加密和解密操作。 这意味着每个 OpenVPN 数据包都会被加密两次,一次使用静态密钥,一次使用 TLS 对称密钥。

有时,其他 VPN 提供商会通过部署定制的 OpenVPN 版本来支持混淆技术,其中包括“XOR 补丁”或类似的混淆技术,这些技术是劣质且过时的。 现在 OpenVPN 内置了混淆功能,我们利用它而不开发非标准解决方案,这需要自定义构建 OpenVPN。

3. 越迷惑越好,而不是越隐身越好

翻墙的流量伪装的越迷惑(例如采用v2ray+TLS)越合法(例如anyconnect vpn)越好,而不是越隐蔽(例如shadowsocks)越好。中国的网络审查方式和其他拥有严格审查制度的国家是不一样的。如果非得在一群特征伪装的流量里找出翻墙流量,那成本太高了,误杀代价太大。

4. 直接拉黑部分来自中国的恶意扫描ip段

此列表最初为某安全厂商提供,这些ip段存在扫描“违法信息”、翻墙端口的行为。如果能直接拉黑的话,能大大降低被墙概率。可以将以下内容写入脚本文件中执行。

谢谢你长得这么好看还能支持我~(〃'▽'〃)

评论

  1. Windows Edge 112.0.1722.39
    1 年前
    2023-4-14 11:40:45

    哇,正好最近想搞这个。 但是怕服务器1M带宽不够用😂

    • 博主
      Echo
      Windows Edge 112.0.1722.39
      1 年前
      2023-4-14 11:47:04

      1M你应该用的国内服务器,那搭建了也不能访问外网,用腾讯香港或者腾讯美国的服务器(同样的价钱带宽30M,性价比很高)

      • robin
        Windows Edge 112.0.1722.39
        1 年前
        2023-4-14 12:08:10

        嗯嗯,好的,之前想买硅云的海外的,但是评价不怎么样|´・ω・)ノ
        对了,你的好像没有邮件通知,如果想要添加的话可以去后台设置里绑定邮箱

        • 博主
          Echo
          Windows Edge 112.0.1722.39
          1 年前
          2023-4-14 12:24:57

          好的呢!٩(ˊᗜˋ*)و

        • 博主
          Echo
          Windows Edge 112.0.1722.39
          1 年前
          2023-4-14 13:28:23

          终于好啦 (╯°A°)╯︵○○○
          我的主机不支持php的mail()函数,wordpress自带的邮件功能不管用,安装Configure SMTP插件才弄好ヾ(´・ ・`。)ノ”

          • robin
            Windows Edge 112.0.1722.39
            1 年前
            2023-4-14 17:16:58

            哈哈,我的也是,然后弄了个smtpヾ(≧∇≦*)ゝ

  2. Roman914
    Windows Chrome 120.0.0.0
    4 月前
    2024-2-12 21:33:36

    The Beatles – легендарная британская рок-группа, сформированная в 1960 году в Ливерпуле. Их музыка стала символом эпохи и оказала огромное влияние на мировую культуру. Среди их лучших песен: “Hey Jude”, “Let It Be”, “Yesterday”, “Come Together”, “Here Comes the Sun”, “A Day in the Life”, “Something”, “Eleanor Rigby” и многие другие. Их творчество отличается мелодичностью, глубиной текстов и экспериментами в звуке, что сделало их одной из самых влиятельных групп в истории музыки. Музыка 2024 года слушать онлайн и скачать бесплатно mp3.

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
w(゚Д゚)w
(ノへ ̄、)
(๑•̀ㅂ•́)و✧
o(* ̄3 ̄)o
(* ̄3 ̄)╭
(づ ̄3 ̄)づ╭❤~
(*  ̄3)(ε ̄ *)
( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///)
Σ(°△°|||)︴
凸(艹皿艹 )
(u‿ฺu✿ฺ)
o(*≧▽≦)ツ┏━┓
╰(*°▽°*)╯
o( ̄ヘ ̄o#)
~~( ﹁ ﹁ ) ~~~
(ーー゛)
(ー`′ー)
o(一︿一+)o
(o_ _)ノ
(ノへ ̄、)
(ˉ▽ ̄~) 切~~
(@_@;)
( =•ω•= )m
(✿◡‿◡)
┭┮﹏┭┮
ヾ( ̄▽ ̄)Bye~Bye~
Ψ( ̄∀ ̄)Ψ
✧(≖ ◡ ≖✿)
━( ̄ー ̄*|||━━
ヽ(*。>Д<)o゜
(;′⌒`)
X﹏X
(′▽`ʃ♡ƪ)
♪(^∇^*)
φ(≧ω≦*)♪
o(* ̄︶ ̄*)o
o(^▽^)o
(*^-^*)
n(*≧▽≦*)n
Ψ( ̄∀ ̄)Ψ
o(〃'▽'〃)o
(〃'▽'〃)
╰(*°▽°*)╯
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
颜文字
Emoji
小恐龙
花!
表情包
上一篇
下一篇