文章目录
1 我的实现
我在使用wireguard搭建lan-to-lan的vpn网络中(office-to-阿里云),发现阿里云在这方面做了限制,只能使用pc-to-lan(pc-to-阿里云),故想用nat的方式模拟pc-to-lan,故搜到了下面这篇文章。
下面这篇文章它在每一端都是用了nat,这并不是我需要的,我只需要在office端使用nat,所以:
-
阿里云端:即
gateway
配置中删除了PostUp
与PostDown
项(阿里云端保持使用一般模式) -
office端:即
NAT-A|B|C
配置中修改-o eth0 -j MASQUERADE
为-o %i -j MASQUERADE
(%i代表wg网卡,我与下文的nat方向是相反的)
这样:PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o %i -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o %i -j MASQUERADE
这样office端局域网的用户就可以访问阿里云端所有的服务器了(你需要在你的office端局域网及阿里云端vpc上定义相关路由信息),但是这样难以审计到底是哪台pc访问了服务器(阿里云很讨厌,一定是为了卖自己的vpn网关,不允许自己造)
当然,你也可以在所有节点的wireguard
配置文件中全部删除PostUp
与PostDown
项,使用centos 7中的firewalld.service
开启nat,方法如下:
-
office端运行以下命令:
# 参考 # CentOS 7 as NAT Gateway for Private Network # https://blog.redbranch.net/2015/07/30/centos-7-as-nat-gateway-for-private-network/ ## 清除所有规则 rm -f /etc/firewalld/zones/* systemctl restart firewalld.service ## 开启转发 sysctl -a | grep ip_forward ## 开启nat模式 firewall-cmd --zone=external --add-interface=wg4 --permanent firewall-cmd --zone=internal --add-interface=eth0 --permanent firewall-cmd --zone=external --add-masquerade --permanent firewall-cmd --complete-reload
原文链接:https://anyisalin.github.io/2018/11/21/fast-flexible-nat-to-nat-vpn-wireguard/
原文内容如下:
Posted on 2018-11-21 |
Symbols count in article: 4.4k | Reading time ≈ 0:04
WireGuard ®是一种非常简单而现代,快捷的VPN,利用最先进的加密技术。它比IPSec 更快,更简单,更精简,更有用。它比OpenVPN更高效。WireGuard设计为通用VPN,适用于多种不同情况。它是跨平台的,可大规模部署。它已经被认为是业内最安全,最易于使用,最简单的VPN解决方案。
2 nat to nat 场景下 openvpn vs wireguard 架构
传统 vpn 在很难做到类似多个 nat 之间资源共享
客户端如果想要同时访问多个 nat 只能像图中的 NAT C 客户端一样连接两个 vpn
得益于 wireguard 中没有 client/server 的概念,所有 nat 中的某台机器与 gateway 主机建立连接,即可实现共享所有节点的网络资源
3 实验
实验环境如下,Peer 指的是每个 wireguard 节点的出口网卡,类似 openvpn 连接生成的 tunnel 网卡
安装 wireguard 参考 https://www.wireguard.com/install/
确保需要共享 nat 的 wireguard 节点 ip 转发已开启
sysctl -w net.ipv4.ip_forward=1
3.1 gateway 配置
$ cd /etc/wireguard
$ wg genkey | tee privatekey | wg pubkey > publickey
$ cat > wg0.conf <<EOF
[Interface]
ListenPort = 12000
Address = 5.5.5.1/24
PrivateKey = ${GATEWAY_SERVER_PRIVATE_KEY}
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
EOF
$ wg-quick up wg0
3.2 NAT-A 配置
$ cd /etc/wireguard
$ wg genkey | tee privatekey | wg pubkey > publickey
$ cat > wg0.conf <<EOF
[Interface]
Address = 5.5.5.4/24
PrivateKey = ${NAT_A_PRIVATE_KEY}
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = ${GATEWAY_SERVER_PUBLIC_KEY}
AllowedIPs = 5.5.5.0/24
Endpoint = ${GATEWAY_SERVER:12000}
PersistentKeepalive = 10
EOF
$ wg-quick up wg0
3.3 NAT-D 配置
$ cd /etc/wireguard
$ wg genkey | tee privatekey | wg pubkey > publickey
$ cat > wg0.conf <<EOF
[Interface]
Address = 5.5.5.2/24
PrivateKey = ${NAT_D_PRIVATE_KEY}
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = ${GATEWAY_SERVER_PUBLIC_KEY}
AllowedIPs = 5.5.5.0/24
Endpoint = ${GATEWAY_SERVER:12000}
PersistentKeepalive = 10
EOF
$ wg-quick up wg0
3.4 NAT-C 配置
$ cd /etc/wireguard
$ wg genkey | tee privatekey | wg pubkey > publickey
$ cat > wg0.conf <<EOF
[Interface]
Address = 5.5.5.3/24
PrivateKey = ${NAT_C_PRIVATE_KEY}
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = ${GATEWAY_SERVER_PUBLIC_KEY}
AllowedIPs = 5.5.5.0/24
Endpoint = ${GATEWAY_SERVER:12000}
PersistentKeepalive = 10
EOF
$ wg-quick up wg0
3.5 gateway 添加 peer
在所有的 wireguard 节点配置好之后,要在 gateway 节点添加 peer 的信息
$ cd /etc/wireguard
$ cat >> wg0.conf <<EOF
[Peer]
PublicKey = ${NAT_A_PUBLIC_KEY}
AllowedIPs = 5.5.5.4/32
[Peer]
PublicKey = ${NAT_C_PUBLIC_KEY}
AllowedIPs = 5.5.5.3/32
[Peer]
PublicKey = ${NAT_D_PUBLIC_KEY}
AllowedIPs = 5.5.5.2/32
$ wg-quick down wg0 && wg-quick up wg0
3.6 连接测试
现在所有节点的 5.5.5.0/24 网段已经建立了连接,在任意 wireguard 节点都应该能够 ping 通以下 IP
- 5.5.5.1
- 5.5.5.2
- 5.5.5.3
- 5.5.5.4
3.7 共享 NAT
连接测试成功之后就可以共享 wireguard 节点的所在的网络了
wireguard 配置文件中 Peer.AllowedIPs
实际上就是在当前节点上加多条静态路由
ip route add 5.5.5.2/32 dev wg0
目前 gateway 节点只能够访问 5.5.5.0/24 网段的机器,但我们只需要将需要访问的 nat 网段添加到 对应的 Peer
下的 AllowedIPs
中就能够正常访问了
例如,我们需要在 gateway 节点上访问 NAT-A(10.10.23.0/24) 网段,那么我们只需要修改 gateway 节点上 wireguard 配置文件中 NAT-A Peer 的配置即可
[Peer]
PublicKey = ${NAT_A_PUBLIC_KEY}
AllowedIPs = 5.5.5.4/32,10.10.23.0/24
配置完成之后 wg-quick down wg0 && wg-quick up wg0
尝试 ping NAT-A 网段的地址即可
只要 gateway 能够访问 NAT-A 网段的之后,同理在其他的 wireguard 客户端配置 gateway Peer
的 AllowedIPs
之后,通过 gateway 进行一次转发也能够访问 NAT-A 网段了
4 日常使用
由于工作原因,平时有很多不同的网络环境需要访问,常常需要 ssh 代理、openvpn 来切换各种网络环境,用了 wireguard 之后解决了我的痛点,目前我使用 wireguard 连接了五个 NAT 网络
5 总结
通过 wireguard 可以迅速构建支持多平台的大规模复杂的 vpn 网络,并且 wireguard 的性能高于 openvpn
、ipsec
等常用 vpn 方案
更多关于 wireguard 的资料
https://www.wireguard.com/
https://staaldraad.github.io/2017/04/17/nat-to-nat-with-wireguard/
https://github.com/adrianmihalko/raspberrypiwireguard
6 最后
爱你!