Am un server lanserver
rulează în LAN-ul meu privat care este conectat la un server public publicserver
folosind Wireguard. publicserver
transmite conexiunile TCP către anumite porturi către lanserver
prin conexiunea Wireguard folosind un iptables DNAT
regulă.
Pe lanserver
, Wireguard este configurat ca o conexiune NetworkManager. Acesta direcționează tot traficul de internet prin Wireguard folosind AllowedIPs = 0.0.0.0/0, ::/0
. Acest lucru face ca următoarele reguli IP să fie configurate lanserver
:
[root@lanserver ~]# arată regulă ip
0: din toate căutările locale
31100: din toate căutările principale suppress_prefixlength 0
31101: nu din toate căutările fwmark 0xcb2e 52014
32766: din toate căutările principale
32767: din toate căutările implicite
[root@lanserver ~]# ip route show table 52014
default dev wg0 proto static scope link metric 50
Această configurație funcționează corect. O conexiune TCP de intrare la publicserver
este redirecționat către lanserver
folosind regula iptables. Răspunsul este trimis înapoi publicserver
deoarece regula ip 31101
se potrivește cu el.
Există o excepție: când încerc să deschid o conexiune TCP la publicserver
folosind IPv6 de pe computerul meu personal pc
, care se află și în LAN-ul meu privat, nu funcționează. Problema pare să fie că ambele pc
și lanserver
au o adresă IPv6 în aceeași subrețea publică. publicserver
transmite conexiunea către lanserver
cu succes, dar răspunsul nu este redirecționat prin conexiunea Wireguard, ci direct către pc
datorită regulii ip 31100
.
Cum mă pot asigura că toate răspunsurile pentru conexiunile care vin prin interfața Wireguard sunt activate lanserver
sunt de asemenea trimise înapoi prin interfața Wireguard, indiferent dacă IP-ul lor sursă se află într-o subrețea locală?
Mă pot gândi la soluții în următoarele direcții:
- Dezactivați IPv6 activat
lanserver
, ceea ce face ca acesta să nu fie pe aceeași subrețea ca pc
. Nu este o soluție foarte bună.
- Utilizare
SNAT
pe publicserver
pentru port forward. Nu este o soluție acceptabilă, deoarece unele dintre serviciile din spatele porturilor redirecționate trebuie să cunoască adevărata IP sursă.
- Menționați în mod explicit subrețeaua IPv6 locală în
IP-uri permise
de egalul Wireguard. Acest lucru nu funcționează deoarece subrețeaua IPv6 se modifică la fiecare 24 de ore.
- Adăugați o regulă IP personalizată care se potrivește cumva cu toate conexiunile care vin
wg0
și utilizează tabelul de rutare 52014
pentru ei. Nu sunt sigur cum să specific exact o astfel de regulă. De asemenea, problema este că numărul tabelului de rutare se modifică de fiecare dată când conexiunea Wireguard este repornită. Locul potrivit pentru a crea o astfel de regulă ar fi probabil Documenta
script, dar NetworkManager nu pare să permită specificarea unuia.