Projekt na sobotę, wracamy z tematem.
Przyznam się szczerze że nie wiem jak to ugryźć z pbr'em, przynajmniej tak żeby zbytnio nie ruszać VPS'a - co zrobiłem to ruch i tak wychodził przez VPSa, a nie chcę go jakoś dużo zmieniać, więc odpuściłem temat. Jeżeli ktoś opanuje ten temat z pbr'em to niech zrobi poradnik, z chęcią zobaczę jak to zrobić.
Wracam do swojego pierwotnego założenia: klient A łączy się wireguardem z VPS, klient B także łączy się wireguardem z VPS, klient B zestawia sobie tunel do klienta A i wychodzi jego wanem w świat. Klient A i B to OpenWrt 25.12, A ma modem komórkowy, B jest spięty siecią kablową. VPS to Debian. Za klientem B jest host który ma wychodzić w świat nie przez VPSa a przez klienta A.
Założenia:
VPS: adres wireguard 192.168.30.1
Klient A: adres 192.168.30.4 oraz 192.168.40.4, na lanie ma 192.168.11.1/24, wan to modem komórkowy
Klient B: adres 192.168.30.3 oraz 192.168.40.3, na lanie ma 192.168.1.1/24, wan to zwykłe dhcp, adres 10.11.12.xx
0:
Robisz normalnego wireguarda na A/B z VPS, sprawdzasz czy działa, czy wychodzą przez VPS'a w świat bo to oznacza że działa routing, forwarding, dns itd. Bez zrobienia takiego połączenia i testu nie robisz nic dalej.
1: VPS
Zwykły debian, robisz konfigurację np. taką
[Interface]
PrivateKey = <priv-vps>
Address = 192.168.30.1/24
ListenPort = 53100
[Peer]
# Name = klient B
PublicKey = <pub-b>
AllowedIPs = 192.168.30.3/32
PersistentKeepalive = 25
[Peer]
# Name = klient a
PublicKey = <pub-a>
AllowedIPs = 192.168.30.4/32, 192.168.40.4/32
PersistentKeepalive = 25
+ forwarding, nat, firewall, jak to w zwykłym debianie
2. Klient A
network
config interface 'wg0'
option proto 'wireguard'
option private_key '<priv-a>'
list addresses '192.168.30.4/24'
config wireguard_wg0
option description 'vps'
option public_key '<pub-vps>'
option endpoint_host '<adres-ip-publiczny-vps>'
option endpoint_port '53100'
option persistent_keepalive '25'
option route_allowed_ips '1'
list allowed_ips '192.168.30.0/24'
config interface 'wg1'
option proto 'wireguard'
option private_key '<priv-a>'
list addresses '192.168.40.4/24'
option listen_port '52000'
config wireguard_wg1
option public_key '<pub-b>'
option persistent_keepalive '25'
option route_allowed_ips '1'
list allowed_ips '192.168.40.0/24'
firewall
config zone 'wg0'
option name 'wg0'
list network 'wg0'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
option masq '1'
option mtu_fix '1'
config forwarding
option dest 'lan'
option src 'wg0'
config forwarding
option src 'lan'
option dest 'wg0'
config forwarding
option dest 'wan'
option src 'wg0'
config zone 'wg1'
option name 'wg1'
list network 'wg1'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
option masq '1'
option mtu_fix '1'
config forwarding
option dest 'lan'
option src 'wg1'
config forwarding
option src 'lan'
option dest 'wg1'
config forwarding
option dest 'wan'
option src 'wg1'
config forwarding
option dest 'wg0'
option src 'wg1'
config forwarding
option src 'wg0'
option dest 'wg1'
wg0 to tunel do VPS'a. wg1 to tunel do którego będzie nawiązywać połączenie klient B, którym będzie wychodził w świat. Dodatkowo zezwolenie na ruch pomiędzy każdym z tuneli a drugim tunelem, lan i wan.
3. Klient B
network
config interface 'wg0'
option proto 'wireguard'
option private_key '<priv-b>'
option auto '1'
list addresses '192.168.30.3/24'
config wireguard_wg0
option public_key '<pub-vps>'
option endpoint_host '<adres-ip-publiczny-vps>'
option endpoint_port '53100'
option persistent_keepalive '25'
option route_allowed_ips '1'
list allowed_ips '192.168.30.0/24'
list allowed_ips '192.168.40.4/32'
config interface 'wg1'
option proto 'wireguard'
option private_key '<priv-b>'
option auto '0'
list addresses '192.168.40.3/24'
config wireguard_wg1
option public_key '<pub-a>'
option endpoint_host '192.168.40.4'
option endpoint_port '52000'
option persistent_keepalive '25'
option route_allowed_ips '1'
list allowed_ips '0.0.0.0/1'
list allowed_ips '128.0.0.0/1'
firewall
config zone
option name 'wg0'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
list network 'wg0'
option masq '1'
config forwarding
option src 'wg0'
option dest 'wan'
config forwarding
option src 'wg0'
option dest 'lan'
config forwarding
option dest 'wg0'
option src 'lan'
config zone
option name 'wg1'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
list network 'wg1'
option masq '1'
config forwarding
option src 'wg1'
option dest 'wan'
config forwarding
option src 'wg1'
option dest 'lan'
config forwarding
option dest 'wg1'
option src 'lan'
config forwarding
option src 'wg1'
option dest 'wg0'
config forwarding
option src 'wg1'
option dest 'wg0'
i jeszcze trzeba zrobić plik /etc/hotplug.d/iface/99-wg o zawartości
if [ "$ACTION" = "ifup" ] && [ "$INTERFACE" = "wg0" ]; then
sleep 3
ifup wg1
fi
if [ "$ACTION" = "ifdown" ] && [ "$INTERFACE" = "wg0" ]; then
sleep 3
ifdown wg1
fi
Jak to ma działać:
- klient A nawiązuje połączenie do wanu, zestawia się tunel do VPS'a. I jednocześnie zrobi się końcówka drugiego tunelu która słucha na porcie 52000.
- klient B nawiązuje połączenie do wanu, zestawia się tunel do VPS'a. jest tak zrobiony, żeby forwardować tylko pakiety adresowane pierwszym tunelem ORAZ adres 192.168.40.4 który jest adresem drugiego tunelu na kliencie A. ten pierwszy tunel do VPS jest zawsze aktywny, drugi tunel jest domyślnie wyłączony - nie uruchomi się po starcie. Jak wg się zestawi z VPS'em to skrypt w hotplugu włączy drugi tunel i automatycznie zestawi się drugi tunel bezpośrednio z klientem A: raz nadpisując się trasę do hosta 192.168.40.4 oraz dwa - robiąc sobie trasę domyślną do internetu przez wg1. Można by tam umieścić 0.0.0.0/0 jak to jest w poradnikach do wg ale ja nie lubię jak mi nadpisuje trasę domyślną a później jak padnie to jej nie ustawia i wolę zapis list allowed_ips '0.0.0.0/1' oraz list allowed_ips '128.0.0.0/1'.
Mamy więc przez klienta B najpierw zestawiany tunel do VPS'a, po tym tunelu zestawiany jest drugi tunel bezpośrednio już do klienta A i klient B ustawia globalny routing przez ten drugi tunel. Działa, właśnie piszę przez taki zestaw, przeżywa restarty i nic nie trzeba grzebać ręcznie żeby to działało
4. Diagnostyka
Do diagnostyki na kliencie B:
ifdown wg1
ifdown wg0
ifup wan
ping 8.8.8.8 <- ma działać, wyjście na świat przez wan
ifup wg0
ping 8.8.8.8 <- ma działać, wyjście na świat przez wan
ping -I wg0 192.168.30.4 <- ma działać, druga strona pierwszego tunelu
ping -I wg0 192.168.40.4 <- ma działać, druga strona drugiego tunelu
ifup wg1
traceroute 8.8.8.8
musisz widzieć coś w rodzaju
root@OpenWrt:~# traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 46 byte packets
1 192.168.40.4 (192.168.40.4) 90.328 ms 80.017 ms 78.626 ms
...
Czyli idzie przez drugi tunel.
I teraz dowolny host podłączony do klienta B będzie wychodził jego trasą domyślną przez drugi tunel do klienta A i dalej w świat:
host:~$ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 OpenWrt.lan (192.168.1.1) 0.671 ms 0.678 ms 1.679 ms
2 192.168.40.4 (192.168.40.4) 121.148 ms 121.311 ms 121.387 ms
....
Wchodząc z hosta na adres np. https://twojeip.wp.pl/ powinieneś widzieć IP z klienta A, nie z VPS czy swojego wanu.
Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.