GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso eseguire il port forwarding con iptables?

Soluzione 1:

Prima di tutto, dovresti verificare se l'inoltro è consentito:

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

Se entrambi restituiscono 1 va bene. In caso contrario, procedi come segue:

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

Seconda cosa:DNAT potrebbe essere applicato su nat solo tavolo. Quindi, la tua regola dovrebbe essere estesa aggiungendo anche la specifica della tabella (-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

Entrambe le regole vengono applicate solo al traffico TCP (se vuoi modificare anche UDP, devi fornire regole simili ma con -p udp opzione impostata).

Ultimo, ma non meno importante, è la configurazione del routing. Digita:

ip route

e controlla se 192.168.1.0/24 è tra le voci di instradamento restituite.

Soluzione 2:

Penso che quello che vuoi sia:

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

Soluzione 3:

Hai dimenticato l'indirizzo sorgente postrouting 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

E non dimenticare di impostare il tuo firewall Linux come gateway predefinito sul computer con indirizzo 192.168.1.200.

Soluzione 4:

Ho creato il seguente script bash per farlo sul mio router Linux. Deduce automaticamente l'IP WAN e conferma le selezioni prima di procedere.

#!/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

L'uso dello script è semplice basta copiarlo e incollarlo in un file e poi.

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

Per rimuovere la stessa regola

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

Ho pensato che questo avrebbe potuto far risparmiare tempo a qualcuno sul rispettivo router.

Soluzione 5:

Avevo il compito di far credere a MACHINE_A che il servizio fosse in esecuzione fisicamente su MACHINE_B, ma reindirizzare in modo trasparente tutte le richieste a MACHINE_C.

Il trucco era usare MASQUERADE.

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

Tieni presente che potresti voler modificare i comandi:

  1. Per consentire l'inoltro dei pacchetti solo su un'interfaccia specifica. Ad esempio:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Per consentire non solo a MACHINE_A, ma anche a tutti gli altri di utilizzare il port forwarding, rimuovere:

    -s MACHINE_A
    

Linux
  1. Come posso monitorare i dati su una porta seriale in Linux?

  2. Come posso eliminare la porta TCP 16969 in Bash?

  3. Come aprire la porta in Linux

  4. Come posso utilizzare SSH con un proxy SOCKS 5?

  5. Come posso spostare i file con xargs su Linux?

Come utilizzare i comandi Netcat con gli esempi

SSH per il porting diverso da 22:come farlo (con esempi)

Come proteggere il servizio SSH con Port Knocking

Come proteggere un firewall Linux con le regole IPtables

Come configurare il tunnel ssh per inoltrare ssh?

Consentire FTP con IPTables