Fórum Root.cz
		Hlavní témata => Sítě => Téma založeno: noob  05. 04. 2024, 08:28:14
		
			
			- 
				Zdravím vespolek.
 
 Používám démon uredir pro přesměrování UDP portu na serveru na jiný stroj v internetu (a jiný port).
 uredir -n -s  [port] [cílová ip] [cílový port]Funguje to svěle, pokud není démon pod velkou zátěží, pak má tendenci spadnout. Můžu vytvořit watchdog, ale na serveru jsou k dispozici i iptables, což by bylo elegantnější řešení.
 
 Zkoušet jsem hledat jak na to, nicméně tuhle trivialitu prostě neumím dotáhnout do konce.
- 
				iptables -t nat -I PREROUTING -d <moje_ip_adre_sa> -p udp --dport <cilovy_port> -j DNAT --to <adresa>:<port>
 
 Pokud dokážete zajistit, aby odpovědi chodily zpátky stejnou cestou, tak se to nejspíš i přeloží zpátky (pro NAT zafunguje automatický connection tracking). Případně se tomu zpětnému směrování asi dá dopomoci následujícím SNATem v chainu POSTROUTING...
- 
				iptables -t nat -I PREROUTING  -i <ETH_S_KLIENTY> -p udp --dport <NASLOUCHAJICI_PORT_ROUTERU> -j DNAT --to <IP_SERVERU>:<PORT_SERVERU>
 iptables -t nat -I POSTROUTING -o <ETH_K_SERVERU> -p udp --dport <PORT_SERVERU> -j MASQUERADE
 
Tenhle příklad je o něco spolehlivější, protože nahradí zdrojovou adresu paketů adresou routeru, takže server nemusí umět spojení zpět ke klientovi.
 Možná by se to dalo přepsat čistěji s využitím targetu MARK, protože v tomto případě se spoléhá při napasování obou pravidel jen na ten port.
 A druhá nevýhoda je, že server uvidí jako IP klientů jen IP routeru, takže věci jako logování nebo fail2ban postrádají na serveru smysl, muselo by se jedině dobastlit na tom routeru.
- 
				Trví tazatel na tom, aby viděl cíl  skutečnou IP zdroje místo DNATované?
 
 PAk v tom případě není možné použít SNAT/(MASQUERADE??).
 Pak se to dělá přes iptables -t mangle prerouting -j fwmark (nevím, jestli connmark, mám zkušeosti jen s UDP) a tuším že je ntutné i do PREROUTING přidat resoremark, ale to bych chtěl objasnit. Bez něj mi to nefungovalo
 A to hlavní přidat ip rule add  (selektor) table 3455  a ip route add default table 3455
 
 Existuje lepší řešení, jak ajistit přes ip route+rule vracení přes správné rozhraní? Takhle je tam interface zadrátovaný napevno. ALe existuje nějaká konstrukce typu: odešli paket na stejné rozhraní, jako ze kterého přišel?
 
 Taky bude nutné pořešit rp_filter, pokud je strict.
- 
				Díky za odpovědi. Zkoušel jsem obě varianty a zatím stále neúspěšně. IP klientů vidět nemusím, dokonce bych řekl, že ani nechci.
 
 Pro dokreslení situace, takhle vypadá ta první varianta. Konfigurační soubor jsem postupně osekal na minimum.
 
 *nat
 :PREROUTING ACCEPT
 :INPUT ACCEPT
 :POSTROUTING ACCEPT
 :OUTPUT ACCEPT
 -I PREROUTING -d <ip routeru> -p udp --dport 53 -j DNAT --to <cilova ip>:54
 COMMIT
 *filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]
 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -i lo -j ACCEPT
 -A INPUT -p udp -m udp --dport 53 -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 -A FORWARD -j REJECT --reject-with icmp-host-prohibited
 COMMIT
 
- 
				@Hamparle má pravdu s tím rp_filterem. Pokud to nechce fungovat, zkuste rp_filter dočasně vypnout (pokud je to potřeba vypnuté, tak nahradit IPtables pravidly). To že paket přišel rozhraním a odejde tím samým, podle mého není třeba nijak moc explicitně řešit, pokud tomu následující firewallová pravidla nějak explicitně nebrání.
 
 Ještě mě zaujalo: lapáte pakety určené pro port 53 (DNS dotazy) a forwardujete na konkrétní další stroj na port 54? Na jednu stranu mám sklon v tom hledat nedorozumění, pokud se ptáte na triviální NAT pomocí IPtables - na druhou stranu, pokud Vám to fungovalo skrz user-space proxy prográmek, tak asi víte co děláte = samotný záměr asi není blbě... a tím pádem mi do něj nic není :-)
- 
				Tohle je funkční řešení:
 
 *nat
 -A PREROUTING -p udp --dport 53 -j DNAT --to-destination <cílová ip>:54
 -A POSTROUTING -p udp -d <cílová ip> --dport 54 -j SNAT --to-source <ip routeru>
 COMMIT
 *filter
 COMMIT
 
 S rp_filtrem jste měli pravdu, když ho zapnu, jde to do kytek.
 
 A ano, žongluji s DNS servery na různých portech :)
 
 Díky za rady.
- 
				Ještě mi přijde, že má @Zdeněk možná pravdu s tou maškarádou. Prostý SNAT jenom přeloží zdrojovou IP adresu, podle mého neřeší zdrojový port. Pokud použijete maškarádu, měla by taky rozházet source UDP port, a díky tomu být schopna, párovat zpětně odpovědi k dotazům, i pokud je klientů víc a jejich transakce se mohou "překrývat v čase". S prostým SNATem se snáze stane, že pokud se sejdou transakce od více DNS klientů, nemusí mapování odpovědí k dotazům na straně NATujícího routeru klapnout správně.
			
- 
				Ono je nutné rozlišovat upravidel i směr , pak mají dvojí kontext 
 , ostatnè terminologie  asi od cisco se nazývá inside(LAN),outside(ven(ku)),global,local.
 
 Typicky  ve směru LAN→ven se SNAT+MASQ. se používá pro  to domácí natování a v opačnem směru  DNAT pro forwarding na vybraný pc za routerem
 
 Ale i v opačnym směru mají opodstatnění ty pravidla taky- toto vlákno je důkaz. V případě kontextu port forwardingu (Dnat outside do inside) SNAT(out→in) právě  zamaskuje adresy původce. (Kromě mandatorního DNAT)
 
 Ale u kontextu nat (snat /masq in→out) Dnat (in→out)nedává smysl... Nebo nějaký obskurní by se asi našel...
 
 (Conntrack tak jako tak upraví korektně   pakety v v obou směrech, to je druhá nezávislá věc))
- 
				Vyměnil jsem SNAT za MASQUERADE, výsledek je na první pohled stejný. Funguje to a cílový stroj nevidí IP adresy klientů. 
			
- 
				S tím rp_filtrem by asi šlo použít i 2 (tam se testuje jestli je zdrojová adresa přímo dostupná, pokud ne, paket se zahodí): https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt