技术教程:如何自己搭建一个VPN

仅供技术学习与交流

VPN简单介绍

首先需要明确的是,VPN本是一种技术,英文是Virtual Private Network,顾名思义是虚拟化的私人网络.简单来说就是基于代理IP然后自己在上面加一些功能.像是自己的手机或者PC其实都有连接VPN的功能.此外也有一些连接VPN的客户端软件.

image-20230603150053505

VPN好处

  • 加密 IP 地址:VPN 的主要工作就是对 ISP 和其他第三方隐藏您的 IP 地址。这样当您在线发送和接收信息时,就不用担心会有被除了您和 VPN 提供商以外的任何人看到的风险。
  • 加密协议:VPN 还应该防止您留下痕迹,例如,互联网历史记录、搜索历史记录和 cookie。加密 cookie 尤其重要,因为能阻止第三方访问保密信息,如个人数据、财务信息和网站上的其他内容。
  • 自杀开关:如果您的 VPN 连接突然中断,您的安全连接也会中断。好的 VPN 能检测到这种突然停机并终止预先选择的程序,从而降低数据被泄露的可能性。
  • 双因素身份验证:通过使用各种身份验证方法,强大的 VPN 能够检查试图登录的每个人。例如:您可能会被提醒输入密码,然后会将代码发送到您的手机。这使得未经邀请的第三方难以访问您的安全连接。

本篇文章主要目的是动手自己搭建一个访问外网的VPN,为此需要一个搭建在大陆地区以外的的服务器,因此需要一个性价比高的国外云服务器商.

这里就主要使用Vultr云服务商,事实上国内的也行,不过为了安全考虑还是算了.此外Vultr是支持支付宝支付的,不需要再去办一张VISA银行卡了,这就很满足需求了.

主要方法是使用性价比高的服务商的服务器再搭建VPN服务端软件进行配置.

一些VPS服务商推荐2023年最值得购买的VPS推荐

实战

注册Vultr

可以点击我的邀请进行注册注册地址,此外也有优惠链接

其他可能已经失效的活动Vultr优惠码整理,包括充多少送多少(最多100美金),另外还有送美金余额的,总之还是不错的.

image-20230603160407745

充值

这里使用支付宝支付,此外可以使用一些兑换码获取一些福利,下面细说.

image-20230603160605588

购买服务器

image-20230603151410859

选择Regular Performance,

image-20230603155931403

最低只要一个月2.5刀,不过貌似这个只支持IPV6,所以只能再加一刀支持IPV4

image-20230603155808005

最后加上0.7刀备份,所以一个月就是4.2刀.还是比较便宜的。目前大致情况总结如下

CPU内存硬盘带宽IP价格
1 核512MB10GB0.5TBIPv6$2.5/月
1 核512MB10GB0.5TBIPv4$3.5/月
1 核1GB25GB1TBIPv4$5/月
1 核2GB55GB2TBIPv4$10/月
2 核4GB80GB3TBIPv4$20/月
4 核8GB160GB4TBIPv4$40/月
6 核16GB320GB5TBIPv4$80/月
8 核32GB640GB6TBIPv4$160/月
16 核64GB1280GB10TBIPv4$320/月
24 核96GB1600GB15TBIPv4$640/月

最后购买的服务器如下

image-20230603160314905

点击实例,进入后查看ip,用户名和密码,这样方便使用终端连接

image-20230603161001092

此外测试一下能不能连接,本地ping一下,ping不通可以删掉,删掉后不计费.

image-20230603161143254

安装服务端VPN

主要有shadowsocks和V2ray,终端可以使用Xshell或者PuTTY.

V2Ray

这里使用V2ray,如果你想使用其他的可以看看参考链接.利用的仓库是一键脚本搭建V2Ray最新中文教程

V2Ray的优势

  • 更完善的协议: V2Ray 使用了新的自行研发的 VMess 协议,改正了 Shadowsocks 一些已有的缺点,更难被墙检测到(不保证可靠性)
  • 更强大的性能: 网络性能更好,具体数据可以看 V2Ray 官方博客
  • 更丰富的功能:

使用命令

