İ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.