GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu přenést přes iptables?

Řešení 1:

Za prvé - měli byste zkontrolovat, zda je přeposílání vůbec povoleno:

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

Pokud obě vrátí 1 to je v pořádku. Pokud ne, proveďte následující:

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

Druhá věc - DNAT lze použít nat pouze stůl. Vaše pravidlo by tedy mělo být rozšířeno přidáním specifikace tabulky (-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

Obě pravidla se použijí pouze na TCP provoz (pokud chcete změnit také UDP, musíte poskytnout podobná pravidla, ale s -p udp sada možností).

V neposlední řadě je konfigurace směrování. Typ:

ip route

a zkontrolujte, zda 192.168.1.0/24 je mezi vrácenými položkami směrování.

Řešení 2:

Myslím, že to, co chcete, je:

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

Řešení 3:

Zapomněli jste postrouting zdrojovou adresu 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

A nezapomeňte nastavit váš linuxový firewall jako výchozí bránu na počítači s adresou 192.168.1.200.

Řešení 4:

Vytvořil jsem následující bash skript, abych to udělal na mém linuxovém routeru. Automaticky odvodí WAN IP a potvrdí váš výběr, než budete pokračovat.

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

Použití skriptu je jednoduché, stačí jej zkopírovat a vložit do souboru a poté.

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

Chcete-li odstranit stejné pravidlo

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

Myslel jsem, že to někomu ušetří čas na příslušném routeru.

Řešení 5:

Měl jsem za úkol přimět MACHINE_A, aby si myslel, že služba běží fyzicky na MACHINE_B, ale transparentně přesměrovat všechny požadavky na MACHINE_C.

Trik byl použít 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

Upozorňujeme, že možná budete chtít upravit příkazy:

  1. Povolit předávání paketů pouze na konkrétním rozhraní. Například:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Chcete-li povolit nejen MACHINE_A, ale i všem ostatním používat přesměrování portů, odstraňte:

    -s MACHINE_A
    

Linux
  1. Jak mohu odstranit konkrétní pravidla z iptables?

  2. Jak mohu provést rozdělení s proměnnými v prostředí Linuxu?

  3. Jak otevřít port v Linuxu

  1. Jak mohu použít SSH s proxy SOCKS 5?

  2. Jak mohu přesouvat soubory pomocí xargs v Linuxu?

  3. Mohu použít ufw k nastavení přesměrování portu?

  1. SSH na jiný port než 22:Jak na to (s příklady)

  2. Jak nastavit přesměrování vzdáleného portu na portu 80 k místnímu hostiteli s pomocí Setcap?

  3. Jak mohu sledovat data na sériovém portu v Linuxu?