मैं iptables के साथ आगे कैसे पोर्ट कर सकता हूं?


118

मैं चाहता हूँ कि पोर्ट 8001 पर ppp0 पर आने वाले कनेक्शन को पोर्ट 8080 पर eth0 पर 192.168.1.200 पर रूट किया जाए।

मुझे ये दो नियम मिले हैं

-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

और यह काम नहीं करता है। मैं क्या खो रहा हूँ?



मैं npr टैग के साथ जाने वाला हूं (हालाँकि यह प्रोग्रामिंग-संबंधी हो सकता है, हालांकि खराब तरीके से संचालित किया जा सकता है।)
Mihai Limbăşan

इसके बारे में कैसे: मैं एक प्रोग्रामर हूं जो एक वातावरण स्थापित करने की कोशिश कर रहा है ताकि मैं अपने सर्वर एप्लिकेशन को ग्रहण से निर्दोष से बुलाया जा सके। पर्याप्त नजदीक?

निश्चित रूप से, मेरा मतलब है कि "खराब तरीके से संचालित" ... क्या आप तदनुसार प्रश्न को संपादित कर सकते हैं?
Mihai Limbăşan

जवाबों:


97

सबसे पहले - आपको जांचना चाहिए कि क्या अग्रेषण की अनुमति है:

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

अगर दोनों लौटाते हैं 1तो ठीक है। यदि निम्न न करें:

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

दूसरी बात - केवल टेबल DNATपर लागू किया जा सकता है nat। इसलिए, आपके नियम को तालिका विनिर्देश के साथ जोड़कर बढ़ाया जाना चाहिए ( -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

दोनों नियम केवल टीसीपी ट्रैफ़िक पर लागू होते हैं (यदि आप यूडीपी को भी बदलना चाहते हैं, तो आपको समान नियम प्रदान करने की आवश्यकता है लेकिन -p udpविकल्प सेट के साथ )।

अंतिम, लेकिन कम से कम रूटिंग कॉन्फ़िगरेशन नहीं है। प्रकार:

ip route

और जाँच करें कि 192.168.1.0/24क्या लौटी रूटिंग प्रविष्टियों में से है।


16
मैं व्यक्तिगत रूप से sysctlवाक्य रचना पसंद करता हूं जैसेsysctl net.ipv4.conf.eth0.forwarding=1
Doud

1
मैं गलत तरीके से दर्ज नियम को कैसे हटाऊं?
निकोलई लेसचोव

2
दूसरी पंक्ति: "iptables-FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW, ESTABLISHED, संबंधित -j ACCEPT" की आवश्यकता नहीं है कि आपके पास फ़ायरवॉल प्रतिबंध / सुरक्षा नहीं है, जो ज्यादातर होम लैन के मामले में, अन्यथा सावधान रहना चाहिए, क्योंकि यह प्रतिबंध / सुरक्षा को जोड़ देगा और काम नहीं कर सकता है (इसलिए चेक -I के बजाय, जो कि iptables नियमों के सामने जोड़ रहा है)
THESorcerator

2
@ PtronLÁrincz, नहीं Iptables नियम अस्थिर हैं जब तक कि बूट पर स्पष्ट रूप से लोड नहीं किया गया है।
शेररेल्बक

1
@Nickolai Leschov, एक ही जगह दर्ज -Aसाथ-D
अलेक्सई Martianov

14

मुझे लगता है कि तुम क्या चाहते हो:

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 ... कि मैं पहले से ही क्या है। मैं इसे लोड करने के लिए iptables- पुनर्स्थापना का उपयोग करता हूं ताकि प्रत्येक अपने स्वयं के अनुभाग में हो, लेकिन यही मैंने ऊपर लिखा है।

ठीक है, मूल में वाक्य रचना खराब दिखी। क्या आपने नियमों में pi0 की कोशिश की? वास्तव में समस्या क्या है?
रॉबर्ट गैंबल

13

आप स्रोत पता 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

और अपने linux फ़ायरवॉल को 192.168.1.200 पते के साथ कंप्यूटर पर डिफ़ॉल्ट गेटवे के रूप में सेट करना न भूलें।


आप इसे POSTROUNTINGकदम पर पीछे की ओर मिला । इस बिंदु पर बातचीत अभी के --destinationबजाय के बारे में है --source
शेरेरेल्बक

6

मैंने अपने लिनक्स राउटर पर ऐसा करने के लिए निम्नलिखित बैश स्क्रिप्ट बनाई है। यह स्वचालित रूप से वान आईपी को संक्रमित करता है और आगे बढ़ने से पहले आपके चयन की पुष्टि करता है।

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

स्क्रिप्ट का उपयोग सरल है बस इसे एक फ़ाइल में कॉपी करें और पेस्ट करें।

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

उसी नियम को हटाने के लिए

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

मैंने सोचा कि यह उनके संबंधित राउटर पर किसी को समय बचा सकता है।


2

मेरे पास यह सोचकर MACHINE_A बनाने का कार्य था कि MACHINE_B पर सेवा शारीरिक रूप से चल रही है, लेकिन MACHINE_C के सभी अनुरोधों को पारदर्शी रूप से पुन: रूट करता है।

चाल 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

कृपया ध्यान दें कि आप आदेशों को मोड़ना चाहते हैं:

  1. केवल एक विशिष्ट इंटरफ़ेस पर पैकेट अग्रेषण की अनुमति देने के लिए। उदाहरण के लिए:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. न केवल MACHINE_A, बल्कि अन्य सभी को पोर्ट फ़ॉरवर्डिंग का उपयोग करने की अनुमति देने के लिए, हटाने के लिए:

    -s MACHINE_A
    

1

प्रयत्न, कोशिश

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

ये फाइलें कर्नेल को बताती हैं कि इसे इंटरफेस के बीच पैकेट को अग्रेषित करने की अनुमति है।


0

यह आदेश मेरे लिए काम नहीं करता है:

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

मेरे लिखे जाने पर मेरे पास 2 LAN इंटरफेस और फॉरवर्ड काम हैं:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF - LAN इंटरफ़ेस (जैसे। eth1, br0 ...)
  • FW_PORD - फॉरवर्ड पोर्ट (डिटेक्शन होस्ट पर)
  • LAN_IP - LAN इंटरफ़ेस पर (रूटर पर) आईपी पता

बेशक और आगे भी आवश्यक है, :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.