Nejsem si úplně jistý, jestli jsem to pochopil, ale myslím, že jsi jen ve špatném řetězci. :-) Taky jsem byl zmatený, když jsem poprvé použil iptables. Ale cesta k vpřed místní port ${LOCAL UNPRIV PORT} je následující:
$IPT -t nat -A PREROUTING -i eth0 -p tcp --dport ${LOCAL UNPRIV PORT}
-j DNAT --to ${ANOTHER SYSTEM}:${REMOTE PORT}
Je to směs mezi sémantickým problémem a tím, jak funguje netfilter:Za starých časů předávání místního portu zahrnovalo připojení k boxu, který přesměrovává, plus druhé připojení k cíli. Iptables to dělá v jednom kroku. Takže místo dvou připojení - přesměrujete provoz na tento port přímo do cíle. Netfilter provádí všechny kontroly zdravého rozumu a vede účetnictví:pouze pakety, které patří k platnému připojení, jsou NATovány a lze je tedy přeposílat.
Povolení DNAT neumožňuje předávat žádné pakety. Musíte také přidat pravidlo:
$IPT -N INET-PRIV
$IPT -A FORWARD -i eth0 -o eth1 -j INET-PRIV
$IPT -A FORWARD -j DROP
$IPT -A INET-PRIV -p tcp -d ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j ACCEPT
$IPT -A INET-PRIV -j DROP
A samozřejmě musíte povolit přeposílání.
echo "1" > /proc/sys/net/ipv4/ip_forward
Pro iptables :bezpečnější, flexibilnější, méně paměti a CPU použité na připojení
Contra iptables :přesměrování připojení z interního počítače na interní počítač (vložení zpět do eth0) nedává smysl s iptables (samozřejmě se můžete vždy připojit přímo), nefunguje přesměrování provozu, který je generován lokálně (port forwarding daemon by mohl pomoci – ale obvykle to nedává smysl)
Právě toto může být problém :pokoušíte se použít NAT na jiném než směrovači, takže byste měli použít předávacího démona nebo úplně přeskočit toto další přesměrování portů a provést:
ssh -L 1234:${ANOTHER SYSTEM}:${REMOTE PORT} special-vpn-box
Na special-vpn-box můžete povolit pouze příchozí připojení ze směrovače a odchozí připojení k ${ANOTHER SYSTEM}:${REMOTE PORT} pomocí iptables. Tímto způsobem mohou uživatelé speciálního vpn-boxu přistupovat pouze k ${ANOTHER SYSTEM}:${REMOTE PORT} a nebudou moci dělat nic jiného, pokud nejsou důvěryhodní.
Zde je to, co dělám konkrétně pro předávání localhost:
iptables -t nat -A OUTPUT -m addrtype --src-type LOCAL --dst-type LOCAL -p tcp --dport 3306 -j DNAT --to-destination ip.ip.ip.ip
iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE
sysctl -w net.ipv4.conf.all.route_localnet=1
Ujistěte se, že jste nahradili ip.ip.ip.ip
pro vaši skutečnou veřejnou IP a také --dport 3306
pro port, který chcete přesměrovat.
Nakonec spusťte příkaz sysctl a také aktualizujte /etc/sysctl.conf
Můžete aktualizovat sysctl.ctl
pro povolení směrování localhost pomocí následujícího příkazu:
echo "net.ipv4.conf.all.route_localnet=1" >> /etc/sysctl.conf
Teď se to všechno zdá jednoduché a dobré, ale vyžadovalo to nějaký výzkum a hledání. Buďte varováni a pochopte, že předávání localhost/127.0.0.1 vyžaduje tuto metodu a typické další příklady nefungují. Některé příklady řešení, která nefungují s localhost:
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to ip.ip.ip.ip:3306
iptables -t nat -A POSTROUTING -d ip.ip.ip.ip -j MASQUERADE
http://realtechtalk.com/iptables_how_to_forward_localhost_port_to_remote_public_IP-1788-articles
# Enable IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp \
--dport ${LOCAL UNPRIV PORT} -j DNAT --to-destination ${ANOTHER SYSTEM}:${REMOTE PORT}
iptables -t nat -A POSTROUTING -p tcp \
--dst ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j SNAT --to-source ${LOCAL SYSTEM}