Portál AbcLinuxu, 7. května 2025 01:18
Ahoj, napadá vás, jak přepsat tohle pravidlo pro ip6tables?
iptables -t nat -A OUTPUT --destination localhost -p tcp --dport 80 -j REDIRECT --to-ports 8080 iptables -t nat -A OUTPUT --destination 10.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8080 iptables -t nat -A PREROUTING --destination 10.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8080
Cílem je přesměrování portů v rámci jednoho stroje (10.0.0.1) tak, aby služba mohla běžet na neprivilegovaném portu 8080 a klienti se mohli zvenku připojovat na standardní port 80.
Řešení dotazu:
Nebo tomu procesu nastavit capability CAP_NET_BIND_SERVICE, potom se bude moci povesit na privilegovany port i bez roota. Viz. man 7 capabilities
Zkoušel jsem tohle (jako root):
execcap cap_net_bind_service=eip /sbin/sucap franta franta /bin/nc6 -l -p80 Caps: =ep cap_net_bind_service+i Caps: = cap_net_bind_service+i [debug] uid:1000, real uid:1000 sucaps: capsetp: Operation not permitted sucap: child did not exit cleanly.
Což mi nefungovalo. A taky nevím, jak to bude, když budu tímhle způsobem potřebovat spustit bashový skript – tam bude potřeba, aby se práva dědila přes několik úrovní až k procesu, který má naslouchat na daném portu.
Na to by se mohlo víc hodit použití authbindu, ale ten zase neumí IPv6. Stáhnul jsem si jeho zdrojáky a pokoušel jsem se upravit libauthbind.c
, ale moc daleko jsem se nedostal. Buď se mi povedl segfault nebo jsem dostal:
$ authbind --deep nc6 -l -p80 nc6: bind to source :: 80 failed: No child processes
BTW: není tu nějaký znuděný céčkař, který nemá co na práci?
Já bych se vydal cestou kvalifikací – zjistit, proč to nefunguje.
Díval jsem se do odkazované dynamické knihovny a řádná úprava není záležitost pár řádků (řeší se tam přístupová pravidla na základě IP aritmetiky).
Zatím jsem přišel na náhradní řešení pomocí xinetd:
# default: on service http { flags = REUSE socket_type = stream wait = no user = root redirect = 127.0.0.1 8080 log_on_failure += USERID } # default: on service https { flags = REUSE socket_type = stream wait = no user = root redirect = 127.0.0.1 8181 log_on_failure += USERID }
ale to se mi nelíbí, protože webový server neví, jaká skutečná IP adresa se k němu připojuje (vidí jen 127.0.0.1).
Našel jsem řešení pomocí authbind, které by údajně mělo fungovat: How-to set up Glassfish 2 on Debian or Ubuntu, ale nefunguje. Viz Glassfish v3, port 80, & Authbind. Prý za to může Java, ale podle mého pozorování je to spíš chyba authbindu a jeho nespolupráce s IPv6.
authbind nc6 -l -p23 nc6: bind to source :: 23 failed: Permission denied
Ani netcatu se totiž nedaří naslouchat na privilegovaném portu, pokud se používá IPv6 (po zadání přízaku výše naslouchá jen na IPv4) – netcat umí naslouchat na privilegovaném portu na IPv4, nebo na neprivilegovaném na IPv4 i IPv6, ale kombinace privilegovaný port + IPv6 se zdá být smrtící.
ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --on-port 8080zdroj
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.