GNU/Linux >> Znalost Linux >  >> Linux

iptables přesměrovává místní připojení na vzdálený systém / port

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}

Linux
  1. Přesměrování IP/portů pomocí csf

  2. Jak zkontrolovat otevřený port na vzdáleném systému Linux

  3. Jak přejmenovat místní a vzdálenou pobočku Git

  1. Získání MongoDB v Linuxu pro poslech vzdálených připojení

  2. Odepřít všechna příchozí spojení s iptables?

  3. Přesměrujte konzolu na sériový port

  1. REJECT vs DROP při použití iptables

  2. Přesměrování portů na Linuxu bez iptables?

  3. Nemůžete přistupovat k portu 80 ze vzdáleného umístění, ale funguje na místním?