首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
测试工具
SmokePing
IPv6 访问测试
hiplon
V2EX  ›  宽带症候群

OpenWRT 搭建 WireGuard 服务器

  •  
  •   hiplon · 61 天前 · 2291 次点击
    这是一个创建于 61 天前的主题,其中的信息可能已经有所发展或是发生改变。

    主要实现在 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 [email protected][0]="lan"
    uci rename [email protected][1]="wan"
    uci rename [email protected][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.原文

    10 回复  |  直到 2020-01-10 13:55:45 +08:00
    buddha
        1
    buddha   61 天前
    我家里 openwrt 上 wireguard 和 openconnect 都有 但是都是 client 连"外面"的服务器, UDP 都有时不时几分钟到几十分种阻断的, 立竿见影的解决就是 pppoe 重新拨号

    当然你 2 个帖子都是在 openwrt 上搭服务器,外面连进来 是不是也会阻断就要看看了.
    GetWoke
        2
    GetWoke   61 天前
    wireguard 有个坑爹的地方,就是 Allowed IPs 这个选项,,MD,只能设置允许的 ip,不能设置哪些 ip 不允许,这个设置还会影响倒路由,所有设置 0.0.0.0/0 的时候就 GG 了,同时,你的 ip 不在 Allowed IPs 选项里面的话,你设置路由也没卵用。。。
    cwbsw
        3
    cwbsw   61 天前
    @GetWoke
    Route Allowed IPs 有选项控制的啊,这玩意其实就是个后处理脚本。
    建议你直接说需求,以免陷入一些奇怪的误区。
    CatCode
        4
    CatCode   60 天前
    我完全不懂网络,,自己内网配这个都没成功
    hiplon
        5
    hiplon   60 天前
    @buddha #1 昨天和其它朋友连了一晚局域网游戏,基本没有断过线,当然这个是省内的互连,情况和你不太一样,广东电信

    @CatCode #4 其实简单来说就是相当于在路由器多建了一个 LAN2,然后其它终端通过 VPN 方式连接过去
    icean
        6
    icean   55 天前
    wireguard over openwrt 还有个特别坑爹的地方,当隧道基于 ipv6 的时候,不仅无法使用,还存在内存泄漏!我一直不知道为啥路由器每隔几天就重启,后来通过 zabbix 以及各种排查,总算搞清楚了
    icean
        7
    icean   55 天前
    @GetWoke 这个确实没办法了,满足不了复杂的需求,所以一般我就全匹配。
    hiplon
        8
    hiplon   55 天前
    @icean #6 我倒是没有基于 ipv6 隧道,而是基于 ipv4 隧道跑了 ipv6 的流量试了一段时间是可以的
    zro
        9
    zro   55 天前
    @icean
    #6 升级到最新版也这样吗? 19.07-RC2 已出。。另外能说下 v6 要怎么写配置呢,加个 FD 开头的地址就行了?谢谢~
    #7 在 Ubuntu 之类的 Linux 系统下,倒是可以通过脚本来实现,OP 下还是有点复杂~
    msn1983aa
        10
    msn1983aa   19 天前
    楼主,咨询下 wg0 和 peer 的网段是不同于 wan 和 lan 的吧?这个网段是先在路由器上设置好,然后设备加入的时候填这个网段,自己给设备指定一个网段下的 ip 就可以,私匙公匙用同一组就好,对不?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2376 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 14:38 · PVG 22:38 · LAX 06:38 · JFK 09:38
    ♥ Do have faith in what you're doing.