
Da ich keinen Router habe, habe ich mein CentOS 6.4 Linux-System zu einem Router gemacht, der den öffentlichen Netzwerkverkehr an mein lokales LAN weiterleitet. Es hat zwei NIC-Karten, eine für die öffentliche IP-Adresse (eth1) und eine für die private IP-Adresse (eth2).
Ich habe einen Server mit meinem lokalen LAN verbunden, sagen wir bei 192.168.1.2
.
Router
- eth1:
x.x.x.x
, die öffentliche IP-Adresse - eth2:
192.168.1.1
, die interne Routeradresse
Wenn jemand aus einem externen Netzwerk SSH auf der öffentlichen IP ausführt, sollte es auf den Server umgeleitet werden:
ssh x.x.x.x
oder mitKitt
Ich habe die SELinux- und iptables-Firewall auf dem Server deaktiviert. Ich habe einige iptables-Änderungen am Linux-Systemrouter versucht, aber die SSH-Anfrage wird immer noch nicht umgeleitet:
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 22 -j DNAT --to-destination 192.168.1.2:22
Ich möchte außerdem den gesamten HTTP(80)-Verkehr mithilfe von iptables vom selben Linux-Systemrouter an meinen internen Server weiterleiten.
Antwort1
Stellen Sie zunächst sicher, dass die Paketweiterleitung im Kernel aktiviert ist
# echo 1 > /proc/sys/net/ipv4/ip_forward
Sie können es auch dauerhaft machen, indem Sie die folgende Zeile hinzufügen/etc/sysctl.conf
net.ipv4.ip_forward = 1
Sie müssen dies auf einem Linux-Computer tun, der als Router fungiert. Sie können die folgende Regel auf einem Router-Computer ausprobieren.
iptables -t nat -A PREROUTING -i eth1 -d x.x.x.x -p tcp --dport 22 -j DNAT --to-destination 192.168.1.2:22
Teilen Sie uns auch die Ausgabe Ihrer NAT-Regeln aus der Router-Box mit.
iptables -t nat -L -n -v
Antwort2
Basierend auf diesem erstaunlichenDigitalOceanDa ich nach dem Tutorial zum Weiterleiten von Ports gesucht habe, habe ich beschlossen, es hier noch einmal neu zu schreiben.
Ich habe viele Stunden damit verbracht, herauszufinden, wie das funktioniert. Ich bin neu bei Linux und der Anfang ist nicht immer einfach. Hier ist ein Beispiel meiner Server und deren Portweiterleitung:
Firewall-Server (2 NIC-Karten) – Netzwerkdetails:
- Öffentliche IP-Adresse:xx.xx.xx.xx
- Private IP-Adresse:jj.jj.jj.jj
- Öffentliche Schnittstelle:eth0
- Private Schnittstelle:eth1
Intern(z. B. SSH, Web) Server (1 NIC-Karte) – Netzwerkdetails:
- Private IP-Adresse:zz.zz.zz.zz
- Private Schnittstelle:eth0
Lösung:
Paketweiterleitung im Kernel aktivieren:
echo 1 > /proc/sys/net/ipv4/ip_forward
Variablen definieren:
# Admin IP address (e.g. public home ip)
ADMIN="aa.aa.aa.aa"
# IP addresses of servers (e.g. in cloud):
FW_eth0_ip="xx.xx.xx.xx"
FW_eth1_ip="yy.yy.yy.yy"
WEB_eth0_ip="zz.zz.zz.zz"
# Services:
SSH="22"
HTTP="80"
Iptables-Portweiterleitung (mit -m conntrack):
iptables -t nat -A PREROUTING -i eth0 -s $ADMIN -d $FW_eth0_ip -p tcp --dport $SSH -j DNAT --to-destination $WEB_eth0_ip
iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport $SSH -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport $SSH -d $WEB_eth0_ip -j SNAT --to-source $FW_eth1_ip
Einige Anmerkungen:
- "..-s $ADMIN -d $FW_eth0_ip.." (1. Zeile) – nur aus Sicherheitsgründen hinzugefügt – es bedeutet, dass nur die ADMIN-IP auf SSH zugreifen kann (wenn sie nicht benötigt wird, können Sie sie löschen)
- -m Verbindungsverfolgungist das gleiche wie-m Status
- Ich empfehle, den Standardport von SSH auf einen anderen Port zu ändern, beispielsweise 1xxxx (in /etc/ssh/sshd_config).
- überprüfenListe der TCP- und UDP-Portnummern
- Ich verwende Port 15xx1 für den SSH-Zugriff auf den Firewall-Server und 15xxx2 für den internen
Terminal:
# access firewall server
$ ssh [email protected] -p 15xx1
# access internal server
$ ssh [email protected] -p 15xx2
Weitere Einzelheiten zu den verwendeten Regeln sind im genannten Tutorial ausführlich beschrieben.
Das ist alles von mir, ich hoffe, es hilft Ihnen.
Antwort3
Obwohl sich diese Frage auf iptables bezieht, erfahren Sie hier, wie Sie auf HTTP des internen Netzwerks zugreifen, falls Sie auch FirewallD ausführen.
Lassen Sie zunächst HTTP-Verkehr in Ihrer internen Server-FirewallD zu:
# firewall-cmd --permanent --add-service=http
Leiten Sie dann den HTTP-Verkehr von der externen IP an Port 80 der internen IP weiter:
# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=10.0.0.11
Dasselbe kann für den SSH-Dienst getan werden.
Antwort4
Aktivieren Sie zunächst das Routing im Linux-Gateway:
echo 1 > /proc/sys/net/ipv4/ip_forward
Fügen Sie dann die folgenden Regeln mit Ihrer Netzwerkschnittstelle (also eth1) und den gewünschten Ports hinzu:
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.2
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Überprüfen Sie Ihre Regeln mit iptables -L -v
. Die Spalten „Pakete“ und „Bytes“ zeigen Ihnen, welche Regeln erfüllt werden.