iptables --set-চিহ্নিত - বিভিন্ন ইন্টারফেসের মাধ্যমে রুট ডিফেরেন্ট পোর্ট


15

শর্ট স্টোরি,
3 ইন্টারফেস, এথ0 (ল্যান), এথ 1 (এডিএসএল), এথ 2 (4 জি)।
eth0 -> eth1: ওয়ার্কস
(পোর্টগুলি 80, 443, 4070) eth0 -> eth2: ঘটে না


এটি ধারণার একটি গ্রাফিকাল উপস্থাপনা:

80 এবং 443 এথ 2
পিঁপড়ার মাধ্যমে বাকি E1 এর মাধ্যমে পোর্ট
এখানে চিত্র বর্ণনা লিখুন

Netscheme:

eth0: -ip 10.0.0.1 -net 10.0.0.0/8 -gw 10.0.0.1 (the servers own intf) 
eth1: -ip 192.168.1.74 -net 192.168.1.0/24 -gw 192.168.1.254 
eth2: -ip 192.168.1.91 -net 192.168.0.0/24 -gw 192.168.0.1 






আমার মনে হয় এই নতুন স্ক্রিপ্টটি যথাযথ টেবিলটিতে 22 এবং 4070 টি পুনর্বিবেচনা করেছে।
যাইহোক, table টেবিলটিতে পৌঁছানোর পরে, এটি এথ 2 এ পুনরায় সাজানো যায় না।




22 এবং 4070 ব্যতীত এই স্ক্রিপ্টটি কাজ করে!

(পোর্ট ৮০ মন্তব্যবিহীন এবং এটি এথ 1 এর মাধ্যমে কার্যকর হয় যা ভুল)

modprobe iptable_nat
modprobe ip_conntrack

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -F PREROUTING
iptables -t nat -F
iptables -t mangle -F
iptables -F
# This next line restores any issues trying to connect to something
# if you get weird ACK packets when trying to connect (at least i did)!
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
ip route flush table main

iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1
###  iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 4070 -j MARK --set-mark 1

## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
## -- Does the same as ip route below? route add default gw 192.168.1.254


echo "201 eth2.out" >> /etc/iproute2/rt_tables

ip rule add fwmark 1 table eth2.out
ip route add default via 192.168.0.1 dev eth2 table eth2.out
ip route add default via 192.168.1.254 dev eth1



## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE









পুরাতন লিপি:


  Ignore everything below unless you're interested in retracing my steps!!




আমি খারাপ কিছু করলে আমার পরিবেশ সেটআপ করতে একটি রাউটার.শ স্ক্রিপ্ট তৈরি করেছি। আমার কাছে 3 টি পোর্ট রয়েছে যা আমি 4G সংযোগে পাঠাতে চাই এবং বাকী একটি ল্যান্ডলাইন এডিএসএল সংযোগের মাধ্যমে want এটি করার জন্য, আমি আইপটিবলগুলিকে ডিফল্ট রুটে ম্যাঙ্গেল প্যাকেজগুলি নির্দেশনা দিয়েছি এবং আমার 4 জি ইন্টারফেসের মাধ্যমে যদি এটি প্রেরণ করা হয় --dport == 443 | 80 | 4070

তবে, এটি কাজ করে না; যাই হোক না কেন আমি আমার ল্যান্ডলাইনটি পেরিয়ে যাচ্ছি।

আমার স্ক্রিপ্টটি দেখতে এটির মতো:

#!/bin/bash

## routing tables
# wireless = 4G via eth2
# adsl = adsl via eth1

modprobe iptable_nat
modprobe ip_conntrack

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
ip route flush table main
ip route flush table wireless
ip route flush table adsl

## Setup routing tables
# ADSL
ip route add table adsl to 192.168.1.0/24 dev eth1
# 4G
ip route add table wireless to 192.168.0.0 dev eth2
ip rule add fwmark 0x1 table wireless

## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
route add default gw 192.168.1.254


## Forward ports into the LAN
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.0.3:80


## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1

## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -j LOG
#iptables --table nat --append POSTROUTING --out-interface eth2 --jump SNAT --to-source "192.168.1.74"
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

আমি এই 3টি স্ক্রিপ্টের নীচে যুক্ত করার চেষ্টা করেছি:

iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 80 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 443 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 4070 -j SNAT --to "192.168.0.91"

সাফল্য ছাড়াও চেষ্টা করা হয়েছে:

iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1

শেষ কিন্তু সর্বনিম্ন নয়, চেষ্টা করেছেন:

## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1

রাউটিংটি কাজ করে, আমি ওয়েব ব্রাউজ করতে পারি, সঙ্গীত শুনতে পারি এবং কী হয় না, তবে আমি এটি ভুল ইন্টারফেসের মাধ্যমে করছি। আমি এখন দীর্ঘকাল ধরে গুগল করেছি এবং আমি কী করছি এবং কেন করছি তা বুঝতে বিটস এবং টুকরো পেয়েছি। আমি টি সি এর মাধ্যমে ট্র্যাফিক শেপিং করতে পারতাম তবে iptables এ প্যাকেজ চিহ্নিত করার মাধ্যমে যদি এটি সম্ভব হয় তবে এটি আমাকে দীর্ঘতর পথে সহায়তা করবে।

আমার ধারণা হ'ল আমি অর্ডারটি বিভিন্ন নিয়মে ভুল করছি, মূলত ম্যাসওয়ার্ড অংশ? বা এমনকি যদি সেখানে থাকা উচিত?

কেউ কীভাবে ডিএনএটি পোর্টকে বাইরের ইন্টারফেস (একটি বা উভয় প্রোটোকল হয়) থেকে অভ্যন্তরীণ 10.0.0.0 ঠিকানার জায়গায় বলতে পারেন, tcp: 80 বলতে পারেন?



আউটপুট:

root@Netbridge:~# route -n Kernel IP routing table Destination    

Gateway         Genmask         Flags Metric Ref    Use Iface<br>
0.0.0.0         192.168.1.254   0.0.0.0         UG    0      0        0 eth1<br>
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth0<br>
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth2<br>
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1


root@Netbridge:~# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:4e  
          inet addr:10.0.0.1  Bcast:10.255.255.255  Mask:255.0.0.0

eth1      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:58  
          inet addr:192.168.1.74  Bcast:192.168.1.255  Mask:255.255.255.0

eth2      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:62  
          inet addr:192.168.0.91  Bcast:192.168.0.255  Mask:255.255.255.0

এই নির্দেশাবলী অনুসরণ করেছেন:
আউটপুট-ট্র্যাফিক-ভিন্ন-ইন্টারফেস-ভিত্তিক-গন্তব্য-পোর্ট
iptables- ফরোয়ার্ড-সুনির্দিষ্ট-পোর্ট-থেকে-নির্দিষ্ট-নির্দিষ্ট
অন্যান্য সম্পর্কিত থ্রেডগুলির মধ্যে।


আমি দুঃখিত, তবে কেবল ইন্টারফেসের localhostঠিকানার সাথে অ্যাপাচি বেঁধে রাখার কোনও কারণ আছে eth2?
জান মারেক

@ জনমারেক: এখানে অ্যাপাচের কোনও উল্লেখ নেই। এবং আপনার তথ্যের জন্য, একটি ethXআইপি ঠিকানায় একটি সকেট বাঁধাই লানের হোস্টগুলিকে 'আইপি' ঠিকানা ethXব্যবহার করে স্থানীয় সার্ভারটি অ্যাক্সেস ethYকরতে বাধা দেবে এবং হোস্টগুলিকে আইপি ঠিকানা ethYব্যবহার করে সার্ভার অ্যাক্সেস করতে বাধা দেবে না ethX। মনে রাখবেন লিনাক্স একটি দুর্বল হোস্ট মডেল ব্যবহার করে।
BatchyX

