আমি iptables দিয়ে কিভাবে পোর্ট ফরওয়ার্ড করতে পারি?


118

আমি চাই যে 8001 পোর্টে পিপিপি 0-তে আসা সংযোগগুলি 8080 পোর্টের এথ0-তে 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

এবং এটি কাজ করে না। আমি কী মিস করছি?



আমি এনআরপি ট্যাগ নিয়ে যাচ্ছি (যদিও এটি প্রোগ্রামিং-সম্পর্কিত হতে পারে, যদিও
এটির পক্ষে

এটি সম্পর্কে: আমি একজন প্রোগ্রামার এমন একটি পরিবেশ স্থাপনের চেষ্টা করছি যাতে আমি আমার সার্ভার অ্যাপ্লিকেশনটি ডিগ্রি করতে পারি গ্রহনে ইন্টার্ননেট থেকে ডেকে আনাতে। খুব কাছাকাছি?

অবশ্যই, আমি "দুর্বল শব্দযুক্ত" বলতে যা বোঝাতে চেয়েছি ... আপনি সেই অনুসারে প্রশ্নটি সম্পাদনা করতে পারবেন?
মিহাই লিম্বান

উত্তর:


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
ডাউড

1
আমি কীভাবে ভুলভাবে প্রবেশ করা নিয়মটি সরিয়ে ফেলব?
নিকোলাই লেসচভ

2
দ্বিতীয় লাইন: "iptables -A ফরওয়ার্ড -p tcp -d 192.168.1.200 --dport 8080 -m রাজ্য - নতুন নতুন, প্রতিষ্ঠিত, সম্পর্কিত -j এসিসিপিটি" আপনার যদি ফায়ারওয়াল বিধিনিষেধ / সুরক্ষা না থাকে, প্রয়োজন হয় না, যা বেশিরভাগ হোম ল্যানের ক্ষেত্রে, অন্যথায় -A এর সাথে সাবধানতা অবলম্বন করুন, কারণ এটি সীমাবদ্ধতা / সুরক্ষার পরে এটি যুক্ত করে এবং কাজ নাও করতে পারে (সুতরাং পরিবর্তে আমি পরীক্ষা করে দেখুন, এটি iptables বিধিগুলির
সামনের অংশে যুক্ত করছে

2
@ অ্যারনলোরিনক্জ, নং আইপটেবলস বিধিগুলি অবাধ্য হয় যদি না স্পষ্টভাবে বুটে লোড হয়।
sherrellbc

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
উম্মম ... এটাই আমার কাছে ইতিমধ্যে ছিল। আমি এটিকে লোড করতে আইপটিবল-রিস্টোর ব্যবহার করি যাতে প্রতিটি তার নিজস্ব বিভাগে থাকে তবে আমি উপরে যা লিখেছি।

ঠিক আছে, সিনট্যাক্সটি মূলটিতে খারাপ দেখাচ্ছে। আপনি কি নিয়মে পি-পি-পি 0 ব্যবহার করে দেখেছেন? সমস্যা ঠিক কী?
রবার্ট গ্যাম্বল

13

আপনি সোনাট পোস্টিংয়ের উত্স ঠিকানা ভুলে গেছেন:

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

এবং আপনার লিনাক্স ফায়ারওয়ালকে 192.168.1.200 ঠিকানা সহ কম্পিউটারে ডিফল্ট গেটওয়ে হিসাবে সেট করতে ভুলবেন না।


আপনি এটি POSTROUNTINGস্টেপ পিছনে পেয়েছিলাম । এই মুহুর্তে কথোপকথনটি --destinationবরং তার চেয়ে বেশি --source
sherrellbc

6

আমি আমার লিনাক্স রাউটারে এটি করার জন্য নিম্নলিখিত বাশ স্ক্রিপ্ট তৈরি করেছি। এটি স্বয়ংক্রিয়ভাবে WAN আইপি অনুমান করে এবং এগিয়ে যাওয়ার আগে আপনার নির্বাচনকে নিশ্চিত করে।

#!/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 এ পুনরায় রুট করবে।

কৌতুকটি ছিল মাস্কেরডে ব্যবহার করা।

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 টি ল্যান ইন্টারফেস এবং ফরোয়ার্ড কাজ রয়েছে যখন আমি লিখব:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF - ল্যান ইন্টারফেস (উদাহরণস্বরূপ, eth1, br0 ...)
  • এফডব্লু_পর্ড - ফরোয়ার্ড করা পোর্ট
  • LAN_IP - ল্যান ইন্টারফেসে আইপি ঠিকানা (রাউটারে)

প্রেরিটিং এবং ফরওয়ার্ড অবশ্যই প্রয়োজনীয় :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.