Bagaimana saya bisa port forward dengan iptables?

118

Saya ingin koneksi yang masuk pada ppp0 pada port 8001 akan dialihkan ke 192.168.1.200 pada eth0 pada port 8080.

Saya punya dua aturan ini

-A PREROUTING  -p tcp -m tcp --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

dan itu tidak berhasil. Apa yang saya lewatkan?

Stu
sumber
6
NAT HOWTO
Paul Tomblin
Saya akan menggunakan tag npr (meskipun ini bisa berhubungan dengan pemrograman, meskipun tentu saja tidak diungkapkan dengan baik)
Mihai Limbăşan
Bagaimana dengan ini: Saya seorang programmer mencoba untuk mengatur lingkungan sehingga saya bisa men-debug aplikasi server saya di gerhana dipanggil dari innernet. Cukup dekat?
Tentu, itulah yang saya maksudkan dengan "frase yang buruk" ... Bisakah Anda mengedit pertanyaan sesuai?
Mihai Limbăşan

Jawaban:

97

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

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

Jika keduanya kembali 1tidak 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 - DNATbisa diterapkan di atas natmeja 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 untuk lalu lintas TCP (jika Anda ingin mengubah UDP juga, Anda harus memberikan aturan yang sama tetapi dengan -p udpset opsi).

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

ip route

dan periksa apakah 192.168.1.0/24ada di antara entri rute yang dikembalikan.

oo_olo_oo
sumber
16
Saya pribadi lebih suka sysctlsintaksisnya sepertisysctl net.ipv4.conf.eth0.forwarding=1
Doud
1
Bagaimana cara menghapus aturan yang dimasukkan salah?
Nickolai Leschov
2
baris kedua: "iptables-A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT" TIDAK diperlukan jika Anda tidak memiliki batasan / keamanan firewall, yang adalah kasus dengan sebagian besar LAN rumah, jika tidak hati-hati dengan -A, karena akan menambahkannya SETELAH pembatasan / keamanan dan mungkin tidak berfungsi (jadi periksa -Sebaiknya, itu menambahkan DALAM DEPAN aturan iptables)
PENULIS
2
@ ÁronLőrincz, Tidak. Aturan Iptables mudah berubah kecuali jika secara eksplisit dimuat saat boot.
sherrellbc
1
@Nickolai Leschov, masukkan penggantian yang sama -Adengan-D
Alexei Martianov
14

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
Robert Gamble
sumber
2
ummm ... itu apa yang sudah saya miliki. Saya menggunakan iptables-restore untuk memuatnya sehingga masing-masing berada di bagiannya sendiri, tetapi itulah yang saya tulis di atas.
Oke, sintaksnya terlihat buruk di aslinya. Apakah Anda mencoba -i ppp0 dalam aturan? Apa masalahnya sebenarnya?
Robert Gamble
13

Anda lupa postrouting alamat sumber SNAT:

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.

Orang Zelot
sumber
Anda mendapatkannya mundur di POSTROUNTINGtangga. Pada titik ini pembicaraan masih tentang --destinationbukan --source.
sherrellbc
6

Saya telah membuat skrip bash berikut untuk melakukan ini di router linux saya. Ini 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 skrip 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.

Nullivex
sumber
2

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

Caranya adalah dengan 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 perhatikan bahwa Anda mungkin ingin mengubah perintah:

  1. Untuk memungkinkan penerusan paket hanya pada antarmuka tertentu. Sebagai contoh:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Untuk mengizinkan tidak hanya MACHINE_A, tetapi juga semua orang lain menggunakan penerusan port, hapus:

    -s MACHINE_A
    
Denis Scherbakov
sumber
1

Mencoba

echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

File-file ini memberi tahu kernel bahwa itu diperbolehkan untuk meneruskan paket-paket antar antarmuka.

Adam Liss
sumber
0

Perintah ini tidak berfungsi untuk saya:

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

Saya memiliki 2 antarmuka LAN dan MAJU bekerja ketika saya akan menulis:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF - Antarmuka LAN (mis. Eth1, br0 ...)
  • FW_PORD - port penerusan (pada host detensi)
  • LAN_IP - Alamat IP pada antarmuka LAN (pada router)

PREROUTING dan FORWARD juga diperlukan, tentu saja :)

Andrew
sumber