Wireguard+公网轻量应用服务器实现 IPv4 内网穿透
说明
由于商用宽带等链路还未完全支持 IPv6 ,或者说有些单位为了安全考虑禁止了 IPv6 的入口访问和地址分配,导致在外或单位时就是纯 IPv4 环境,而不想要安装客户端,就需要一台 IPv4 公网服务器提供链接服务。
但是像 Ngork 、 Zerotier 之类现在使用体验实在说不上多好,OpenVPN 、 IPsec 又感觉配置繁琐,有的还需要安装客户端。碰巧最近瞄到了 B 站 UP 司波图的新视频,就来试试,发现 4 M带宽的轻量级应用服务器,可以实现 1080P24帧 电影的流畅播放,还有每月重置的 1T 流量。
当然,ESC 云服务器还是好很多,支持 IPv6 就不用内网穿透了,直接代理就完事了,还贵。
介绍
WireGuard是一个易于配置、快速且安全的开源虚拟专用网软件,它利用了最新的加密技术。目的是提供一种更快、更简单、更精简的通用虚拟专用网,它可以轻松地在树莓派这类低端设备到高端服务器上部署。
Wireguard 服务器
我这里使用 spoto 给出的文档进行记录。
Docker Compose
创建 docker-compose.yml
:
version: "3.3"
services:
wg-easy:
image: weejewel/wg-easy
container_name: wg-easy
environment:
- WG_HOST=<域名或IP>
- PASSWORD=<密码>
- WG_DEFAULT_ADDRESS=10.0.1.x
- WG_DEFAULT_DNS=114.114.114.114
- WG_ALLOWED_IPS=10.0.1.0/24
- WG_PERSISTENT_KEEPALIVE=25
volumes:
- /home/docker/wireguard/wireguard:/etc/wireguard
ports:
- "51822:51820/udp"
- "51821:51821/tcp"
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
restart: unless-stopped
注意
参数 | 值 | 说明 |
---|---|---|
WG_DEFAULT_ADDRESS | 10.0.1.x |
这里的 x 指的是任意可分配,不要用具体的数值代替。其他示例: 100.100.100.x 。 |
WG_ALLOWED_IPS | 10.0.1.0/24 |
最好与 WG_DEFAULT_ADDRESS 所指代的相同。 |
ports | "51822:51820/udp" |
可以根据情况更改监听端口,如果你之后想把这个服务作为网络的一个客户端实现点对点的话。 |
原默认协议交换端口为 51820
,为将公网服务器也作为一个节点(其实我也没研究过,不甚清除,只是作为余量避免出现问题),将 51820
分配给宿主机,51822
分配给容器。
运行容器后,容器自分配地址 10.0.1.1
,客户端新建从 10.0.1.2
开始分配。
错误提示
配置错误
若参数 WG_DEFAULT_ADDRESS
设置错误,添加的第一个客户端分配地址为 10.0.1.1
,在添加第二个客户端时,浏览器将弹窗报错:
Maximum number of clients reached.
Wireguard 客户端
Windows 、 Android
可以参考: 【司波图】基于Wireguard组网技术的内网穿透教程 哔哩哔哩 bilibili 。
OPNsense
22.7 版本的 OPNsense 只提供了
wireguard-go
这样一个服务器的插件,若仅实现客户端的功能可以通过下载 FreeBSD 源的软件。pkg install wireguard
最新的 23.1 版本,提供了 wireguard
和 wireguard-go
两个插件,更多请参考: OPNsense 系列七:WireGuard 安装重整理 。
CentOS 7
官方一共给出了三种方法,这里只推荐第二种:使用标准内核的 ELRepo 的预构建模块。
$ sudo yum install epel-release elrepo-release
$ sudo yum install yum-plugin-elrepo
$ sudo yum install kmod-wireguard wireguard-tools
报错
若安装过程中,或者安装完成后调用服务时提示: Cannot find device "wg0"
。那就需要更新 CentOS 7 内核。
-
查看可用列表。
yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-ml.x86_64
-
安装稳定版本。
yum --enablerepo=elrepo-kernel install kernel-ml -y
-
查看现有内核。
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
-
修改默认启动项。
grub2-set-default <现有内核列表索引号>
注意:索引号由上至下、从 0 开始。
-
手动重启
reboot
。注意:若为云服务器,在网页 UI 重启云服务器无效。
更多
参阅官方: Installation - WireGuard 。
链路使用
服务器使用
请参阅: 【司波图】基于Wireguard组网技术的内网穿透教程 哔哩哔哩 bilibili 。
客户端使用
Windows 、 Android
参阅视频,略。
OPNsense
最新的 23.1 版本,提供了 wireguard
和 wireguard-go
两个插件,更多请参考: OPNsense 系列七:WireGuard 安装重整理 。
在 OPNsense 中, Wireguard 客户端默认配置路径为
/usr/local/etc/wireguard
,在默认配置路径下创建wg0.conf
配置文件,并将从wg-easy
容器 Web 服务中的配置文件下载粘贴:[Interface] PrivateKey = xxxxxxxxxxxxxxxxxxxxxx Address = 10.0.1.2/24 DNS = 114.114.114.114 [Peer] PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxx PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxxx AllowedIPs = 10.0.1.0/24 PersistentKeepalive = 25 Endpoint = xxxxxxxxxxxxxxxx:51822
保存后执行:
wg-quick up <默认配置路径>/wg0.conf
因为重启后 Wireguard 客户端默认非开机启动,建议添加到计划任务中。
参考 OPNsense 防火墙系列三:阿里云 aliddns + 计划任务 - Yogile - 博客园 (cnblogs.com) 的计划任务的固定命令配置。
示例:
root@route:/usr/local/opnsense/service/conf/actions.d # cat actions_wireguard_wg0_yogile.conf [up] command:/home/wireguard/wireguard_up_wg0.sh >> /home/Logs/wireguard-wg0.log parameters: type:script description:wg-quick up the wg0 conf message:wg-quick up
在 大厅 -> 服务 中,重启 configd 服务。
在 系统 -> 设置 -> 调度任务 中,点击 + 添加,选择 命令 为 actions_aliddns.conf 中的 description ,其他自定义即可。
其余 Linux
在 CentOS 7 中,默认配置路径为 /etc/wireguard
。
其他 Linux 发行版也是两者中的一个。
在默认配置路径下创建 wg0.conf
配置文件,并将从 wg-easy
容器 Web 服务中的配置文件下载粘贴:
[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxx
Address = 10.0.1.2/24
DNS = 114.114.114.114
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.0.1.0/24
PersistentKeepalive = 25
Endpoint = xxxxxxxxxxxxxxxx:51822
保存后执行:
wg-quick up <默认配置路径>/wg0.conf
因为重启后 Wireguard 客户端默认非开机启动,建议添加到计划任务中。
CentOS 7 :
0 */4 * * * (/usr/local/bin/wg-quick up /etc/wireguard/wg0.conf) >> /home/Logs/wireguard-wg0.log
Nginx 反向代理 HTTPS
Docker Compose
version: '3.1'
services:
nginx:
restart: always
image: nginx:latest
container_name: nginx
ports:
- 80:80
- 443:443
- 51823:51823 # 用于反向代理 Wireguard 提供 ssl
- xxxxx:xxxxx # 更多
volumes:
- /home/docker/nginx/conf.d:/etc/nginx/conf.d
Wireguard 51821 SSL
server {
listen 51823 ssl http2;
server_name <域名> www.<域名>;
ssl on;
root html;
index index.html index.htm;
ssl_certificate /etc/nginx/conf.d/ssl/<域名>.pem;
ssl_certificate_key /etc/nginx/conf.d/ssl/<域名>.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://<域名>:51821;
}
#error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
.conf
文件示例
server {
listen 9999 ssl http2;
server_name xxxxxxx www.xxxxxxx;
ssl on;
root html;
index index.html index.htm;
ssl_certificate /etc/nginx/conf.d/ssl/xxxxxxx.pem;
ssl_certificate_key /etc/nginx/conf.d/ssl/xxxxxxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://10.0.1.2:9999$request_uri;
}
#error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
为了使反向代理的服务不会重定向到 80 端口,设置:
location / {
proxy_set_header Host $host:$server_port;
......
}