ঠিক আছে, আরও অনেক ওয়েব সার্ভার রয়েছে, কেবল অ্যাপাচি সার্ভারই ​​নয় ... যদিও আমি ইন্টারফেসের এথ 2 ওয়েব সার্ভারটি ইথ 2 সহজ সমাধান হতে পারে। তবে আমি ভুল হতে পারি, আমি জানি।
জান মারেক

উত্তর:


6

ব্যাচইএক্স ইতিমধ্যে iptables এবং রাউটিং সম্পর্কে খুব ভাল ব্যাখ্যা দেয়, তাই আমি আমার অলসতা অনুশীলন করব এবং সরাসরি স্ক্রিপ্টে যাব।

এটি 192.168.0.91 এর মাধ্যমে 80,443,22,4070 পোর্টে সমস্ত ট্র্যাফিক NAT এর উচিত। বাকি সমস্ত 192.168.1.254 এর মাধ্যমে NAT করবে।

আমি আমার পরীক্ষাটি আবার করি এবং এই গাইড অনুসরণ করে শেষ করছি । সেই গাইডটিতে যা অনুপস্থিত তা হ'ল আমার স্ক্রিপ্টের শেষ 3 লাইন। যা আমি অন্য একটি বন্দর থেকে খুঁজে পেয়েছি, কিন্তু আমি সেই লিঙ্কটির ট্র্যাক হারিয়ে ফেলেছি।

এটি একটি পরীক্ষিত ওয়ার্কিং স্ক্রিপ্ট।

ডিফল্ট রুট প্রয়োজন

একটি জিনিস আমি স্ক্রিপ্টে রাখিনি তা হ'ল ডিফল্ট রুট সেট আপ করা। এটা করা উচিত

route add default gw 192.168.1.254

আপনি যখন করবেন route -n, এটি একমাত্র ডিফল্ট রুট হওয়া উচিত (ডেস্ক: 0.0.0.0)

0.0.0.0    192.168.1.254    0.0.0.0    UG    0    0    0    eth1

fw-router.sh

# রিসেট / ফ্লাশ iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t ম্যাঙ্গেল -F
iptables -t ম্যাঙ্গেল-এক্স
iptables -P ইনপুট এসিসিপিটি
iptables -P ফরওয়ার্ড এসিসিপিটি
iptables -P OUTPUT ACCEPT

# রিসেট / ফ্লাশ / সেটআপ আইপি রুট (সারণী 4)
আইপি রুট ফ্লাশ টেবিল 4
আইপি রুট শো টেবিল প্রধান | grep -Ev ^ default | রুট পড়ার সময়; আইপি রুটে টেবিল 4 add রুট যুক্ত করুন; সম্পন্ন
আইপ রুটটি 192.168.0.1 এর মাধ্যমে টেবিল 4 ডিফল্ট যুক্ত করুন

# মার্ক প্যাকেট ডি পোর্টের সাথে মিলবে
iptables -t mangle -A PREROUTING -p tcp --dport 22 -s 10.0.0.0/24 -j মার্ক - সেট-চিহ্ন 4
iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 10.0.0.0/24 -j মার্ক - সেট-চিহ্ন 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -s 10.0.0.0/24 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 4070 -s 10.0.0.0/24 -j MARK --set-mark 4

# স্নাত বিধি
iptables -t nat -A POSTROUTING -o Eth1 -j SNAT - থেকে উত্স 192.168.1.74
iptables -t nat -A POSTROUTING -o Eth2 -j SNAT - থেকে উত্স 192.168.0.91

# আইপি রুট
আইপি রুল fwmark 4 টেবিল 4 যোগ করুন
আইপি রুট ফ্লাশ ক্যাশে

# আইপি স্ট্যাক
# এটি গাইডের অনুপস্থিত অংশ
প্রতিধ্বনি 1> / proc / sys / নেট / ipv4 / ip_forward
এফ / ইন / প্রোক / সিএস / নেট / আইপিভি 4 / কনফ / * / আরপি_ফিল্টার; প্রতিধ্বনি 0> $ চ; সম্পন্ন
প্রতিধ্বনি 0> / proc / sys / নেট / ipv4 / রুট / ফ্লাশ

