Loading... 最近有连接两个内网的小需求,想起了之前写过的 [WireGuard 搭建和使用折腾小记](https://10101.io/2018/11/10/wireguard),决定尝试着使用 WireGuard 来实现。因为两个内网都在 NAT 后,自己也没有固定的公网 IP,所以只能借助一台 VPS 作为中继服务器,用来分别连接两个内网并进行流量转发。以下内容为自己的一点记录,其实大体上和之前的文章区别不大,不过这次主要以手动命令配置为主,方便自己进一步理解。 ## 拓扑环境 ```bash NAT-A (192.168.0.0/24) --- Gateway (VPS) --- NAT-B (10.180.0.0/16) ``` wg 隧道接口 IP 我这里采用的是 10.10.10.0/24 网段的 IP,如下: - NAT-A:`10.10.10.2/24` - GW:`10.10.10.1/24` - NAT-B:`10.10.10.3/24` ## 安装与配置 ### 环境依赖 1. NAT-A、NAT-B、VPS 均采用一台 Linux PC 作为 WireGuard endpoint; 2. WireGuard 安装过程不再赘述,见[官方文档](https://www.wireguard.com/install/); 3. iptables、iproute2 ### 配置过程 #### GW 端 ```bash # 1. 生成密钥对 wg genkey | tee privatekey | wg pubkey > publickey # 2. 创建 WireGuard tunnel 接口 ip link add dev wg0 type wireguard # 3. 为 wg 接口配置 IP 地址 ip address add dev wg0 10.10.10.1/24 # 4. 指定 gw 端 wg0 接口私钥及接听端口 wg set wg0 private-key $(cat privatekey) listen-port 60000 # 5. 启用 wg0 接口 ip link set up dev wg0 # 6. 开启流量转发 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # > filter 表转发链中允许 wg0 接口的出入流量 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT # > nat 表动态伪装 snat iptables -t nat -A POSTROUTING -o $OUTBOUND_INTERFACE -j MASQUERADE ``` #### NAT-A 端 ```bash # 1. 生成密钥对 wg genkey | tee privatekey | wg pubkey > publickey # 2. 创建 WireGuard tunnel 接口 ip link add dev wg0 type wireguard # 3. 为 WireGuard 接口配置 IP 地址 ip address add dev wg0 10.10.10.2/24 # 4. 指定 NAT-A 端接口密钥及 peer 信息(注意替换字段内容) # > allowed-ips: 指定需要经隧道的 IP 段,即指定相应 IP 段的静态路由;这里除了添加 WireGuard 网段,还需添加 NAT-B 网段地址,即相当于添加路由 ip route add 10.180.0.0/16 dev wg0 # > endpoint: 指定 gw 端的地址和监听端口 # > persistent-keepalive:用于保持长连接 wg set wg0 private-key $(cat privatekey) peer $GW_PUBKEY allowed-ips 10.10.10.0/24,10.180.0.0/16 endpoint $GW_IP:60000 persistent-keepalive 10 # 5. 启用 wg0 接口 ip link set up dev wg0 # 6. 开启流量转发 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # > filter 表转发链中允许 wg0 接口的出入流量 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT # > nat 表动态伪装 snat iptables -t nat -A POSTROUTING -o $OUTBOUNG_INTERFACE -j MASQUERADE ``` #### NAT-B 端 ```bash # 1. 生成密钥对 wg genkey | tee privatekey | wg pubkey > publickey # 2. 创建 WireGuard tunnel 接口 ip link add dev wg0 type wireguard # 3. 为 WireGuard 接口配置 IP 地址 ip address add dev wg0 10.10.10.3/24 # 4. 指定 NAT-B 端接口密钥及 peer 信息(注意替换字段内容) # > allowed-ips: 指定需要经隧道的 IP 段,相当于指定了相应 IP 段的静态路由;这里除了指定 WireGuard 网段,还添加了 NAT-A 网段地址,即相当于添加路由 ip route add 192.168.0.0/24 dev wg0 # > endpoint: 指定 gw 端的地址和监听端口 # > persistent-keepalive:用于保持长连接;设置为 0 代表不打开 wg set wg0 private-key $(cat privatekey) peer $GW_PUBKEY allowed-ips 10.10.10.0/24,192.168.0.0/24 endpoint $GW_IP:60000 persistent-keepalive 10 # 5. 启用 wg0 接口 ip link set up dev wg0 # 6. 开启流量转发 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # > filter 表转发链中允许 wg0 接口的出入流量 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT # > nat 表动态伪装 snat iptables -t nat -A POSTROUTING -o $OUTBOUNG_INTERFACE -j MASQUERADE ``` #### GW 端添加 peer ```bash # 1. 添加 peer NAT-A,注意 allowed-ips 添加 NAT-A 网段,相当于添加到 NAT wg set wg0 peer $NAT_A_PUBKEY allowed-ips 10.10.10.2/32,192.168.0.0/24 # 2. 添加 peer NAT-B,注意 allowed-ips 添加 NAT-B 网段 wg set wg0 peer $NAT_B_PUBKEY allowed-ips 10.10.10.3/32,10.180.0.0/16 ``` 至此,就全部配置完成了,NAT-A (192.168.0.0/24) 与 NAT-B (10.180.0.0/16) 两个 LAN 可以通过 GW 进行通信了。如需添加更多 NAT 网络,同样操作即可,主要就是 allowed-ips 即路由的设置。 ### 配置文件 上述过程可以编写成配置文件(默认保存位置 `/etc/wireguard`)通过 `wg-quick` 命令快速运行,这里不再赘述(可参考 [WireGuard 搭建和使用折腾小记](https://10101.io/2018/11/10/wireguard)),各端配置文件示例如下: ```ini # GW [Interface] ListenPort = 60000 Address = 10.10.10.1/24 PrivateKey = $GW_PRIVATE_KEY PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o $OUTBOUND_INTF -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o $OUTBOUND_INTF -j MASQUERADE [Peer] PublicKey = $NAT_A_PUBKEY AllowedIPs = 10.10.10.2/32, 192.168.0.0/24 [Peer] PublicKey = $NAT_B_PUBKEY AllowedIPs = 10.10.10.3/32, 10.180.0.0/16 # NAT-A [Interface] Address = 10.10.10.2/24 PrivateKey = $NAT_A_PRIVATEKEY [Peer] PublicKey = $GW_PUBKEY AllowedIPs = 10.10.10.0/24,10.180.0.0/16 Endpoint = $GW_IP:60000 PersistentKeepalive = 10 # NAT-B [Interface] Address = 10.10.10.3/24 PrivateKey = $NAT_B_PRIVATEKEY [Peer] PublicKey = $GW_PUBKEY AllowedIPs = 10.10.10.0/24,192.168.0.0/24 Endpoint = $GW_IP:60000 PersistentKeepalive = 10 ``` ## 参考 - https://staaldraad.github.io/2017/04/17/nat-to-nat-with-wireguard/ - https://www.wireguard.com/ 最后修改:2021 年 06 月 06 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏
6 条评论
最近碰到个问题,一直无法解决。买的vultr服务器,用wireguard搭的科学上网服务,但无法访问谷歌学术 https://scholar.google.com/, 博主有啥解决方案么? 有些vpn提供商,能访问。据说可能是几大服务器提供商的ip段 被谷歌学术禁了。。不知道有啥解决方案没?
一些国际知名服务商的 IP 基本上都没法上谷歌学术,没啥办法,可能找一些小众的服务商好些,或者找支持比较好的机场
博主以前那篇iphone選購指南怎麼沒了,,想參考下的
我好像没写过 iPhone 选购指南吧,记错了?
怎么注册呢?
注册啥?