GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich mit iptables weiterleiten?

Lösung 1:

Zunächst sollten Sie prüfen, ob die Weiterleitung überhaupt erlaubt ist:

cat /proc/sys/net/ipv4/conf/ppp0/forwarding 
cat /proc/sys/net/ipv4/conf/eth0/forwarding 

Wenn beide 1 zurückgeben Es ist in Ordnung. Wenn nicht, gehen Sie wie folgt vor:

echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding

Zweitens - DNAT könnte auf nat angewendet werden nur Tisch. Daher sollte Ihre Regel um eine Tabellenspezifikation erweitert werden (-t nat ):

iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080
iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Beide Regeln werden nur auf TCP-Verkehr angewendet (wenn Sie auch UDP ändern möchten, müssen Sie ähnliche Regeln angeben, jedoch mit -p udp Optionssatz).

Zu guter Letzt ist die Routing-Konfiguration. Geben Sie ein:

ip route

und prüfen Sie, ob 192.168.1.0/24 gehört zu den zurückgegebenen Routing-Einträgen.

Lösung 2:

Ich denke, was Sie wollen, ist:

iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state 
    NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination
    192.168.1.200:8080

Lösung 3:

Sie vergessen die Postrouting-Quelladresse SNAT 'ing:

sysctl net.ipv4.ip_forward=1
yours_wan_ip=101.23.3.1
-A PREROUTING  -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

Und vergessen Sie nicht, Ihre Linux-Firewall als Standard-Gateway auf dem Computer mit der Adresse 192.168.1.200 einzustellen.

Lösung 4:

Ich habe das folgende Bash-Skript erstellt, um dies auf meinem Linux-Router zu tun. Es leitet automatisch die WAN-IP ab und bestätigt Ihre Auswahl, bevor es fortfährt.

#!/bin/bash

# decide which action to use
action="add"
if [[ "-r" == "$1" ]]; then
  action="remove"
  shift
fi

# break out components
dest_addr_lan="$1"
dest_port_wan="$2"
dest_port_lan="$3"

# figure out our WAN ip
wan_addr=`curl -4 -s icanhazip.com`

# auto fill our dest lan port if we need to
if [ -z $dest_port_lan ]; then
  dest_port_lan="$dest_port_wan"
fi

# print info for review
echo "Destination LAN Address: $dest_addr_lan"
echo "Destination Port WAN: $dest_port_wan"
echo "Destination Port LAN: $dest_port_lan"
echo "WAN Address: $wan_addr"

# confirm with user
read -p "Does everything look correct? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
  if [[ "remove" == "$action" ]]; then
    iptables -t nat -D PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -D FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport     $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule removed"
  else
    iptables -t nat -A PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -A FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule added"
  fi
else
  echo "Info not confirmed, exiting..."
fi

Die Verwendung des Skripts ist einfach, kopieren Sie es einfach und fügen Sie es in eine Datei ein.

# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added

So entfernen Sie dieselbe Regel

# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed

Ich dachte, dies könnte jemandem Zeit auf seinem jeweiligen Router sparen.

Lösung 5:

Ich hatte die Aufgabe, MACHINE_A glauben zu machen, dass der Dienst physisch auf MACHINE_B läuft, aber alle Anfragen transparent an MACHINE_C umzuleiten.

Der Trick bestand darin, MASQUERADE zu verwenden.

sysctl net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --to-destination MACHINE_C

iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE

Bitte beachten Sie, dass Sie vielleicht die Befehle optimieren möchten:

  1. Paketweiterleitung nur auf einer bestimmten Schnittstelle zulassen. Zum Beispiel:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Um nicht nur MACHINE_A, sondern auch allen anderen die Verwendung der Portweiterleitung zu erlauben, entfernen Sie:

    -s MACHINE_A
    

Linux
  1. SSH zu einem anderen Port als 22:So geht's (mit Beispielen)

  2. So sichern Sie den SSH-Dienst mit Port Knocking

  3. Wie kann ich Daten an einer seriellen Schnittstelle in Linux überwachen?

  4. Wie kann ich den TCP-Port 16969 in Bash beenden?

  5. Wie kann ich einen HTTP PUT mit Wget durchführen?

Verwendung von Netcat-Befehlen mit Beispielen

Wie richte ich mit Hilfe von Setcap eine Remote-Port-Weiterleitung auf Port 80 zum Localhost ein?

So sichern Sie eine Linux-Firewall mit IPTables-Regeln

So konfigurieren Sie iptables, damit ein unerwünschter Port nicht als gefiltert gemeldet wird

FTP mit IPTables zulassen

Kann ich ufw verwenden, um eine Portweiterleitung einzurichten?