পিএস 1: সংক্ষেপে, MASQUERADEএকাধিক বাহ্যিক আইপি সহ NAT এর জন্য (বেশিরভাগ ক্ষেত্রে এবং অবশ্যই আপনার ক্ষেত্রে অবশ্যই) কাজ করে না যা আগত ট্র্যাফিক পরিচালনার জন্য ডিএনএটি প্রয়োজন। আপনার SNATদিকনির্দেশনা নিয়ন্ত্রণের দরকার ।

পিএস 2: খাঁটি iptables যথেষ্ট নয়।


প্রথমত, সরাসরি স্ক্রিপ্টে যাওয়ার জন্য চিয়ার্স :) আমি এই রাতে চেষ্টা করব কারণ আমি যে পরিবেশে এটি চলবে সেই পরিবেশে ফিরে আসব!
টর্েক্সড

হুঁ, ভারী সংশোধন প্রয়োজন হতে পারে। আমাকে ফলাফল জানতে দিন।
জন সিউ

সংশোধিত, এখন কাজ করা উচিত।
জন সিউ

মিষ্টি, কিছুক্ষণের মধ্যে আপনার কাছে ফিরে আসবে: ডি
টরেক্সড

আমি আপনাকে ভালবাসি, অনেক মাথা ব্যাথা এবং আপনি এটি সমাধান করেছেন! ধন্যবাদ!
টরেক্সড

6

দ্রষ্টব্য: আমি কেবল পুরানোটিকে উপেক্ষা করে প্রথম স্ক্রিপ্টটি বিবেচনা করেছি।

  • আপনার বর্তমান আইপেটেবলগুলির সাহায্যে নেটফিল্টার মডিউলগুলি Modprobe করতে হবে না। এটি কেবলমাত্র কাস্টম সংযোগ ট্র্যাকারদের জন্য প্রয়োজনীয়।
  • মিশ্রিত করবেন না routeএবং ip route। এটি খাঁটি মন্দ। শুধু ব্যবহার ipসর্বত্র এবং ভুলে ifconfigএবংroute
  • /etc/iproute2/rt_tablesরিবুট জুড়ে পুনরায় সেট করা হয় না। ওভারে একই এন্ট্রি যুক্ত করা ভাল ধারণা নয়, আপনার কেবল এটি একবার করা দরকার। মনে রাখবেন যে rt_tablesকেবলমাত্র নামগুলি সংখ্যার মানগুলিতে সংজ্ঞায়িত করুন, এটি কোনও কনফিগারেশন পরিবর্তন করে না।

  • এখন এর জন্য iptables: আপনার FORWARDচেইনে, আপনি ল্যান থেকে 4 জি-তে আসা প্যাকেটগুলি ফেলে দিন। এইটা খারাপ. FORWARDহুক রাউটিং সম্পন্ন করা হয় পরে ব্যবহার করা হয়। এই মুহুর্তে, সমস্ত নীতিগত রাউটিং সম্পন্ন হয়েছে এবং প্যাকেটটি 4 জি বা এডিএসএল প্রেরণ করা উচিত কিনা তা ইতিমধ্যে জানা গেছে। এর আগে FORWARDবা পরে কোনও পুনর্নির্মাণ করা হয়নি FORWARD(ভাল, প্রযুক্তিগতভাবে, POSTROUTINGগুরুতর ক্ষেত্রে পরে পুনর্নির্মাণ করা যেতে পারে, তবে মূল বিষয়টিতে ফিরে যেতে হবে)।

এখন আপনার রাউটিংয়ের জন্য: মনে রাখবেন যে উবুন্টু ডিফল্টরূপে বিপরীত পথ ফিল্টারিং সক্ষম করে। বিপরীত পথ ফিল্টারিং নিম্নলিখিত রূপে কাজ করে: যখন কার্নেলটি একটি ইন্টারফেস এ থেকে একটি প্যাকেট (এটি ফরোয়ার্ড করা যায় বা না) পায় তখন এটি উত্সের ঠিকানা এবং গন্তব্য ঠিকানা উল্টে দেয় এবং ফলাফল প্যাকেটটি ইন্টারফেস এ এর ​​মাধ্যমে আবর্তিত করা উচিত কিনা তা পরীক্ষা করে check যদি তা না হয় তবে প্যাকেটটি ঠিকানা স্পোফিংয়ের প্রচেষ্টা হিসাবে বাদ দেওয়া হবে।

