部署 WireGuard 实现两个机房之间互通

温馨提醒

需求

两个数据中心内网之间互通

环境

环境公网IP内网IPOS
华为云-广州110.41.20.135172.16.0.133Ubuntu 22.04
华为云-北京114.114.131.37192.168.2.152Ubuntu 22.04

image-20250424131921037

image-20250424132003831

部署 WireGuard

  • 在两端节点上部署

    1
    2
    3
    4
    5
    
    # Ubuntu/Debian
    apt install wireguard-tools wireguard
    
    # RockyLinux9.0
    dnf install epel-release wireguard-tools

    CentOS 7 安装

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    # 安装 epel 源
    yum install epel-release -y
    
    # 安装 dkms
    yum install dkms -y
    
    # 查看内核版本
    uname -r
    
    # 下载wireguard-dkms离线rpm包
    https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/package/wireguard-dkms/
    
    # 安装 wireguard-dkms
    wget https://download.copr.fedorainfracloud.org/results/jdoss/wireguard/epel-7-x86_64/04573240-wireguard-dkms/wireguard-dkms-1.0.20220627-1.el7.noarch.rpm
    yum localinstall wireguard-dkms-1.0.20220627-1.el7.noarch.rpm -y
    
    # 安装 wireguard-tools
    yum install wireguard-tools -y

    如果在启动 wg-quick@wg0时,启动报错,查看内核是否一致,如不一致,则升级到一致的版本即可

    rpm -qa | grep kernel

    rpm -qa | grep kernel-devel

  • 在两端节点上生成密钥

    1
    2
    3
    
    cd /etc/wireguard
    wg genkey | tee server_private.key | wg pubkey > server_public.key
    wg genkey | tee client_private.key | wg pubkey > client_public.key
  • 在两端节点上启用内核转发

    1
    2
    
    echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
    sysctl -p

配置 WireGuard

  • 广州节点配置

    vim /etc/wireguard/wg0.conf

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    [Interface]
    Address = 10.0.0.1/24
    PrivateKey = 本端的私钥
    # 服务端监听的端口
    ListenPort = 51820
    DNS = 8.8.8.8
    MTU = 1420
    
    # wg0 改成具体的配置文件名称
    # eth0 改成具体的网卡
    PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    
    [Peer]
    PublicKey = 对端的公钥
    AllowedIPs = 10.0.0.2/24, 192.168.2.0/24		# 对端的内网IP
    Endpoint = 114.115.131.37:51820					# 对端的公网IP
    PersistentKeepalive = 25
  • 北京节点配置

    vim /etc/wireguard/wg0.conf

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    [Interface]
    Address = 10.0.0.2/24
    PrivateKey = 本端的私钥
    ListenPort = 51820
    
    PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    
    [Peer]
    PublicKey = 对端的公钥
    AllowedIPs = 10.0.0.1/24, 172.16.0.0/24			# 对端的内网IP
    Endpoint = 110.41.20.135:51820					# 对端的公网IP
    PersistentKeepalive = 25
  • 安全组开放 51820/UDP 端口

测试

image-20250424132405309

image-20250424132241607

如果要实现广州节点网段的所有主机与北京节点网段的所有主机之间互通,需要在其他节点上添加一条路由

比如 广州节点的主机 172.16.0.150 要访问北京节点的 主机192.168.2.150,只需要在这两台机器上添加一条到对端的路由,走本网段的 VPN 地址,格式:ip route add 对端的内网网段 via 中继器地址(就是vpn的 IP 地址)

172.16.0.150 上执行ip route add 192.168.2.150/24 via 172.16.0.133 dev eth0

192.168.2.150 上执行ip route add 172.16.0.150/24 via 192.168.2.152 dev eth0