主要实现在 OpenWRT 路由器系统下搭建 WireGuard 服务器方便远程连接,
之前一直是在 OpenWRT 使用 Openconnect VPN,因为是 SSLVPN 使用起来结合 CISCO 的 anyconnect 客户端是很方便的,但是由于现在 ISP 连这种基于 SSL 的流量也有可以做识别并封公网 IP,所以不得不考虑切换至基于 UDP 的 OpenVPN 了->WireGuard VPN。
续:原来的文章发到 V 站上面大家都说 WireGuard 的性能更好,然后看了一下资料,如果 Peers 数不是很多的话其实实现 Server/Client 类型的 Dial Up VPN 还是可行的,所以这边也写一下教程方便大家
下面主要分三步:
( 1 )在 OpenWRT 安装并配置好 WireGuard
( 2 )配置多 Peers 方案
那么现在开始吧,目前系统是使用了最新的 OpenWRT 19.07.0-rc1, 应该同时适用于 OpenWrt 18.06.4
先贴个实现 2 个 Peers 连接后的拓扑
1.在 OpenWRT 安装并配置好 WireGuard
先安装好本次所需的全部软件
opkg update
opkg install wireguard luci-proto-wireguard luci-app-wireguard
预设 WireGuard 参数与网段
WG_IF="wg0"
WG_PORT="51820"
WG_ADDR="192.168.9.1/24"
WG_ADDR
定义的网段不要和内网已有的网段冲突
配置防火墙开放相应端口
# Configure firewall
uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci rename firewall.@forwarding[0]="lan_wan"
uci del_list firewall.lan.network="${WG_IF}"
uci add_list firewall.lan.network="${WG_IF}"
uci -q delete firewall.wg
uci set firewall.wg="rule"
uci set firewall.wg.name="Allow-WireGuard"
uci set firewall.wg.src="wan"
uci set firewall.wg.dest_port="${WG_PORT}"
uci set firewall.wg.proto="udp"
uci set firewall.wg.target="ACCEPT"
uci commit firewall
/etc/init.d/firewall restart
生成服务器和客户端证书
客户端的 wgclient.pub 就先用 Windows 的客户端生成一个,并将其传到路由器上面
# 将上图 Windows 客户端生成的 pubkey 命名为 wgclient.pub
echo KWb2OFp1oc/mhU6Ypzg1OFI8R0Qc/pfCdoLnGMmLdX0= > wgclient.pub
# Generate and exchange the keys
umask u=rw,g=,o=
wg genkey | tee wgserver.key | wg pubkey > wgserver.pub
wg genpsk > wg.psk
WG_KEY="$(cat wgserver.key)"
WG_PSK="$(cat wg.psk)"
WG_PUB="$(cat wgclient.pub)"
配置 OpenWRT 服务器网络
# Configure network
uci -q delete network.${WG_IF}
uci set network.${WG_IF}="interface"
uci set network.${WG_IF}.proto="wireguard"
uci set network.${WG_IF}.private_key="${WG_KEY}"
uci set network.${WG_IF}.listen_port="${WG_PORT}"
uci add_list network.${WG_IF}.addresses="${WG_ADDR}"
# Add VPN peers
uci -q delete network.wgclient
uci set network.wgclient="wireguard_${WG_IF}"
uci set network.wgclient.public_key="${WG_PUB}"
uci set network.wgclient.preshared_key="${WG_PSK}"
uci add_list network.wgclient.allowed_ips="${WG_ADDR%.*}.0/${WG_ADDR#*/}"
uci commit network
/etc/init.d/network restart
这样的话,OpenWRT 上面就已经完成配置了,接下来修改一下 Windows 客户端的配置
[Interface]
PrivateKey = 6CJpj1CE2kqmfhJWu9UlzvCKqfm6g9yP8xCM+ggHCU4=
Address = 192.168.9.2/24
[Peer]
PublicKey = EI0o2k+BKTPoVP6e0hbJQSgn3gerwntlsebxLXt1Q3w=
PresharedKey = Ys1gDMulGlZAfW6HVWru5hpxmcQ3BHtWcwYV/pXeW3k=
AllowedIPs = 192.168.9.0/24, 192.168.234.0/24
Endpoint = ddns.example.com:51820
那样正常单 Peer 就已经通了。
2.配置多 Peers 方案
因为是方便 Dial Up 连回家,所以不需要起多个网段了,多个 Peers 用一个网段是最方便的。接下来的配置都可以通过 Luci 去完成了。
先根据第一个 Peer 中使用到的 IP 地址修改 OpenWRT 上面 Peers 的 Allow-IP 设定
比如这个我在客户端设置 Address = 192.168.9.2/24
,那么 OpenWRT 上面对应的 Peer Allowed IPs 修改成 192.168.9.2/32 就可以了,
然后再新增一个 Peer,那么先再另外一台终端的 WireGuard 客户端上面生成一组密钥,并可提前将配置完整
[Interface]
PrivateKey = yBrwJicjkYbOIFtnbhWSoHahhPLivpekcp+u1Gmf72I=
Address = 192.168.9.3/24
[Peer]
PublicKey = EI0o2k+BKTPoVP6e0hbJQSgn3gerwntlsebxLXt1Q3w=
PresharedKey = Ys1gDMulGlZAfW6HVWru5hpxmcQ3BHtWcwYV/pXeW3k=
AllowedIPs = 192.168.9.0/24, 192.168.234.0/24
Endpoint = ddns.example.com:51820
然后将其生成的 pubkey 通过 Web Luci 配置到 OpenWRT 上面去就行了
这样基本就完成了两节点的 WireGuard VPN 配置,如果需要更多的节点,重复第二步就可以了。
refer:
2.原文
1
buddha 2019-11-29 20:54:49 +08:00
我家里 openwrt 上 wireguard 和 openconnect 都有 但是都是 client 连"外面"的服务器, UDP 都有时不时几分钟到几十分种阻断的, 立竿见影的解决就是 pppoe 重新拨号
当然你 2 个帖子都是在 openwrt 上搭服务器,外面连进来 是不是也会阻断就要看看了. |
2
GetWoke 2019-11-29 21:18:59 +08:00
wireguard 有个坑爹的地方,就是 Allowed IPs 这个选项,,MD,只能设置允许的 ip,不能设置哪些 ip 不允许,这个设置还会影响倒路由,所有设置 0.0.0.0/0 的时候就 GG 了,同时,你的 ip 不在 Allowed IPs 选项里面的话,你设置路由也没卵用。。。
|
3
cwbsw 2019-11-29 22:06:29 +08:00
|
4
CatCode 2019-11-30 09:00:36 +08:00
我完全不懂网络,,自己内网配这个都没成功
|
5
hiplon OP |
6
icean 2019-12-05 13:04:35 +08:00
wireguard over openwrt 还有个特别坑爹的地方,当隧道基于 ipv6 的时候,不仅无法使用,还存在内存泄漏!我一直不知道为啥路由器每隔几天就重启,后来通过 zabbix 以及各种排查,总算搞清楚了
|
9
zro 2019-12-05 17:26:50 +08:00
@icean
#6 升级到最新版也这样吗? 19.07-RC2 已出。。另外能说下 v6 要怎么写配置呢,加个 FD 开头的地址就行了?谢谢~ #7 在 Ubuntu 之类的 Linux 系统下,倒是可以通过脚本来实现,OP 下还是有点复杂~ |
10
msn1983aa 2020-01-10 13:55:45 +08:00
楼主,咨询下 wg0 和 peer 的网段是不同于 wan 和 lan 的吧?这个网段是先在路由器上设置好,然后设备加入的时候填这个网段,自己给设备指定一个网段下的 ip 就可以,私匙公匙用同一组就好,对不?
|
11
thelittlefox 2020-03-22 19:19:44 +08:00
楼主,咨询下,你用的下载的是哪个版本的固件?我这边 wireguard 的内核模块加载不了 insmod 提示 fail 。
|
12
hiplon OP @thelittlefox #11 我用的都是 openwrt 官方的 release 版本,19.07,18.06
|
13
jim9606 2020-03-31 21:47:21 +08:00
wireguard 目前的一个小麻烦是没法动态分配 IP,没添加一个客户端( Peer )都要在服务器上配置公钥和 IP 地址。
不过估计以后会有配套的高层 daemon 负责 IP 分配 /认证? |
14
hiplon OP @jim9606 #13 wireguard 本身适合做 site to site 的场景,如果多 Peer 这种 dialup 的场景更适合用 sslvpn
|
15
zro 2020-04-02 01:51:08 +08:00
借层楼诉诉苦:😭😭😭
前两天通过 IPv6+DDNS,成功让 iOS 以 4G IPv6 连回家,但昨晚开始,就无法 Handshake 成功,故障很奇怪,OpenWRT 这端能看到 iOS 的 IPv6 地址及连接端口,即使 iOS 换 IP,换端口都会跟着变,但状态一直都是 Latest Handshake: Never,Data Received: 148 B(极少数据);而 iOS 这端也是在不断的 retry Handshake 。。如果开 WiFi 用 v4 内网就立马能成功 Handshake,Google 好几轮也不知问题出在哪~~🙄 |
16
thelittlefox 327 天前
@zro
遇到过类似情况 linux 下的命令可以参考 sudo iptables -A FORWARD -i wg0 -j ACCEPT sudo iptables -t nat -A POSTROUTING -o ens160 -j MASQUERADE sudo ip6tables -A FORWARD -i wg0 -j ACCEPT sudo ip6tables -t nat -A POSTROUTING -o ens160 -j MASQUERADE # 需要使用 iptalbes-persistent 来使 iptables 规则持久化。否则,重启后 iptables 规则失效。 sudo apt install iptables-persistent # wg0 接口开机自启动 sudo systemctl enable wg-quick@wg0 个人感觉最好在内网用树莓派或者其他小主机上的 linux 配置 wireguard ,不容易出问题。 |