yyhhyy's blog

yyhhyy

Surge Or Mihomo通过WireGuard回家

320
2024-07-30

1.起因

家里一直有一台软路由,且一直都携带着公网V4,之前有装openwrt的时候,都会开个ss用来回家用,但是现在不是很想装openwrt。于是有了以下的一些折腾。

因为我使用的是ios,也购买了Surge,同时其支持WireGuard协议,最后再去看了下mihomo,也支持WireGuard那么使用WireGuard回家将是最好的选择啦~

最后简单介绍下自己的设备吧。

软路由:5105 (ikuai 主路由、 Debian 、Windows10)

Debian - > 服务端

装有ios的Surge - > 客户端

2.安装

为了保证系统的稳定性,将WireGuard安装在Debian上。使用root权限执行以下命令:

apt install wireguard

3.生成公钥私钥

所有的公钥私钥 都是从服务端来生成的 这点是重中之重

3.1 服务端公钥私钥生成

先生成服务端的公钥私钥

cd /etc/wireguard
wg genkey | tee server_private.key | wg pubkey > server_public.key

3.2 客户端公钥私钥生成

其实就看你有多少个客户端,比如你想用一台装有surege的iphone 和 一台装有mihomo的windows 那就是生成2对公钥私钥

简单理解 几个设备 -> 几对公私钥对

同样的命令 也是 在 /etc/wireguard 这个目录下 执行

wg genkey | tee ios_private.key | wg pubkey > ios_public.key

4.编写wg*.conf

wg的conf 必须在 /etc/wireguard 下,且命名必须是 wg*.conf 的形式 * 放数字就行,比如 wg0.conf

[Interface]
# 服务端的IP地址和子网掩码,定义了WireGuard接口的网络范围
Address = 192.168.63.1/24
# WireGuard服务器监听的UDP端口(注意 端口需要放行)
ListenPort = 22334
# 服务器的私钥,用于加密和身份验证
PrivateKey = <服务端私钥 也就是 server_private.key 的值>

# ens18是网卡 需要自己查看
# 在WireGuard启动时执行的命令,设置防火墙规则以允许流量转发和NAT
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
# 在WireGuard关闭时执行的命令,移除之前添加的防火墙规则
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens18 -j MASQUERADE


# 以一台装有surge的iphone为例
[Peer]
# 客户端的公钥,用于验证客户端身份
PublicKey = <ios公钥 也就是 ios_public.key 的值>
# 允许此客户端使用的IP地址,/32表示单个特定IP
AllowedIPs = 192.168.63.2/32

# 以一台装有mihomo的windows为例
[Peer]
# 客户端的公钥,用于验证客户端身份
PublicKey = <windows公钥 也就是 windows_public.key 的值>
# 允许此客户端使用的IP地址,/32表示单个特定IP
AllowedIPs = 192.168.63.3/32

接下来说说自己的踩坑点

4.1 注意点

  1. 端口一定要放行,只需要放行udp就行了

  2. 密钥的一些交互,一定不要错了,简单理解
    服务端的conf只需要放 服务端自己的私钥其他客户端的公钥 即可

  3. 网卡 一定要看自己出口的是哪张网卡,一般不能照抄!!!

  4. 如果对子网掩码有疑问,简单理解就是,服务端包含整个网段,所以是24;客户端因为指代的就是一个设备,所以是32

至此 wg0.conf 配置完毕

5. 服务端启动

cd /etc/wireguard
wg-quick up wg0

启动完可以 输入 wg 看下是否确实启动了

6. 配置Surge

一共有三个地方需要配置,具体如下:

[Proxy]
Home = wireguard, section-name = Home

[Rule]
IP-CIDR,192.168.88.0/24,Home,no-resolve

[WireGuard Home]
private-key = <ios私钥 也就是 ios_private.key 的值>
self-ip = 192.168.63.2
mtu = 1280
peer = (public-key = <服务端公钥 也就是 server_public.key 的值>, allowed-ips = "0.0.0.0/0, ::0/0", endpoint = ddns.cn:22334, keepalive = 25)

6.1 注意点

  1. 因为我实现的是通过wg就能访问家里所有设备 我家里是88网段,所以[Rule]是88网段 (这点很重要 我之前把 Interface 的网段也写进来了 但是 不能访问家里所有设备)

  2. self-ip 需要与 Interface 同一个网段

  3. endpoint 家里公网ip的 ddns:端口 即可

7.1 配置mihomo

参考的官方的 与 surge 其实类似

proxies:
- name: "wg"
  type: wireguard
  ip: 192.168.63.3
  # 我不用V6 所以不开
  # ipv6: fd01:5ca1:ab1e:80fa:ab85:6eea:213f:f4a5
  private-key: <windows私钥 也就是 windows_private.key 的值>
  peers:
    - server: ddns.cn
      port: 22334
      public-key: <服务端公钥 也就是 server_public.key 的值>
      allowed-ips: ['0.0.0.0/0']
      # pre-shared-key: 31aIhAPwktDGpH4JDhA8GNvjFXEf/a6+UaQRyOAiyfM=
      # reserved: [209,98,59]  # 字符串格式也是合法的,如"U4An"
  udp: true
  # mtu: 1408
  # dialer-proxy: "ss1"  # 一个出站代理的标识。当值不为空时,将使用指定的 proxy/proxy-group 发出连接
  # remote-dns-resolve: true # 强制dns远程解析,默认值为false
  # dns: [ 1.1.1.1, 8.8.8.8 ] # 仅在remote-dns-resolve为true时生效

至此教程结束