OpenWRT 搭建 WireGuard 服务器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hiplon
V2EX    宽带症候群

OpenWRT 搭建 WireGuard 服务器

  •  
  •   hiplon 2019-11-29 15:42:05 +08:00 13341 次点击
    这是一个创建于 2156 天前的主题,其中的信息可能已经有所发展或是发生改变。

    主要实现在 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 连接后的拓扑

    Topo

    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 的客户端生成一个,并将其传到路由器上面

    WireGuard Windows Client

    # 将上图 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 就已经通了。

    Peer1 Status

    2.配置多 Peers 方案

    因为是方便 Dial Up 连回家,所以不需要起多个网段了,多个 Peers 用一个网段是最方便的。接下来的配置都可以通过 Luci 去完成了。

    先根据第一个 Peer 中使用到的 IP 地址修改 OpenWRT 上面 Peers 的 Allow-IP 设定

    Peer1 Modify

    比如这个我在客户端设置 Address = 192.168.9.2/24,那么 OpenWRT 上面对应的 Peer Allowed IPs 修改成 192.168.9.2/32 就可以了,

    然后再新增一个 Peer,那么先再另外一台终端的 WireGuard 客户端上面生成一组密钥,并可提前将配置完整

    Peer2 Client

    [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 上面去就行了

    Peer2 OpenwRT

    这样基本就完成了两节点的 WireGuard VPN 配置,如果需要更多的节点,重复第二步就可以了。

    refer:

    1.WireGuard basic

    2.原文

    16 条回复    2023-12-30 22:25:39 +08:00
    buddha
        1
    buddha  
       2019-11-29 20:54:49 +08:00
    我家里 openwrt 上 wireguard 和 openconnect 都有 但是都是 client 连"外面"的服务器, UDP 都有时不时几分钟到几十分种阻断的, 立竿见影的解决就是 pppoe 重新拨号

    当然你 2 个帖子都是在 openwrt 上搭服务器,外面连进来 是不是也会阻断就要看看了.
    GetWoke
        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 选项里面的话,你设置路由也没卵用。。。
    cwbsw
        3
    cwbsw  
       2019-11-29 22:06:29 +08:00
    @GetWoke br />Route Allowed IPs 有选项控制的啊,这玩意其实就是个后处理脚本。
    建议你直接说需求,以免陷入一些奇怪的误区。
    CatCode
        4
    CatCode  
       2019-11-30 09:00:36 +08:00
    我完全不懂网络,,自己内网配这个都没成功
    hiplon
        5
    hiplon  
    OP
       2019-11-30 10:48:36 +08:00
    @buddha #1 昨天和其它朋友连了一晚局域网游戏,基本没有断过线,当然这个是省内的互连,情况和你不太一样,广东电信

    @CatCode #4 其实简单来说就是相当于在路由器多建了一个 LAN2,然后其它终端通过 VPN 方式连接过去
    icean
        6
    icean  
       2019-12-05 13:04:35 +08:00
    wireguard over openwrt 还有个特别坑爹的地方,当隧道基于 ipv6 的时候,不仅无法使用,还存在内存泄漏!我一直不知道为啥路由器每隔几天就重启,后来通过 zabbix 以及各种排查,总算搞清楚了
    icean
        7
    icean  
       2019-12-05 13:06:40 +08:00
    @GetWoke 这个确实没办法了,满足不了复杂的需求,所以一般我就全匹配。
    hiplon
        8
    hiplon  
    OP
       2019-12-05 14:05:21 +08:00
    @icean #6 我倒是没有基于 ipv6 隧道,而是基于 ipv4 隧道跑了 ipv6 的流量试了一段时间是可以的
    zro
        9
    zro  
       2019-12-05 17:26:50 +08:00
    @icean
    #6 升级到最新版也这样吗? 19.07-RC2 已出。。另外能说下 v6 要怎么写配置呢,加个 FD 开头的地址就行了?谢谢~
    #7 在 Ubuntu 之类的 Linux 系统下,倒是可以通过脚本来实现,OP 下还是有点复杂~
    msn1983aa
        10
    msn1983aa  
       2020-01-10 13:55:45 +08:00
    楼主,咨询下 wg0 和 peer 的网段是不同于 wan 和 lan 的吧?这个网段是先在路由器上设置好,然后设备加入的时候填这个网段,自己给设备指定一个网段下的 ip 就可以,私匙公匙用同一组就好,对不?
    thelittlefox
        11
    thelittlefox  
       2020-03-22 19:19:44 +08:00
    楼主,咨询下,你用的下载的是哪个版本的固件?我这边 wireguard 的内核模块加载不了 insmod 提示 fail 。
    hiplon
        12
    hiplon  
    OP
       2020-03-23 10:02:17 +08:00
    @thelittlefox #11 我用的都是 openwrt 官方的 release 版本,19.07,18.06
    jim9606
        13
    jim9606  
       2020-03-31 21:47:21 +08:00
    wireguard 目前的一个小麻烦是没法动态分配 IP,没添加一个客户端( Peer )都要在服务器上配置公钥和 IP 地址。
    不过估计以后会有配套的高层 daemon 负责 IP 分配 /认证?
    hiplon
        14
    hiplon  
    OP
       2020-04-01 10:51:31 +08:00
    @jim9606 #13 wireguard 本身适合做 site to site 的场景,如果多 Peer 这种 dialup 的场景更适合用 sslvpn
    zro
        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 好几轮也不知问题出在哪~~
    thelittlefox
        16
    thelittlefox  
       2023-12-30 22:25:39 +08:00
    @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 ,不容易出问题。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2494 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 15:04 PVG 23:04 LAX 08:04 JFK 11:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86