GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa mem-port forward dengan iptables?

Solusi 1:

Pertama-tama - Anda harus memeriksa apakah penerusan diperbolehkan sama sekali:

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

Jika keduanya mengembalikan 1 tidak apa-apa. Jika tidak, lakukan hal berikut:

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

Hal kedua - DNAT dapat diterapkan pada nat meja saja. Jadi, aturan Anda harus diperluas dengan menambahkan spesifikasi tabel juga (-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

Kedua aturan hanya diterapkan pada lalu lintas TCP (jika Anda juga ingin mengubah UDP, Anda perlu memberikan aturan serupa tetapi dengan -p udp rangkaian pilihan).

Terakhir, namun tidak kalah pentingnya adalah konfigurasi perutean. Ketik:

ip route

dan periksa apakah 192.168.1.0/24 adalah di antara entri perutean yang dikembalikan.

Solusi 2:

Saya pikir yang Anda inginkan adalah:

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

Solusi 3:

Anda lupa alamat sumber 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

Dan jangan lupa untuk mengatur firewall linux Anda sebagai gateway default di komputer dengan alamat 192.168.1.200.

Solusi 4:

Saya telah membuat skrip bash berikut untuk melakukan ini di router linux saya. Secara otomatis menyimpulkan IP WAN dan mengonfirmasi pilihan Anda sebelum melanjutkan.

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

Penggunaan skripnya sederhana, cukup salin dan tempel ke file lalu.

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

Untuk menghapus aturan yang sama

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

Saya pikir ini mungkin menghemat waktu seseorang di router masing-masing.

Solusi 5:

Saya memiliki tugas untuk membuat MACHINE_A berpikir bahwa layanan berjalan secara fisik di MACHINE_B, tetapi secara transparan merutekan ulang semua permintaan ke MACHINE_C.

Triknya adalah menggunakan 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

Harap dicatat bahwa Anda mungkin ingin men-tweak perintah:

  1. Untuk mengizinkan penerusan paket hanya pada antarmuka tertentu. Misalnya:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Untuk mengizinkan tidak hanya MACHINE_A, tetapi juga yang lainnya untuk menggunakan penerusan porta, hapus:

    -s MACHINE_A
    

Linux
  1. Bagaimana saya bisa menghapus aturan khusus dari iptables?

  2. Cara membuka port di Linux

  3. Bagaimana saya bisa melakukan HTTP PUT dengan Wget?

  1. Bagaimana saya bisa menggunakan SSH dengan proxy SOCKS 5?

  2. Bagaimana saya bisa memindahkan file dengan xargs di Linux?

  3. Cara mengkonfigurasi iptables agar port yang tidak diinginkan tidak dilaporkan sebagai difilter

  1. Bagaimana saya bisa memantau lalu lintas port serial?

  2. Bagaimana saya bisa mengecualikan file secara default dengan rsync?

  3. Mengizinkan FTP dengan IPTables