İptables ile nasıl bağlantı kurabilirim?


118

8001 limanındaki ppp0'a gelen bağlantıların 8080 limanındaki eth0'daki 192.168.1.200’e yönlendirilmesini istiyorum.

Bu iki kuralı aldım

-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

ve çalışmıyor. Neyi kaçırıyorum?



Ben npr etiketiyle gidiyorum (bu her ne kadar olabilir kötü tabii ifadelerle olsa programlama-ilişkili.)
— Mihai Limbăşan

Buna ne dersin: Ben bir ortam kurmaya çalışan bir programcıyım, bu yüzden sunucu uygulamamı tutulmasıyla hata ayıklayabiliyorum. Yeterince yakın?

Tabii, "kötü ifadeler" ile kastettiğim budur ... Soruyu buna göre düzenleyebilir misiniz?
— Mihai Limbăşan

Yanıtlar:


97

Her şeyden önce - yönlendirmeye izin verilip verilmediğini kontrol etmelisiniz:

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

Her ikisi de dönerse 1sorun yok. Aşağıdakileri yapmazsanız:

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

İkinci şey - sadece masaya DNATuygulanabilir nat. Bu nedenle, kuralınız tablo özellikleri ekleyerek de genişletilmelidir ( -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

Her iki kural da yalnızca TCP trafiğine uygulanır (UDP'yi de değiştirmek istiyorsanız, benzer kurallar sağlamanız gerekir, ancak -p udpseçenek ayarlı olarak da gerekir).

Sonuncu, fakat en az değil, yönlendirme yapılandırmasıdır. Tür:

ip route

ve 192.168.1.0/24döndürülen yönlendirme girişleri arasında olup olmadığını kontrol edin .


16
Şahsen ben sysctlgibi sözdizimi tercih ediyorumsysctl net.ipv4.conf.eth0.forwarding=1
— Doud

1
Yanlış girilen kuralı nasıl kaldırırım?
— Nickolai Leschov

2
ikinci satır: "iptables - BİR İLERİ - p tcp -d 192.168.1.200 - 8080 -port devlet - devlet durumu, güvenlik duvarı kısıtlamalarınız / güvenceniz yoksa, YENİ, KURULAN, İLGİLİ - j KABUL EDİLMEZ" gerekli DEĞİLDİR Ev LAN'larının çoğunda durum böyledir, aksi halde -A ile dikkatli olun, kısıtlamalar / güvenlik SONRASI SONRA ekleyecektir ve çalışmayabilir (bu nedenle kontrol edin - I yerine, iptables kurallarının
— ÖN'üne ekleyen

2
@ ÁronLőrincz, No. Iptables kuralları, açılışta açıkça yüklenmedikçe geçicidir.
— sherrellbc

1
@Nickolai Leschov, -Aile aynı değeri girin-D
— Alexei Martianov

14

Sanırım istediğin şey:

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

2
ummm ... bu zaten sahip olduğum şey. Her biri kendi bölümünde olacak şekilde yüklemek için iptables-restore kullanıyorum, ancak yukarıda yazdığım şey bu.

Tamam, sözdizimi orijinalinde kötü görünüyordu. Kurallarda -i ppp0 denedin mi? Sorun tam olarak nedir?
— Robert Gamble,

13

SNAT 'rotasını yönlendiren kaynak adresi unutuyorsunuz:

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

Ayrıca Linux güvenlik duvarınızı, 192.168.1.200 adresli bir bilgisayarda varsayılan ağ geçidi olarak ayarlamayı unutmayın.


POSTROUNTINGBasamakta geriye doğru aldın. Bu noktada konuşma hala --destinationdeğil --source.
— sherrellbc

6

Linux yönlendiricimde bunu yapmak için aşağıdaki bash betiğini yarattım. WAN IP'ye otomatik olarak girer ve devam etmeden önce seçimlerinizi onaylar.

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

Betik kullanımı basitçe kopyalayıp bir dosyaya yapıştırıp yapıştırın.

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

Aynı kuralı kaldırmak için

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

Bunun kendi yönlendiricisinde zaman kazanabileceğini düşündüm.


2

MACHINE_A'yı hizmetin fiziksel olarak MACHINE_B'de çalıştığını düşünmeye zorlamakla görevliydim, ancak tüm istekleri şeffaf bir şekilde MACHINE_C'ye yönlendirin.

İşin püf noktası MASQUERADE kullanmaktı.

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

Lütfen komutları değiştirmek isteyebileceğinizi unutmayın:

  1. Paketin yalnızca belirli bir arabirimde iletilmesine izin vermek için. Örneğin:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Yalnızca MACHINE_A'nın değil, diğerlerinin de port yönlendirme kullanmasına izin vermek için, şunları kaldırın:

    -s MACHINE_A
    

1

Deneyin

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

Bu dosyalar çekirdeğe arayüzler arasında paket iletme izni verildiğini söyler.


0

Bu komut benim için çalışmıyor:

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

2 LAN arayüzüm var ve yazdığımda FORWARD çalışıyor:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF - LAN arayüzü (örneğin, eth1, br0 ...)
  • FW_PORD - iletilen bağlantı noktası (algılama ana bilgisayarında)
  • LAN_IP - LAN arayüzündeki IP adresi (yönlendiricideki)

Tabii ki ön işlem ve ileri de gereklidir :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.