থেকে প্রাপ্ত প্যাকেটগুলির জন্য eth0, এটি কোনও সমস্যা নয়। প্রাপ্ত প্যাকেটগুলির জন্য eth1, এটিও কোনও সমস্যা নয়, কারণ উত্সের আইপি ঠিকানা এবং গন্তব্য আইপি ঠিকানাটি উল্টানোর সময়, কার্নেলটি টেবিলে এটি ডিফল্ট রুট হবে main। থেকে প্রাপ্ত প্যাকেটের জন্য eth2, যা আপনাকে চিহ্নিত না, এই একটা সমস্যা, কারণ কার্নেল টেবিল এ ডিফল্ট রুট আঘাত করবে হয় main, এবং বিবেচনা যে এই প্যাকেট থেকে প্রাপ্ত করা উচিত ছিল eth1। সবচেয়ে সহজ সমাধানটি হল E1-এ বিপরীত পাথ ফিল্টারিং অক্ষম করা:

sysctl -w net.ipv4.conf.eth1.rp_filter=0

সমস্ত দুর্দান্ত মন্তব্য এবং হ্যাঁ, আমার পক্ষ থেকে কিছু ত্রুটিযুক্ত যুক্তি রয়েছে, উদাহরণস্বরূপ প্রতিবার rt_tables এ যুক্ত করা এবং বিশেষত নির্দিষ্ট টেবিলগুলি সাফ না করা পাশাপাশি আমার উচিত ছিল তবে আমি সেখানে যাব :) আমি সবকিছু দিয়ে যাব এবং দেখব যদি এটি কাজ করে, যদি তাই হয় তবে আপনার কাছে +50 এবং সর্বাগ্রে আপনি কোনও লোককে বিট এবং শান্তিতে কাটা থেকে বাঁচিয়েছেন! :)
18'20

1
স্ক্রিপ্টের নীচে কাজ করা হয়েছে তবে আপনি স্যার সমস্ত কৃতজ্ঞতারও প্রাপ্য, আপনি আমাকে দু'একটি বিষয় চিন্তা করতে দিয়েছিলেন এবং rp_filter = 0 অনেক দীর্ঘ সাহায্য করেছে! : ডি
টর্সড

@ ব্যাচইএক্স খুব তথ্যবহুল, আপনাকেও ভোট দিন।
জন সিউ

@ টরেক্সড পোস্টটি আমি দেখেছি সমস্ত ইন্টারফেসের জন্য rp_filter অক্ষম করা দরকার। এটি অন্যভাবে কাজ করে কিনা আমি নিশ্চিত নই।
জন সিউ

@ জনসুই: আপনার কেবল ইন্টারফেসে আরপি ফিল্টার অক্ষম করতে হবে যেখানে এটি সমস্যাযুক্ত। সেক্ষেত্রে এটি eth1, কারণ চিহ্নগুলি সেট না করা হলে সেই ইন্টারফেসে যাওয়ার কোনও রুট নেই। ডিফল্ট রুটটি সেই ইন্টারফেসে চলে যাওয়ার কারণে এথ 2 এর কোনও সমস্যা নেই। এথ0-এর জন্য, আরপি ফিল্টারটি সক্ষম রাখা আসলেই কার্যকর, অন্যথায়, ল্যানের কেউ আইপি প্যাকেটটি ইন্টারনেটে থাকার সূত্রের ঠিকানা এবং ল্যানের গন্তব্য ঠিকানা যুক্ত করতে পারে এবং রাউটারটি আনন্দের সাথে এটি গ্রহণ করবে এবং এগিয়ে যাবে এটি ... এথ0 এ ফিরে আসে।
BatchyX
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.