Ik probeer blijkbaar iets onmogelijks te doen, en ben benieuwd of iemand mij daarbij een duwtje in de juiste richting kan geven.
Wat ik wil doen: de USG via Wireguard laten verbinden met een VPN aanbieder, en vervolgens een VLAN opzetten waarbij het verkeer over de VPN gaat. Ik heb ooit, lang geleden, dit opgelost met een VM binnen het netwerk waarop OpenVPN draait en dan wat firewall / iptables regels. Vervolgens in de USG de DHCP gateway aangepast zodat het verkeer naar die VM wordt gestuurd en klaar. Intussen heb ik wat zitten spelen met Wireguard op de USG (is een package voor dat ook bestaat onder het Wireguard project op GitHub. Inclusief alle config tree stuff) om van buitenaf met het netwerk te kunnen verbinden en dat werkt ook prima. Alleen wil ik nu dus ook een VPN "naar buiten toe opzetten" (in Wireguard bestaat het niet, maar zeg maar "als client", i.p.v. "als server" wat ik wel al aan de praat heb).
De staat waarin de boel zich nu bevind is dat het verkeer wel de tunnel op wordt gestuurd, en terug komt, en dan loopt het mis. Als ik op de USG een tcpdump draai op de wg interface dan zie ik het verkeer netjes de deur uit gaan onder het IP adres van de tunnel (dus het Wireguard address), dus het NATen werkt. Ik zie vervolgens ook mooi een reply terug komen, gericht aan "mijn kant van de tunnel". Maar vervolgens vind ik dat pakketje nergens meer terug.
Wat ik echter wel terug vind is heel veel errors in /var/log/messages. Zijnde:
Router kernel: IPv4: martian source 172.16.1.200 from 1.1.1.1, on dev wg15
Dit is dus het resultaat van een client apparaat op dat VLAN met IP adres 172.16.1.200, die een ping doet naar 1.1.1.1. Terwijl ik met een tcpdump dus zie van "10.x.y.z > 1.1.1.1" en "1.1.1.1 > 10.x.y.z" met 10.x.y.z dus het IP adres dat ik heb aangeleverd gekregen van de VPn provider. Blijkbaar wordt het verkeer dus wel "ge-ont-nat", maar vervolgens loopt ergens iets mis. Wat ik zo'n beetje terug vind v.w.b. die "martian source" heeft dit echter meer te maken met compleet ongeldige IP adressen, dan "ik weet niet hoe het te routeren". Terwijl naar mijn idee het adres gewoon geldig is
Wat tot nu toe de "tastbare" resultaten zijn van mijn config.gateway.json gepruts:
root@Router:~$ ip route
default via 217.120.22.1 dev eth0 proto zebra
10.1.10.0/24 dev wg10 proto kernel scope link src 10.1.10.1
10.1.12.0/24 dev wg12 proto kernel scope link src 10.1.12.1
10.129.150.202 dev wg15 proto kernel scope link src 10.129.150.202
127.0.0.0/8 dev lo proto kernel scope link src 127.0.0.1
172.16.1.0/24 dev eth1.15 proto kernel scope link src 172.16.1.1
172.16.10.0/24 dev eth1.40 proto kernel scope link src 172.16.10.1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.1
192.168.10.0/24 dev eth1.10 proto kernel scope link src 192.168.10.1
192.168.11.0/24 dev eth1.11 proto kernel scope link src 192.168.11.1
192.168.12.0/24 dev eth1.12 proto kernel scope link src 192.168.12.1
192.168.20.0/24 dev eth1.20 proto kernel scope link src 192.168.20.1
192.168.30.0/24 dev eth1.30 proto kernel scope link src 192.168.30.1
<public IP/23 dev eth0 proto kernel scope link src <public IP>
is de standaard routing tabel.
Maar deze wordt toegepast voor verkeer vanaf het specifieke VLAN:
root@Router:~$ ip route show table 15
default dev wg15 scope link
blackhole default metric 1
De POSTROUTING tabel die de NAT toepast:
root@Router:~# iptables -nL POSTROUTING -t nat
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
UBNT_VPN_IPSEC_SNAT_HOOK all -- 0.0.0.0/0 0.0.0.0/0
MINIUPNPD-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0
UBNT_PFOR_SNAT_HOOK all -- 0.0.0.0/0 0.0.0.0/0
MASQUERADE all -- 172.16.1.0/24 0.0.0.0/0 /* NAT-5000 */
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 match-set corporate_network src /* NAT-6001 */
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 match-set remote_user_vpn_network src /* NAT-6002 */
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 match-set guest_network src /* NAT-6003 */
VYATTA_PRE_SNAT_HOOK all -- 0.0.0.0/0 0.0.0.0/0
En als laatste de magische stukjes uit het definiëren van de de policy based routing:
root@Router:~# iptables -nL airvpn -t mangle
Chain airvpn (1 references)
target prot opt source destination
UBNT_PBR_15 all -- 172.16.1.0/24 0.0.0.0/0 /* airvpn-10 */
RETURN all -- 0.0.0.0/0 0.0.0.0/0 /* airvpn-10000 default-action accept */
root@Router:~# iptables -nL UBNT_PBR_15 -t mangle
Chain UBNT_PBR_15 (1 references)
target prot opt source destination
MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK xset 0x7800000/0x7f800000
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
root@Router:~# ip rule
0: from all lookup local
15: from all fwmark 0x7800000/0x7f800000 lookup 15
220: not from all fwmark 0xffffffff lookup 220
32766: from all lookup main
32767: from all lookup default
Overigens heb ik mijn gepruts gebaseerd op deze pagina:
https://github.com/fvozza/unifi-usg-wireguard . Maar gezien het niet werkt wil ik geen JSON van mezelf dumpen om te voorkomen dat anderen er een werkend voorbeeld in zien / zelf verder gaan prutsen op mijn gepruts dat niet werkt / ....