1
bash <(curl -s -L https://git.io/v2ray.sh)

如果出现INTERNAL ERROR 500,可以再试试.如果出现其他错误,自己再改改.

安装好后出现如下图

image-20230603164722550

命令V2ray进行进一步配置,修改协议,端口等

image-20230603164801527

使用v2ray ip查看自己的ip

1
2
firewall-cmd --zone=public --add-port=5200/tcp --permanent
firewall-cmd --reload

防火墙开启端口,这是很有必要的.

最后可以使用这个网站Check Port | Ping.Sx检测一下,如果是绿色的reachable就可以了.

image-20230603170821614

其他命令添加配置:

  • v2ray add -> 添加配置
  • v2ray add ss -> 添加一个 Shadowsocks 配置
  • v2ray add tcp -> 添加一个 VMess-TCP 配置
  • v2ray add kcpd -> 添加一个 VMess-mKCP-dynamic-port 动态端口配置

image-20230603170717004

优化v2ray

1
v2ray bbr

Shadowsocks

搭建Shadowsocks教程如下,基本方法差不多

VPS一键脚本搭建SSR教程

clown-coding/vpn: 快速搭建一个自己的VPN翻墙科学上网 (github.com)

快速搭建个人VPN

1
wget –no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
1
2
chmod +x shadowsocks.sh
./shadowsocks.sh 2>&1 | tee shadowsocks.log

然后根据情况自己配置即可

image-20230603180917790

安装完成后就有相关信息.

还有另一个脚本

1
2
3
wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh
chmod +x shadowsocks-all.sh
./shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log

配置更多,但我使用这个有时下载不了后面发现由于我是用Centos 8.x版本的操作系统,EPEL软件包有点问题.参考这篇文章解决如何在 CentOS 8 和 RHEL 8 服务器上启用 EPEL 仓库 - 知乎 (zhihu.com) ,最后还是不行的话建议换OS,用Debian,Debian开启某个端口命令Debian 10 iptables防火墙常用命令 - 简书 (jianshu.com)

1
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

最后记得重启一下

可以使用边缘@订阅转换API (bianyuan.xyz)转换为clash订阅地址,因为我本身用clash客户端比较多

image-20230603173315958

客户端

客户端主要有V2ray,ShadowSocks以及现在的Clash,导入服务端对应的链接即可.

Shadowsocks Windows客户端快速使用指南 - 小小的宇宙 (howru.cc)

image-20230603172709508

这里不做过多介绍,可以看看参考资料.

相关链接

Linux上可以使用sing box一键安装脚本 · 233boy/sing-box Wiki

最近意外发现之前以为过期不能续费的azure云服务器竟然又续杯成功

白嫖微软学生福利——通过Azure学生订阅创建一台免费的云服务器(每年可续期) - 技术栈

学生福利白嫖之路——申请Azure学生订阅 - 知乎

可以使用b1s配置(1c1g)的windows和linux两台虚拟机,一年100刀额度主要承担公网ip和出站流量

windows上也来搭建代理,网上教程较少,比较好的有一篇Windows服务器也能搭建高端节点线路!Sing-box GUI 全流程图文教程 | CN-SEC 中文网

流程脚本如下,简单来说使用nssm做服务,sing-box做代理核心

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# ==============================================================================
# Sing-Box 一键自动化部署脚本 (~/home/sing-box)
# 对应文章流程:自动下载依赖 -> 生成证书与UUID -> 配置 -> NSSM服务化
# ==============================================================================

$ErrorActionPreference = "Stop"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# 1. 自动定位家目录 ~/home/sing-box
$HomeDir = $env:USERPROFILE
$WorkDir = Join-Path -Path $HomeDir -ChildPath "home\sing-box"

if (-not (Test-Path $WorkDir)) {
New-Item -ItemType Directory -Path $WorkDir -Force | Out-Null
}
Set-Location -Path $WorkDir
$WorkDirForwardSlash = $WorkDir.Replace('\', '/')

Write-Host "====== [1/5] 下载并安装环境依赖 ======" -ForegroundColor Green
Write-Host "工作路径: $WorkDir" -ForegroundColor Cyan

# 1.1 安装 VC++ Runtime
Write-Host "正在下载/安装 VC++ Runtime..." -ForegroundColor Yellow
Invoke-WebRequest -Uri "https://aka.ms/vs/17/release/vc_redist.x64.exe" -OutFile "$WorkDir\vc_redist.x64.exe"
Start-Process -FilePath "$WorkDir\vc_redist.x64.exe" -ArgumentList "/install", "/quiet", "/norestart" -Wait
Remove-Item "$WorkDir\vc_redist.x64.exe" -Force

# 1.2 自动从 GitHub API 下载最新 64 位 Sing-Box
Write-Host "正在获取最新版 Sing-Box..." -ForegroundColor Yellow
$singboxRelease = Invoke-RestMethod -Uri "https://api.github.com/repos/SagerNet/sing-box/releases/latest"
$singboxAsset = $singboxRelease.assets | Where-Object { $_.name -like "*windows-amd64.zip" } | Select-Object -First 1
$singboxZip = "$WorkDir\sing-box.zip"
Invoke-WebRequest -Uri $singboxAsset.browser_download_url -OutFile $singboxZip
Expand-Archive -Path $singboxZip -DestinationPath "$WorkDir\temp_singbox" -Force

$exePath = Get-ChildItem -Path "$WorkDir\temp_singbox" -Recurse -Filter "sing-box.exe" | Select-Object -First 1
Move-Item -Path $exePath.FullName -Destination "$WorkDir\sing-box.exe" -Force
Remove-Item "$WorkDir\temp_singbox", $singboxZip -Recurse -Force

# 1.3 下载 NSSM
Write-Host "正在下载 NSSM..." -ForegroundColor Yellow
$nssmZip = "$WorkDir\nssm.zip"
Invoke-WebRequest -Uri "https://nssm.cc/release/nssm-2.24.zip" -OutFile $nssmZip
Expand-Archive -Path $nssmZip -DestinationPath "$WorkDir\temp_nssm" -Force
Move-Item -Path "$WorkDir\temp_nssm\nssm-2.24\win64\nssm.exe" -Destination "$WorkDir\nssm.exe" -Force
Remove-Item "$WorkDir\temp_nssm", $nssmZip -Recurse -Force

# 1.4 下载 OpenSSL
Write-Host "正在下载 OpenSSL..." -ForegroundColor Yellow
$opensslZip = "$WorkDir\openssl.zip"
Invoke-WebRequest -Uri "https://github.com/IndySockets/OpenSSL-Binaries/raw/master/Archive/openssl-1.1.1w-x64-win64.zip" -OutFile $opensslZip
Expand-Archive -Path $opensslZip -DestinationPath "$WorkDir\openssl" -Force
Remove-Item $opensslZip -Force
$opensslExe = "$WorkDir\openssl\openssl.exe"


Write-Host "`n====== [2/5] 生成 OpenSSL 自签名证书 ======" -ForegroundColor Green
$crtPath = "$WorkDir\server.crt"
$keyPath = "$WorkDir\server.key"

& $opensslExe req -x509 -nodes -days 3650 -newkey rsa:2048 `
-keyout $keyPath -out $crtPath `
-subj "/CN=sing-box.local/O=SingBox/OU=Server"


Write-Host "`n====== [3/5] 动态生成 UUID 与 config.json ======" -ForegroundColor Green
$userUUID = [guid]::NewGuid().ToString().ToUpper()

$configJson = @"
{
"log": {
"level": "info",
"output": "$WorkDirForwardSlash/sing-box.log",
"timestamp": true
},
"inbounds": [
{
"type": "vless",
"tag": "vless-in",
"listen": "0.0.0.0",
"listen_port": 443,
"users": [
{
"uuid": "$userUUID"
}
],
"transport": {
"type": "ws",
"path": "/ws"
},
"tls": {
"enabled": true,
"certificate_path": "$WorkDirForwardSlash/server.crt",
"key_path": "$WorkDirForwardSlash/server.key",
"insecure": true
}
}
],
"outbounds": [
{
"type": "direct",
"tag": "direct"
}
]
}
"@

$configJson | Out-File -FilePath "$WorkDir\config.json" -Encoding UTF8 -Force


Write-Host "`n====== [4/5] 验证配置文件 ======" -ForegroundColor Green
& "$WorkDir\sing-box.exe" check -c "$WorkDir\config.json"


Write-Host "`n====== [5/5] NSSM 注册并启动系统服务 ======" -ForegroundColor Green
$ServiceName = "sing-box"

$existingService = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
if ($existingService) {
& "$WorkDir\nssm.exe" stop $ServiceName
& "$WorkDir\nssm.exe" remove $ServiceName confirm
}

& "$WorkDir\nssm.exe" install $ServiceName "$WorkDir\sing-box.exe" "run -c config.json"
& "$WorkDir\nssm.exe" set $ServiceName AppDirectory "$WorkDir"
& "$WorkDir\nssm.exe" set $ServiceName Start SERVICE_AUTO_START
& "$WorkDir\nssm.exe" set $ServiceName AppExit Default Restart
& "$WorkDir\nssm.exe" set $ServiceName AppStdout "$WorkDir\service_stdout.log"
& "$WorkDir\nssm.exe" set $ServiceName AppStderr "$WorkDir\service_stderr.log"
& "$WorkDir\nssm.exe" start $ServiceName

Write-Host "`n========================================================" -ForegroundColor Green
Write-Host " 🎉 Sing-box 部署完成!" -ForegroundColor Green
Write-Host " 📁 安装位置: $WorkDir" -ForegroundColor Yellow
Write-Host " 🔑 生成的 UUID: $userUUID" -ForegroundColor Yellow
Write-Host "========================================================" -ForegroundColor Green

参考资料

  1. 什么是 VPN,它是怎样运作的? (kaspersky.com.cn)
  2. yukaiji/buildVpn: 图文教程搭建一个vpn翻墙 (github.com)
  3. sucong426/freevpn: 新手搭建VPN科学上网教程/自由/v2ray/翻墙梯子/快速最新/免费机场 (github.com)
  4. sucong426/VPN: 快速搭建个人VPN/科学上网/翻墙/教程/ssr/ss/bbr/梯子搭建/自建机场/自由上网/代理服务/VPN/2023最新教程 (github.com)
  5. 2023年Vultr服务器是否还值得用 - 知乎 (zhihu.com)
  6. Home · xiaoming2028/FreePAC Wiki (github.com)
  7. Shadowsocks 一键安装脚本(四合一) | 秋水逸冰 (teddysun.com)
  8. ysoc/v2ray_windows_server: v2ray在服务器上搭建服务端
  9. 最隐匿的节点搭建方案:用 Sing-box 快速部署 VLESS + Reality/VLESS + TLS
  10. 如何在 Windows 服务器上安装 VLESS 代理 | Hiddence 博客
-------------本文结束感谢您的阅读-------------
感谢阅读.

欢迎关注我的其它发布渠道