Artykuł nie sponsorowany, nie mam nic wspólnego z wymienionym poniżej serwisem; a jak ktoś ma ochotę postawić mi kawę, to link jest w prawym panelu na https://eko.one.pl
Potrzeba: mamy router z OpenWrt który nie ma na wanie publicznego adresu IP (bo np. korzysta z modemu komórkowego lub nasz operator nie daje publicznego adresu). Chcemy zrobić sobie zrobić do niego zdalny dostęp.
BONUS1: chcemy także mieć dostęp do hostów w sieci lokalnej za routerem OpenWrt
BONUS2: nie chcemy do tego używać klienta vpn tylko najlepiej żeby był dostęp "bezpośredni" z internetu
Nie będziemy też kierować całego ruchu internetowego przez VPN - on będzie służył tylko do dostępu do zasobów OpenWrt czy jego sieci lan.
Nie mamy publicznego adresu IP, więc jednym ze sposobów jest zestawienie z OpenWrt tunelu VPN do jakiegoś hosta w sieci z publicznym adresem IP i serwerem VPN, żeby później móc dostać się do naszego routera właśnie przez zestawiony tunel VPN.
Potrzebujemy serwer z publicznym adresem IP. Tu przychodzą różnej maści tzw. VPS - prywatne serwery na których możemy zrobić co chcemy. Takie serwery są płatne, więc najlepiej żeby kosztował jak najmniej - np. żeby był za darmo. I taki właśnie serwer możemy znaleźć pod nazwą mikr.us. Jeden z jego planów to darmowy serwer o niewielkiej ilości zasobów (dysk, ram), ale w zupełności nam wystarczający. No i tak prawdę mówić nie jest "za darmo" bo trzeba przy rejestracji wydać całe 5zł (stan na 29.10.2023r). Ma on też pewne inne ograniczenia - np. dostępna jest niewielka ilość portów sieciowych (dokładnie 4, z czego użyteczne są 3) oraz trzeba trzymać się regulaminu - nie wolno skanować portów, stawiać usług głosowych itd. To wszystko jest do zapoznania się we własnym zakresie na stronie projektu.
Nie przedłużając - wybieramy FROGa pod adresem https://frog.mikr.us/ zapoznajemy się z regulaminem, klikamy rejestrację, podajemy dane osobowe, robimy opłatę 5zł i za 10-15 minut przychodzi do nas mejl z danymi do logowania. W ten sposób prawie-że-za-darmo staliśmy się posiadaczami własnego serwer VPS w internecie.
W mejlu znajdziemy dane do logowania więc go nie usuwamy tylko czytamy uważnie. Frog przychodzi z paroma rzeczami o których trzeba widzieć:
- na frogu jest dystrybucja linuksa zwana alpine w kontenerze LXC, dystrybucja znana wszystkim co używają dockera. Jest ona mała, lekko uproszczona, ale nadal to jest zwykły linuks. Nie można tego zmienić i zainstalować czegoś innego.
- mamy domyślnie zainstalowany MC (i tym samym jest edytor mcedit) więc nie trzeba używać vi. Ale co kto lubi.
- mamy dostęp do 200MB bazy mysql ale jej w tym poradniku nie będziemy używać.
- mamy własny adres IPv6!
- dostajemy do VPS cztery porty dla IPv4, na potrzeby tego opisu powiedzmy żeby były to porty o numerach:
10100 - port ssh na którym logujemy się do naszego mikrusa
20100 - na razie wolny
30100 - na razie wolny
40100 - na razie wolny
- mój mikrus był dostępny pod nazwą domenową frog01.mikr.us
- wewnętrznie mikrus używa adresacji IPv4 z klasy 192.168.7.0/24 oraz domyślny routing wskazuje na gatewaya 192.168.1.1 - więc NIE NALEŻY mieć klientów którzy mają taką adresację na lanie a chcielibyśmy mieć dostęp do lanu bo się pogubimy przy routingu (aktualizacja: mój mikrus miał taką, ale może się zdarzyć że nowo założony mikrus będzie miał inną adresację - wtedy należy odpowiednio dostosować klasy adresowe sieci lokalnych)
- firewall jest całkowicie otwarty - nie ma specjalnie potrzeby otwierania portów czy czegoś takiego.
Zgodnie z danymi w mejlu, logujemy się do mikrusa np.
ssh frog@frog01.mikr.us -p 10100
z konsoli czy z putty i możemy porozglądać się po systemie.
Na potrzeby tego poradnika zrobimy:
- "serwer" vpn wireguard do którego będą łączyły się inne hosty, uruchomiony na mikrusie/frog (nazywany dalej "mikrusem")
- klienta OpenWrt (dalej nazywanego "openwrt") który ma na LAN adresację 192.168.11.0/24 (z powodu wymienionego wyżej NIE MOŻE to być domyślny w OpenWrt adres 192.168.1.1, więc musimy sobie zmienić konfigurację klienta)
- klient - openwrt - będzie miał swoją stronę (LuCI) na porcie 80 (i nie robi przekierowania na https)
- ten openwrt ma w swoim lanie zwykłe komputery, na potrzeby tego poradnika przyjmiemy że będzie dostępny jeden pod adresem 192.168.11.229 (nazywany dalej "serwerek"), na porcie 80 będzie wystawiał swoją stronę www
- podłączymy także następnego klienta - Windows 11 z zainstalowanym WireGuardem (nazywanego dalej "windows")
Zrobię tak, żeby z windows, po zestawienia połączenia VPN była możliwość wejścia zarówno do openwrt (ping, ssh czy przeglądarką do gui) jak i do serwerka za openwrt (tak samo - ping, ssh czy przeglądarką do gui) - to ten BONUS1.
Jako BOUNS2 - zrobimy tak przekierowanie portów na mikrusie, żeby można było odwołać się przeglądarką do odpowiedniego portu mikrusa i uzyskać bezpośrednio dostęp do strony www na openwrt lub na serwerku.
Ponieważ dostajemy w sumie cztery porty to wykorzystamy je tak:
frog01.mikr.us:10100 - ssh (tak jest domyślnie i tego nie zmieniamy, to jest dostęp przez ssh do mikrusa)
frog01.mikr.us:20100 - tu stawiamy serwer wireaguard, do którego będą łączyły się inne klienty
frog01.mikr.us:30100 - tu zrobimy przekierowanie na port 80 openwrt
frog01.mikr.us:40100 - tu zrobimy przekierowanie na port 80 serwerka w sieci LAN openwrt
Czyli możemy podłączyć się klientem wireguard do mikrusa i mieć nieograniczony dostęp do openwrt i sieci lan za nim lub z dowolnego komputera już bez vpn wpisać w przeglądarce określony adres i mieć dostęp do usługi która została na ten adres przekierowana.
Zakładam też że mikrus, openwrt i reszta ma domyślną konfigurację - jeżeli ktoś już coś na nich robił to musi dostosować sobie polecenia do tego co już ma.
Starałem się żeby było to maksymalnie prosto i zrozumiale zrobione, więc nie używam tu jakiś skryptów startowych itd, co nie oznacza że nie można tego zrobić inaczej. Można, ile ludzi tyle rozwiązań.
mikrus
Logujemy się do mikrusa przez ssh i instalujemy wireguarda:
frog@????/f1100:~$ sudo su -
root@????/f1100:~# apk update
root@????/f1100:~# apk upgrade
root@????/f1100:~# apk add wireguard-tools
Teraz należało by wygenerować sobie klucze. Robimy klucze prywatne i publiczne dla mikrusa, openwrt i windowsa. Jeżeli będziemy chcieli więcej klientów, to im oczywiście też należy wygenerować osobne klucze
root@????/f1100:~# cd /root
root@????/f1100:~# wg genkey | tee mikrus.privatekey | wg pubkey > mikrus.publickey
root@????/f1100:~# wg genkey | tee openwrt.privatekey | wg pubkey > openwrt.publickey
root@????/f1100:~# wg genkey | tee windows.privatekey | wg pubkey > windows.publickey
Możemy teraz sobie je wyświetlić i skopiować np. do notatnika żeby było prościej robić pliki konfiguracyjne.
(dla celów poradnika zastąpiłem rzeczywiste klucze ich odpowiednikami "słownymi").
root@????/f1100:~# cat mikrus.privatekey
1111-klucz-prywatny-mikrusa-1111=
root@????/f1100:~# cat mikrus.publickey
2222-klucz-publiczny-mikrusa-2222=
root@????/f1100:~# cat openwrt.privatekey
3333-klucz-prywatny-openwrt-3333=
root@????/f1100:~# cat openwrt.publickey
4444-klucz-publiczny-openwrt-4444=
root@????/f1100:~# cat windows.privatekey
5555-klucz-prywatny-windows-5555=
root@????/f1100:~# cat windows.publickey
6666-klucz-publiczny-windows-6666=
Przy tworzeniu konfiguracji należy uważać żeby nie pomylić kluczy prywatnych z publicznymi.
Teraz tworzymy konfigurację wireguarda, można wykorzystać edytor mcedit
root@????/f1100:~# mcedit /etc/wireguard/wg0.conf
Cała konfiguracja omawiana w tym poradniku wygląda tak:
[Interface]
PrivateKey = 1111-klucz-prywatny-mikrusa-1111=
Address = 10.9.0.1/24
ListenPort = 20100
[Peer]
# openwrt
PublicKey = 4444-klucz-publiczny-openwrt-4444=
AllowedIPs = 10.9.0.2/32,192.168.11.0/24
PersistentKeepalive = 25
[Peer]
# windows
PublicKey = 6666-klucz-publiczny-windows-6666=
AllowedIPs = 10.9.0.3/32
PersistentKeepalive = 25
Wireguard będzie słuchał na porcie 20100 (to nie jest dowolny port - to ma być jeden z portów udostępnionych nam przez mikrusa). Sam mikrus będzie miał adres 10.9.0.1, openwrt będzie miał 10.9.0.2 zaś windows będzie miał 10.9.0.3. Dodatkowo do AllowedIPs została dodana klasa adresowa za lanem openwrt (192.168.11.0/24) żeby mikrus wiedział gdzie kierować pakiety przeznaczone dla takiej adresacji.
Można taki wireguard uruchomić z ręki
root@????/f1100:~# wg-quick up /etc/wireguard/wg0.conf
Ale chcielibyśmy że uruchamiał się on wraz ze startem sieci, więc lepiej zrobić edycję pliku network w mikrusie i dopisać odpowiednie linie.
UWAGA: należy to zrobić ostrożnie żeby nie popsuć tego pliku. Bo jak coś pójdzie źle to się nie dostaniemy do naszego VPS'a i trzeba będzie resetować całą maszynę.
root@????/f1100:~# mcedit /etc/network/interfaces
Plik ma wyglądać tak:
auto lo
iface lo inet loopback
iface lo inet6 loopback
auto eth0
iface eth0 inet static
address 192.168.7.100/24
# --- BEGIN PVE ---
post-up ip route add 192.168.1.1 dev eth0
post-up ip route add default via 192.168.1.1 dev eth0
pre-down ip route del default via 192.168.1.1 dev eth0
pre-down ip route del 192.168.1.1 dev eth0
# --- END PVE ---
hostname $(hostname)
post-up wg-quick up /etc/wireguard/wg0.conf
iface eth0 inet6 static
address aaaa:aaaa:aa:aaaa::100/128
# --- BEGIN PVE ---
post-up ip route add aaaa:aaaa:aa:aaaa::2 dev eth0
post-up ip route add default via aaaa:aaaa:aa:aaaaa::2 dev eth0
pre-down ip route del default via aaaa:aaaa:aa:aaaa::2 dev eth0
pre-down ip route del aaaa:aaaa:aa:aaaa::2 dev eth0
# --- END PVE ---
Dopisałem linię z post-up wg-quick up /etc/wireguard/wg0.conf
Można wykonać reboot, po wszystkim wydać polecenia np.
root@????/f1100:~# ip a
root@????/f1100:~# ip r
root@????/f1100:~# wg
Żeby zobaczyć czy działa wireguard i jest routing.
Dla porządku - mikrus ma już włączony forwarding pakietów ipv4, więc nie trzeba tego specjalnie ustawiać. Można to zweryfikować wydając polecenia
root@????/f1100:~# sysctl -a | grep net.ipv4.ip_forward
root@????/f1100:~# cat /proc/sys/net/ipv4/conf/eth0/forwarding
W obu przypadkach powinno być ustawione na "1".
openwrt
Tu nie ma nic szczególnego - wireguard został szeroko omówiony, opisany, przetestowany i zweryfikowany, więc żadnego odkrycia tu nie robimy.
Instalujemy wireguarda, dodajemy nowy interfejs wg0, nadajmy mu właściwy klucz prywatny który został wcześniej wygenerowany, adres 10.9.0.2. Następnie tworzymy jednego peera który ma wskazywać na mikrusa, podajemy jego klucz publiczny, jego adres IP oraz namiary na niego w internecie.
# opkg update
# opkg install kmod-wireguard wireguard-tools
# uci set network.wg0=interface
# uci set network.wg0.proto="wireguard"
# uci set network.wg0.private_key="3333-klucz-prywatny-openwrt-3333="
# uci add_list network.wg0.addresses="10.9.0.2/32"
# uci add network wireguard_wg0
# uci set network.@wireguard_wg0[-1].public_key="2222-klucz-publiczny-mikrusa-2222="
# uci set network.@wireguard_wg0[-1].route_allowed_ips="1"
# uci add_list network.@wireguard_wg0[-1].allowed_ips="10.9.0.0/24"
# uci set network.@wireguard_wg0[-1].endpoint_host="frog01.mikr.us"
# uci set network.@wireguard_wg0[-1].endpoint_port="20100"
# uci set network.@wireguard_wg0[-1].persistent_keepalive="25"
# uci set network.@wireguard_wg0[-1].description="mikrus"
# uci commit network
# /etc/init.d/network restart
Jeżeli wszystko wyszło poprawnie to już na tym etapie powinien działać ping do mikrusa przez tunel, oraz powinno dać się wykonać połączenie ssh przez vpna do mikrusa.
# ping 10.9.0.1
# ssh frog@10.9.0.1 -p 10100
Jeżeli coś nie działa to w pierwszej kolejności sprawdzamy klucze.
Następnie modyfikujemy odpowiednio firewall w openwrt:
# uci add firewall zone
# uci set firewall.@zone[-1].name='wg'
# uci set firewall.@zone[-1].input='ACCEPT'
# uci set firewall.@zone[-1].forward='ACCEPT'
# uci set firewall.@zone[-1].output='ACCEPT'
# uci set firewall.@zone[-1].masq='1'
# uci set firewall.@zone[-1].network='wg0'
# uci add firewall forwarding
# uci set firewall.@forwarding[-1].src='wg'
# uci set firewall.@forwarding[-1].dest='wan'
# uci add firewall forwarding
# uci set firewall.@forwarding[-1].src='wan'
# uci set firewall.@forwarding[-1].dest='wg'
# uci add firewall forwarding
# uci set firewall.@forwarding[-1].src='wg'
# uci set firewall.@forwarding[-1].dest='lan'
# uci add firewall forwarding
# uci set firewall.@forwarding[-1].src='lan'
# uci set firewall.@forwarding[-1].dest='wg'
# uci commit firewall
# /etc/init.d/firewall restart
Teraz nawet z mikrusa powinien działać ping na openwrt (10.9.0.2). Powinien być także dostęp do ssh na openwrt a także powinien udać udać się ping do serwerka (192.168.11.229) czy pobranie wgetem zawartości jego strony.
windows
Na windowsie instalujemy klienta wireguarda. Następnie w notatniku robimy plik konfiguracyjny o następującej zawartości:
[Interface]
PrivateKey = 5555-klucz-prywatny-windows-5555=
Address = 10.9.0.3/24
ListenPort = 20100
[Peer]
# mikrus
PublicKey = 2222-klucz-publiczny-mikrusa-2222=
AllowedIPs = 10.9.0.0/24,192.168.11.0/24
PersistentKeepalive = 25
Endpoint = frog01.mikr.us:20100
I zapisujemy gdzieś np. w katalogu domowym pod nazwą mikrus-wireguard.conf
W sekcji Interface podajemy klucz prywatny dla windowsa, adres 10.9.0.3. Z sekcji Peer zaś klucz publiczny mikrusa, jego dane w internecie oraz w AllowedIPs klasy adresowe wireguarda oraz klasę adresową lanu zza openwrt. Dzięki czemu windows będzie wiedział gdzie kierować pakiety.
Uruchamiamy aplikację wireguarda, klikamy "Dodaj Tunel", wskazujmy plik mikrus-wireguard.conf i klilkamy "Aktywuj". Powinno zestawić się połączenie z mikrusem.
Testy
Z poziomu windowsa z cmd robimy
ping 10.9.0.1
ping 10.9.0.2
Oba powinny działać. Teraz otwieramy przeglądarkę i wpisujmy adres http://10.9.0.2 - powinna otworzyć się strona LuCI z openwrt, http://192.168.11.1 - powinna otworzyć się strona LuCi z OpenWrt, http://192.168.11.229 - powinna otworzyć się strona z serwera. Oczywiście w openwrt nie możemy mieć włączonego przekierowania http na https, serwerek powinien pomieć ustawiony gateway wskazujący na openwrt itd. Ale to normalnie oczywiste elementy konfiguracji sieci.
Jeżeli tak wszystko działa to zrealizowaliśmy założenia projektu oraz BONUS1 - mamy dostęp do hosta w sieci lan openwrt.
Bonus2
W/w zagadnienie wymaga aby był zestawiony tunel VPN z klienta żeby móc się połączyć do zasobów innego klienta. Ale można inaczej - mamy mikrusa z publicznym adresem IP, mamy klika dostępnych portów, więc można te porty przekierować bezpośrednio w tunel vpn i mieć dostęp do zasobów za tunelem.
W tym przykładzie zrobimy sobie przekierowanie portu 30100 na port 80 naszego openwrt oraz portu 40100 na port 80 naszego serwerka - czyli maszynki w lanie openwrt.
Robi się to odpowiednimi przekierowaniami iptables (na mikriusie):
root@????/f1100:~# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 30100 -j DNAT --to-destination 10.9.0.2:80
root@????/f1100:~# iptables -A POSTROUTING -t nat -p tcp -d 10.9.0.2 --dport 80 -j MASQUERADE
root@????/f1100:~# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 40100 -j DNAT --to-destination 192.168.11.229:80
root@????/f1100:~# iptables -A POSTROUTING -t nat -p tcp -d 192.168.11.229 --dport 80 -j MASQUERADE
I od tego momentu na dowolnym komputerze wpisując w przeglądarce http://frog01.mikr.us:30100 powinien być dostęp do luci openwrt zaś wpisując http://frog01.mikr.us:40100 - do http na serwerku.
W/w polecenia znikną po restarcie, więc znów można je dopisać od networku żeby wszystko się uruchamiało samo, który może wyglądać tak:
auto lo
iface lo inet loopback
iface lo inet6 loopback
auto eth0
iface eth0 inet static
address 192.168.7.100/24
# --- BEGIN PVE ---
post-up ip route add 192.168.1.1 dev eth0
post-up ip route add default via 192.168.1.1 dev eth0
pre-down ip route del default via 192.168.1.1 dev eth0
pre-down ip route del 192.168.1.1 dev eth0
# --- END PVE ---
hostname $(hostname)
post-up wg-quick up /etc/wireguard/wg0.conf
post-up iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 30100 -j DNAT --to-destination 10.9.0.2:80
post-up iptables -A POSTROUTING -t nat -p tcp -d 10.9.0.2 --dport 80 -j MASQUERADE
post-up iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 40100 -j DNAT --to-destination 192.168.11.229:80
post-up iptables -A POSTROUTING -t nat -p tcp -d 192.168.11.229 --dport 80 -j MASQUERADE
iface eth0 inet6 static
address aaaa:aaaa:aa:aaaa::100/128
# --- BEGIN PVE ---
post-up ip route add aaaa:aaaa:aa:aaaa::2 dev eth0
post-up ip route add default via aaaa:aaaa:aa:aaaaa::2 dev eth0
pre-down ip route del default via aaaa:aaaa:aa:aaaa::2 dev eth0
pre-down ip route del aaaa:aaaa:aa:aaaa::2 dev eth0
# --- END PVE ---
Wszystko jest jedną linią, engine forum może zawijać dłuższe linie, ale generalnie - wszystko w jednej linii "post-up"
Problemy
Ze względu na specyfikę mikrusa - klasa 192.168.1.0/24 jest przez niego wykorzystywana, a to samo domyślnie wykorzystuje OpenWrt. Więc żeby to nie sprawiało problemów - należy zmienić adresację na lanie OpenWrt żeby była inna.
Wg w/w konfiguracji da się:
- pingować openwrt z mikrusa
- pingować mikrusa z openwrt
- pingować miktusa z windows
- pingować openwrt z windows
Natomiast nie daje się pingować windows z miktrusa czy openwrt. Może to wynikać z ustawień defendera w windowsie (lub innego antywirusa), a że mam tylko służbowego laptopa z Windows to zbytnio nie mogę w nim grzebać i tego sprawdzić. Jeżeli ktoś bardzo potrzebuje pingów do windowsa to niech da znać jak rozwiązał problem.
Nie sprawdzałem konfiguracji na MacOS. Nie posiadam pod ręką komputera z tym systemem, więc nie sprawdziłem w ogóle czy i jak to działa z MacOS.
EDIT: przypominam tylko że mikrus/frog wymaga zalogowania się na konto co jakiś czas, inaczej serwer zostanie skasowany. Więc jeżeli czytasz ten opis po pewnym czasie od jego powstania to właśnie jest dobry moment żeby zalogować się na swojego froga.
Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.