0%

SD-WAN 异地组网

前言

  • 有时候需要两个局域网之间能互相访问,比如远程办公需要访问公司的资料,或者外出需要访问家里的 NAS;基于管理和安全的考虑,结合用过的软件,这里做下记录

方案

  • 异地组网的方案有很多,这里以 WireGuard,ZeroTier,TailScale 这三个软件为主,其他诸如 OmniEdge,向日葵等没用过的就不做说明了

ZeroTier

  • 优点:不基于 WireGuard,和交换机一样工作在第二层(数据链路层),配置简单,支持多个平台

  • 缺点:免费的 moon 由于都在国外,体验不是很好,不过可以自己在 vps 上搭建私有 moon

主要步骤:

  1. www.zerotier.com 创建一个账号并登录

  2. Create A Network, Network ID 为设备加入局域网中的唯一标识符

  3. 配置网络信息,如果局域网设置为 Private,每当有新的设备加入需要在 web 页面确认

  4. 安装到设备上,登录账号即可

  5. 到 web 页面中确认是否添加到局域网中,也可为设备分配固定的虚拟 ip

WireGuard

  • 优点:工作在第三层(网络层),以 UDP 协议进行数据传输,灵活安全高效,支持多个平台

  • 缺点:需要一台服务器,没有管理的页面,配置较为麻烦

主要步骤:

  1. 安装到设备上

    • Ubuntu

      1
      2
      3
      4
      5
      6
      7
      # begin with 19.10(Eoan), the two following statement are not needed
      # 19.10(Eoan) 之后,以下这两句不用再执行。
      apt install software-properties-common;
      add-apt-repository ppa:wireguard/wireguard;

      apt-get update;
      apt-get install wireguard;
    • CentOS7

      1
      2
      3
      curl -Lo /etc/yum.repos.d/wireguard.repo \ 
      https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo;
      yum install wireguard-dkms wireguard-tools;
  2. 服务端和每一台客户端都需生成密钥

    1
    2
    mkdir -p /etc/wireguard/
    wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
  3. 服务端配置文件中填入 申请的虚拟 ip,监听端口,服务器私钥,每个客户端的公钥,允许的 ip 网段

    1
    2
    3
    4
    5
    6
    7
    8
    [Interface]
    Address = 10.0.0.1/24
    ListenPort = <port>
    PrivateKey = <server_private.key>

    [Peer]
    PublicKey = <client_public.key>
    AllowedIPs = 10.0.0.2/32
  4. 客户端配置文件中填入 客户端私钥,申请的虚拟 ip,服务器公钥,允许的 ip 网段,服务器 ip 和端口号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Interface]
    PrivateKey = <client_Private Key>
    Address = 10.0.0.2/32
    DNS = 8.8.8.8

    [Peer]
    PublicKey = <server_public.key>
    Endpoint = <Server Public IP>:<port>
    AllowedIPs = 0.0.0.0/0
  5. 服务端还需要配置一些读写权限,ip 内核转发以及防火墙

  6. 启动服务的一些命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 启动服务
    wg-quick up wg0

    # 停止服务
    wg-quick down wg0

    # 或者用 systemctl 命令启动服务
    systemctl start [email protected]

    # 设置为开机启动
    systemctl enable [email protected]

    # 取消开机启动
    systemctl disable [email protected]

TailScale

  • 优点:基于 WireGuard,自动 NAT 穿透,打洞成功率较高,打洞失败再走中继服务器(derp),配置简单,支持多个平台

  • 优点:在 Linux 上可以设置出口节点(Exit Node),其他机器只要选择这个 Linux 节点,那么所有的流量都会走这个出口节点

  • 缺点:定制不如 WireGuard 灵活,比较适合个人快速组网

主要步骤:

  1. login.tailscale.com 创建一个账号并登录

  2. 安装到 OpenWrt 上

    • ssh 登录到路由器上

    • 下载安装包

      1
      wget https://github.com/adyanth/openwrt-tailscale-enabler/releases/download/v1.36.1-fb2f6cf-autoupdate/openwrt-tailscale-enabler-v1.36.1-fb2f6cf-autoupdate.tgz
    • 解压软件

      1
      tar x -zvC / -f openwrt-tailscale-enabler-v1.36.1-fb2f6cf-autoupdate.tgz
    • 安装依赖包

      1
      2
      opkg update
      opkg install libustream-openssl ca-bundle kmod-tun
    • 设置开机启动

      1
      2
      /etc/init.d/tailscale enable
      ls /etc/rc.d/S*tailscale*
    • 启动 TailScale

      1
      /etc/init.d/tailscale start
    • 第一次需要配置子网路由,子网地址是 OpenWrt LAN 网段,以及配置出口节点

      1
      tailscale up --advertise-routes=192.168.5.0/24 --accept-dns=false --advertise-exit-node
    • 获取登录链接,复制到浏览器中打开,登录账号

      1
      tailscale up
    • 在 TailScale 管理页面,点击设备列表右侧的更多图标,禁用密钥过期,打开子网路由,并允许此设备为出口节点

    • 在 OpenWrt 上新建一个接口,协议选静态地址,自定义接口填 tailscale0,地址为 TailScale 管理页面上分配的地址,子网掩码 255.0.0.0,防火墙区域选 LAN 区域

    • 添加防火墙规则

      1
      2
      3
      iptables -I FORWARD -i tailscale0 -j ACCEPT
      iptables -I FORWARD -o tailscale0 -j ACCEPT
      iptables -t nat -I POSTROUTING -o tailscale0 -j MASQUERADE
    • 重启防火墙

      1
      2
      3
      /etc/init.d/firewall reload
      # or
      /etc/init.d/firewall restart