Fórumok
Sziasztok!
Banális kérdés, ha csinálok egy ilyet:
iptables -t nat -i wg0 -A PREROUTING -p udp --dport 6055 -j DNAT --to-destination 10.240.69.1
Akkor a visszafelé jövő válasz csomagok forrás címét magától SNAT-olja, vagy azt nem? TCP-nél ez elég világos, de UDP-nél nem tudom hogy megy ez. Az UDP az connection-less, de nem stateless.
Hozzászólások
Miért SNAT-olná automatikusan? Csak akkor lesz SNAT, ha van ilyen szabály felvéve, amit ezt megteszi. Én nem tudok semmilyen protokoll esetén automatikus SNAT-ról iptables esetében.
a conntrack-ra gondolhat a költő, ami viszont működik UPD esetében is.
Tehát, elvileg nem kell a csomagokat visszafelé is NAT-olni.
Ez a gyakorlatban viszont attól függ milyen kommunikáció zajlik valójában.
szerintem.
zrubi.hu
> a conntrack-ra gondolhat a költő, ami viszont működik UPD esetében is.
> Tehát, elvileg nem kell a csomagokat visszafelé is NAT-olni.
Igen, pontosan erre gondoltam.
> Ez a gyakorlatban viszont attól függ milyen kommunikáció zajlik valójában.
Kicsit konkrétabban? :-)
https://www.rigacci.org/wiki/lib/exe/fetch.php/doc/appunti/linux/sa/ipt…
zrubi.hu
A fenti szabály konkrétan annyit csinál, hogy a wg0 interfacre UDP-n a 6055 portra érkező csomagokat továbbítja a 10.240.69.1 címre se több se kevesebb. A többi konkrétum attól függ milyen más szabályod van még.
Fedora 38, Thinkpad x280
Jó igen azt nem írtam, hogy ez a legelső FORWARD szabályom:
Bocsánat, ez nem volt magától értetődő.
Ennek semm köze, a topic nyitó szabályhoz. Ez csak annyit mond, hogy a router átengedi azokat a csomagokat amik RELATED/ESTABLISHED kapcsoloval vannak. DE te NAT táblában operálsz, ez a szabály meg másik táblában ...
Javaslom előbb kicsit nézzél körbe iptables táblák stb témában mi merre hol, báár, mivel jó pár éve nftables van, lehet hagynod is kéne, csak bezavar, és egyből nftables ...
Fedora 38, Thinkpad x280
Annyi köze van hozzá, hogy ha az egyik irányban átengedte az UDP-t akkor visszafelé is át fogja, feltéve hogy működik rá a conntrack. Igazából ez a kérdés, hogy UDP-nél mi kell ahhoz, hogy működjön a conntrack.
Nem, mivel nyitó szabályod -t nat tábla a fenti forward szabály meg nem a -t nat tábla ...
Fedora 38, Thinkpad x280
az "átengedi" az a FORWARD
ez nem "átengedi" hanem "csinál" is vele valamit.
iptables-hez tényleg nem értek (ahogy a mellékelt példa is mutatja), viszont docker-t használok sok helyen, és docker mindenhol iptables szabályokat kreál. Ha most feltenném egy ilyen gépre az nftables-t, akkor a iptables-nftables-compat -t használná? (Tudom ez offtopic)
@zurbi átolvastam az udp-re vonatkozó részt az általad küldött leírásból. Ott nem szabályokat írtak, hanem egy példát. Emiatt nem 100% hogy jól értem, de így sejtem: ha a válasz ugyan arról a portról és címről érkezik, és ugyan arra a portra és címre megy vissza, akkor működni fog a conntrack és magától visszaírja a forrás címet. De ez csak sejtés.
a portszám egyezés az alapvető követelmény, azon felül a timeout rész a lényeges.
van az olalon külön UDP-re magyarázat és példa is, hogy ez hogyan számolódik.
nagyon röviden:
amig nem 'esik ki' a conntrack táblából addig jól fog működni.
De ha a válaszcsomag csak egy hét múlva jön, akkor tutira nem :)
zrubi.hu
Amúgy nem esik ki, 1 sec-en belül jön a válasz mindig.
Nem fogja, ahhoz kell egy MASQUERADE szabály
Fedora 38, Thinkpad x280
Jó akkor most melyik az igaz? Akkor is átírja ha nem esik ki a conntrack-ből, vagy csak akkor írja át ha MASQUERADE van, vagy mindkettő?
Nem kell MASQUERADE, ha rövid időn belül jön a válasz.
Szóval akkor azt mondod, hogy először legyen egy DNAT, utána egy MASQUERADE, és úgy jó lesz?
A fenti szabály annyit csinál, hogy minden csomag ami a NAT táblából, elhagyja az interface-t lecseréli a src ip-t a wg0 interface IP-jére.
Azaz jön a csomag az 1.1.1.1-es IP ről ezt megkapja a 10.240.69.1 ip, a fogadó látja, hogy az 1.1.1.1 ről jött így elkezdi oda visszaküldeni. Mivel a forrás IP: 10.240.69.1 ami egy nem routeotlt tartomány így a szolgáltató első route pontjánál dobodik a francba. Ezért van a MASQUERADE, hogy ne a nem publikus IP-vel hagyja el a csomag a gépet, hanem azzal amire maszkolják, fenti esetben a wg0 ipjével.
A conntrack meg ott jön a képbe, hogyha több IP van 1 IP mögé maszkolva, akkor tudni kell hogy melyik csomag melyik IP-hez tartozik.
Fedora 38, Thinkpad x280
Jó szóval a MASQUERADE -hez kötelező a conntrack, mert változó lehet a forráscím, és vissza kell őket mappelni. Nekem ezen felül még a cél címet is át kell írnom egy konkrét IP-re. A DNAT a PREROUTING-ban van, a MASQUERADE a POSTROUTING-ban, szóval akkor gondolom a PREROUTING-ba tegyem bele a DNAT részt a POSTROUTING-ba meg a MASQUERADE -et?
Az a cél, hogy bárhonnan érkezik egy UDP csomag a 6055 -re, akkor az továbbítódjon (forrás cím átírással) a fix belső 10.240.69.1 -re, és ha onnan jön egy válasz (rövid időn belül), akkor annak a forrás címe legyen átírva arra a címre amelyiken eredetileg bejött az első csomag, a cél címe meg szintén arra a címre, ahonnan érkezett az eredeti első csomag.
Akkor nem kell a -o wg0 , ha azt kihagyod, akkor az azt fogja jelenteni, hogy mikor a csomag eljhagyja az interface-t akkor forrásip az interface ip-je lesz.
Amennyiben a bejövő csomagnál nem változtatod meg a forrás címét, a válasz mindig a forrás cím lesz.
Fedora 38, Thinkpad x280
Értem, köszi. (Bár ez tutira azon fog kimenni.)
> Amennyiben a bejövő csomagnál nem változtatod meg a forrás címét, a válasz mindig a forrás cím lesz.
Ohh tehát a DNAT mellé kell egy SNAT is. Akkor három szabály kell.
Így? Csak nem tudom, hogy a ??? helyére mit írjak. A wg0 interface címét?
Vagy mégse kell az SNAT, mert a MASQUERADE átírja a forráscímet.
a MASQ interface-re NAT-ol, az SNAT pedig IPcímre. Remélem tudod értelmezni a különbséget.
Az alapprobléma az, hogy a 6055 portra érkező UDP csomagokat továbbítanom kellene egy adott IP-re úgy, hogy a válaszok visszamenjenek az eredeti forráshoz. De az eredeti forrás címe előre nem ismert, az bármi lehet.
Ráadásul egyszerre kellene DNAT és
SNATMASQUERADE ezekre (mármint az odafelé menő csomagokra), máskülönben a válasz csomag nem jó helyre lesz route-olva. A válasz csomagokra pedig kellene automatikusan visszaírni az eredeti forrás- és célcímet úgy, hogy ezek közül csak a célt tudomm a forrás az bármi lehet.Igen, erre kellene a conntrack. Csak nem vagyok benne biztos, hogy mit kell ahhoz tennem, hogy UDP-re működjön a conntrack. Mivel itt nincsenek csomag szekvencia értékek. TCP-nél ez elég egyértelmű.
a MASQUERADE nem kell neked, a DNAT elég:
To enable DNAT, at least one iptables command is required. The connection tracking mechanism of netfilter will ensure that subsequent packets exchanged in either direction (which can be identified as part of the existing DNAT connection) are also transformed.
reference:
http://linux-ip.net/html/nat-dnat.html
zrubi.hu
Biztos hogy elég? Ha a csomag forráscíme nincs átírva, akkor a célállomás ( 10.240.69.1 ) honnan fogja tudni, hogy ebbe az irányba kell visszaküldenie a választ? (Ha a default route-on át küldi, akkor az nem itt fog átmenni...)
Sőt jobban belegondolva, lehet hogy meg se kapja, mert INVALID lesz belőle. A célállomás 10.240.69.1 csak a 10.240.0.0/14-ből fogad csomagokat a wireguard tunnel-en át, szóval ha a forráscímet nem írom át, akkor meg se kapja. (nyilván ez egy olyan infó amit eddig nem mondtam)
na jó, de ez akkor már teljesen más felállás :D
én feltételeztem, hogy routing van a hálózatok között.
ha elhallgatod az információkat ,akkor nem megfelelő tanácsot fogsz kapni ;)
Egyébként ha már egyszer van egy tunnel-ed.. abban is lehet(ne) ám route-olni normálisan
szerintem vázold az alap felállást, amit meg kell oldanod.
ne csak azt a részét, ami szerinted jó megoldásból szerinted hiányzik.
zrubi.hu
Szóval ez így van:
És hogy miért kell a VPN szerver: azért, mert a partnernek olyan hálózata van, ami megbízhatatlan, és váltogat a lassú ADSL kapcsolat meg a még lassabb LTE modem között (WAN failover), ahol ráadásul az LTE modem az persze CGNAT mögött van.
Ezek közül mindent sikerült beállítani, kivéve a docker-ben futó VPN szerveren belül a DNAT + MASQUERADE szabályokat. Azért, mert iptables-ből béna vagyok. :-)
Úgy kifejezetten nem akartam elhallgatni semmit, de ha mindent leírtam volna az első post-ban akkor senki nem olvassa el. :-D
A megoldásból tényleg csak ez az UDP DNAT + MASQUERADE hiányzott. És neked teljesen igazad volt abban, hogy azt feltétlezted, hogy a válaszoló fél default route-ja arra küldi vissza a csomagot, amerről jött. De nem így van.
> Egyébként ha már egyszer van egy tunnel-ed.. abban is lehet(ne) ám route-olni normálisan
Szerintem teljesen normálisan route-oltam mindent. :-D Annak jó oka van, hogy a partner default route-ja nem ezen a VPN szerveren keresztül megy. De ennek az oknak semmi köze az eredeti kérdéshez. Viszont tényleg szükséges lett volna tudni ahhoz, hogy jó választ kapjak.
De mint mondtam, nem értek az iptables-hez, talán elnézhető nekem.
A lényeg, hogy most úgy tűnik, megoldódott a probléma.
nekem van egy ilyenem ez tcp de hátha segít :)
-A PREROUTING -i eth0 -p tcp -m tcp --dport 5500 -j DNAT --to-destination 172.16.0.4
-A POSTROUTING -p tcp -m tcp --dport 5500 -d 172.16.0.4 -j MASQUERADE
Köszi, szóval DNAT + MASQUERADE. Kipróbálom. :-)
Na ez lett belőle:
A célcím a wireguard tunnel másik oldalán egy mikrotik router, ott packet snifferrel ezt látom:
Szóval bejön a vpn szerver forráscímével a csomag, eljut a céleszközig, és utána a 4-es sortól kezdve megy vissza szépen a válasz, ami a vpn szerver felé távozik is a tunnel-en.
Szerintem jó lett, de biztosan majd csak holnap derül ki.
Köszönöm a segítséget! :-)
Szia!
Fent írták, kell még a FORWARD szabály is - anélkül nem fog menni:
Egy kis "hardening" - következőképpen nézne ki:
- Alapból nem engedünk át semmit, DROP default mindenütt ( filter tábla - INPUT/OUTPUT )
- Alapból nem engedünk át semmit, DROP default mindenütt ( filter tábla - FORWARD)
- "martians" IP-címeket (RFC 1812) szűrjük - debug miatt
A fentieket 2 helyen is be kell állítani
> iptables
> /etc/sysctl.conf
(minta - iptables )
(minta - sysctl)
Szerintem felesleges volt beraknod egy komplett tűzfal konfigot. Ez a konfig amit küldtél egy olyan gépre való, ami egy belső hálózatot véd a megbízhatatlan internet elől. De ez a gép amire nekem a DNAT kellett, nem ilyen. Egy egy docker-ben futó wireguard VPN szerver, ami az internet felől összesen kétféle dolgot kaphat: hitelesített wireguard UDP csomagot, és ezt a 6055 -ös portra érkező izét.
Egyébként meg nagyon hasznos lesz, ha iptables alapokon akarok tűzfalat építeni. :-)
Ha ez egy önálló tűzfal, akkor ez a sok output drop tök felesleges. Az csak a konkrét gépről kezdeményezett kapcsolatokra vonatkozik. A gépen átmenő csomagokat a FORWARD-ban lehet szűrni, ott opciónak meg lehet adni az input/output interface-eket, ha ilyen szűrést szeretnél csinálni.
Tesztelve, működik.