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 版本,提供了 wireguardwireguard-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 内核。

  1. 查看可用列表。

    yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-ml.x86_64
    
  2. 安装稳定版本。

    yum --enablerepo=elrepo-kernel install  kernel-ml -y   
    
  3. 查看现有内核。

    awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
    
  4. 修改默认启动项。

    grub2-set-default <现有内核列表索引号>
    

    注意:索引号由上至下、从 0 开始。

  5. 手动重启 reboot

    注意:若为云服务器,在网页 UI 重启云服务器无效。

更多

参阅官方: Installation - WireGuard

链路使用

服务器使用

请参阅: 【司波图】基于Wireguard组网技术的内网穿透教程 哔哩哔哩 bilibili

客户端使用

Windows 、 Android

参阅视频,略。

OPNsense

最新的 23.1 版本,提供了 wireguardwireguard-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;
        ......
    }
posted @ 2022-09-05 20:59  Yogile  阅读(4990)  评论(0编辑  收藏  举报