最近有个需求是要翻去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执行时机

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。