最近有个需求是要翻去US region,但碍于本地端的client装置不是智慧型装置,无法用常见的client-server vpn做设定,所以有了site to site vpn这篇诞生。
以前就知道site to site vpn的存在,但因为需求的关係,其实一直没有实作,这边也记录了一下。
懒的画图,文字描述一下这次的需求:
RouterOS作为WireGuard端的Peer(Client),但这样讲述其实不是这麽精确,WireGuard并没有client-server的概念。不过为了好理解,先这样说明吧!
Ubuntu作为WireGuard端的Server端,同第一点,这边也只是因为好理解这样称呼。我这边因为要跳去US,所以在GCP上开一台起来装。
RouterOS透过WireGuard连去Ubuntu,同时Route所有的流量到Ubuntu出去。简单来说就是让接在Router OS后面的所有装置都能走Ubuntu的外网IP出去。
所以大概可以分为两阶段
Server端安装WireGuard
Client端设定WireGuard+Peer
1. Server 端安装WireGuard
这裡在GCP开Ubuntu,GCP怎操作我就不详述了。用的是Ubuntu 22.04 LTS
也可以参考这个youtube: https://www.youtube.com/watch?v=cF9dQc6GLTU
(不过后半段它是属于Client to Site的做法,所以我撷取前半段内容并且微调了一些地方让NAT可以正常运作,与在Mikrotik论坛上老外的分享综合整理了一下)
#因为要把Ubuntu当Router,起手式可以先开好ipv4 nat
vi /etc/sysctl.d/70-wireguard-routing.conf
#写入 net.ipv4.ip_forward = 1
#储存离开后输入 sudo sysctl -p /etc/sysctl.d/70-wireguard-routing.conf -w
建议这裡会先要重开机一下,有时候Ubnutu NAT fw可能不会立即生效
#再来先装好WireGuard
sudo apt install wireguard
#gen pub/private key
wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey
#接著要编辑wg config
vi /etc/wireguard/wg0.conf
输入(注意红字需要调整成你自己的形状,gcp给的nic interface name有可能是ens4之类的)
[interface] PrivateKey=刚刚PrivateKey Address=172.16.0.1/16 SaveConfig=true PostUp=iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE; PostDown=iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE; ListenPort=51820
储存离开
这边有几个重要讯息稍后会用上
Server side这边的WG gateway ip设定为172.16.0.1
Port为51820
#接著要把wg开起来
sudo wg-quick up wg0
#看一下wg状态
sudo wg
#大概会长这样
interface: wg0 public key: xxxxxxxxxxxxxxxxxxxxxxxxxxx private key: (hidden) listening port: 51820
到这裡Ubuntu告一段落,稍后还要把Router OS上的wg public key填回来Ubuntu端设定好
2. Client端设定WireGuard+Peer
这裡用的是古老的RouterBoard RB450G,已经升级到RouterOS 7.6,注意WireGuard需要到RouterOS 7以上才有支援(用上Linux Kernel 5.x+)
这边直接引用老外的作法然后config调整成跟前面youtube一致:
https://forum.mikrotik.com/viewtopic.php?t=181205#p897582
要特别注意的是,以下指令已经把route all network traffic包含其中,用了一个很巧妙的脚本去切换
/interface wireguard add name=wireguard1 private-key= /interface wireguard peers add interface=wireguard1 endpoint-address=你Ubuntu的外网IP endpoint-port=51820 public-key="刚刚Ubuntu上的server_side_public_key" allowed-address=0.0.0.0/0 persistent-keepalive=10s /ip address add interface=wireguard1 address=172.16.0.2 /ip route add dst-address=你Ubuntu的外网IP comment=wgserver disabled=yes add dst-address=0.0.0.0/0 gateway=wireguard1 /ip dhcp-client add add-default-route=no interface=ether1 script=":local route [/ip route find comment=\"wgserver\"]\r\ \n:if (\$bound=1) do={\r\ \n /ip route set \$route gateway=\$\"gateway-address\" disabled=no\r\ \n} else={\r\ \n /ip route set \$route disabled=yes\r\ \n}" use-peer-dns=no use-peer-ntp=no /interface list member add interface=wireguard1 list=WAN /ip dns set allow-remote-requests=yes servers=8.8.8.8,8.8.4.4
设定好之后要到Ubuntu server side注册一下RouterOS这个peer
sudo wg set wg0 peer routerOS上WG的PublicKey allowed-ips 0.0.0.0/0
重启RouterBoard
看一下peer有没有流量
然后再回去ubuntu用sudo wg看一下
instance-1:~$ sudo wg interface: wg0 public key: Ubuntu上WG的public key private key: (hidden) listening port: 51820 peer: 你的RouterOS上给的Public key endpoint: 60.251.xxx.xxx:51820 allowed ips: 0.0.0.0/0 latest handshake: 1 hour, 5 minutes, 32 seconds ago transfer: 1.06 MiB received, 1.08 MiB sent
如果没有的话,router os内ping 172.16.0.1看看有没有通(ubuntu side的wg ip)
然后看一下whatismyip有没有成功翻牆吧~
几个注意的点:
1. wg interface每次重开机之后预设会是关起来的,peer也会被reset掉,可以自己到/etc/rc.local加入,自动打开~
sudo wg-quick up wg0 sudo wg set wg0 peer routerOS上WG的PublicKey allowed-ips 0.0.0.0/0
2. 另外如果你的router有移机更换外部public ip,切记要去Ubuntu上把该peer的config清掉
sudo wg unset wg0 peer routerOS上WG的PublicKey allowed-ips 0.0.0.0/0
或者
vi /etc/wireguard/wg0.conf
把对应peer config给砍了
不然就会遇到你site to site连线连不起来的问题
3. 如果你对外不是DHCP拿IP,例如直接是public static ip的做法,也需要请参透一下上文内容自行调整一下script执行时机
评论(0)