गंतव्य पोर्ट के आधार पर विभिन्न इंटरफेस पर आउटपुट ट्रैफ़िक


23

मेरा प्रश्न मूल रूप से एक ही है क्योंकि केवल कुछ इंटरफेस पर कुछ आउटबाउंड यातायात की अनुमति है

मेरे पास दो इंटरफेस eth1(10.0.0.2) और wlan0(192.168.0.2) हैं। मेरे डिफ़ॉल्ट मार्ग के लिए है eth1। मान लीजिए कि मैं चाहता हूं कि सभी https-ट्रैफ़िक से गुज़रें wlan0। अब अगर मैं दूसरे प्रश्न में सुझाए गए समाधान का उपयोग करता हूं, तो https ट्रैफ़िक से गुजर wlan0जाएगा, लेकिन फिर भी eth1(10.0.0.2) का स्रोत-पता होगा । चूंकि यह पता wlan0गेटवे के लिए राउटेबल नहीं है , इसलिए उत्तर कभी वापस नहीं आएंगे। इसका आसान तरीका यह होगा कि आवेदन में ठीक से बाइंड-ऐड को सेट किया जाए, लेकिन इस मामले में यह लागू नहीं है।

मुझे लगता है कि मुझे src-addr को फिर से लिखना होगा:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

अब tcpdump आउटगोइंग पैकेट्स को ठीक-ठाक देखता है और 192.168.0.2 के लिए इनगेटिंग पैकेट्स आते हैं, हालाँकि वे शायद एप्लीकेशन में कभी खत्म नहीं होते हैं, क्योंकि मुझे जो भी देखने को मिलता है, वह यह है कि एप्लीकेशन SYN- पैकेट को फिर से तैयार कर रहा है, हालाँकि SYN- ACK पहले से ही प्राप्त किया गया था।

तो मैंने सोचा, शायद मुझे आने वाले पते को भी फिर से लिखना होगा:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

लेकिन वह भी काम नहीं किया। इसलिए मैं यहां फंस गया हूं। कोई सुझाव?

जवाबों:


24

तुम पास हो।

वास्तविक कारण यह है कि एप्लिकेशन को रिटर्न ट्रैफ़िक दिखाई नहीं दे रहा है क्योंकि कर्नेल का आईपी स्पूफिंग सुरक्षा में बनाया गया है। यानी, वापसी यातायात रूटिंग टेबल से मेल नहीं खाता है और इसलिए इसे छोड़ दिया गया है। आप इस तरह से स्पूफिंग सुरक्षा को बंद करके इसे ठीक कर सकते हैं:

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

लेकिन मैं इसकी सिफारिश नहीं करूंगा। अधिक उचित तरीका एक वैकल्पिक रूटिंग इंस्टेंस बनाना है।

  1. निशान जरूरी है। इसे रखें।
  2. स्रोत NAT भी आवश्यक है।
  3. अंतिम DNAT अनावश्यक है, इसलिए आप इसे हटा सकते हैं।

सुनिश्चित करें कि आपके पास iprouteपैकेज स्थापित है। यदि आपके पास ipकमांड है तो आप सेट हो गए हैं (जो ऐसा लगता है जैसे आप करते हैं, लेकिन यदि वह पहले नहीं मिलता है)।

संपादित करें /etc/iproute2/rt_tablesऔर निम्न पंक्ति जोड़कर एक नई तालिका जोड़ें:

200 wlan-route

फिर आपको wlan-routeएक डिफ़ॉल्ट गेटवे के साथ अपनी नई रूटिंग तालिका को कॉन्फ़िगर करने और उस तालिका में सशर्त रूप से ट्रैफ़िक भेजने के लिए नियम बनाने की आवश्यकता है। मुझे लगता है कि आपका डिफ़ॉल्ट गेटवे 192.168.0.1 है। स्वाभाविक रूप से यह आपके वास्तविक नेटवर्क से मेल खाने की जरूरत है, न कि सिर्फ मेरी धारणाओं की।

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

आपकी अंतिम एनोटेट स्क्रिप्ट इस तरह दिखाई देगी:

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

इस पर गौर करने के लिए समय देने के लिए धन्यवाद। हालाँकि, यह पहले से ही मैं क्या उपयोग कर रहा था, (जैसा कि अन्य प्रश्न में वर्णित है) इसलिए मेरे पास अतिरिक्त मार्ग स्थापित है, लेकिन यह अभी भी वैसा ही है। SYN-ACKs 192.168.0.2 पर वापस आ जाते हैं, लेकिन जाहिरा तौर पर कभी आवेदन तक नहीं पहुंचते हैं।
रैंपेल

वापस जाओ और मेरे उत्तर को फिर से पढ़ो। मैंने उसे संबोधित किया।
bahamat

स्पूफिंग सुरक्षा के बारे में हिस्सा? कोशिश करने के बाद भी कोई बदलाव नहीं हुआ। क्षमा करें, इसे एक-दो बार आगे पढ़ें, लेकिन अभी तक वह नहीं मिला जो मुझे याद आ रहा है।
रैंपेल

आपको सही स्रोत पता निर्दिष्ट srcकरने के लिए ip routeआदेशों में एक विकल्प जोड़ने की आवश्यकता है ।
डेविड श्वार्ट्ज

@DavidSchwartz: इस POSTROUTING SNATबात का ध्यान रखेगा।
bahamat

8

बहमट का हल सही है; हालाँकि, कृपया ध्यान दें कि इस काम को करने का एकमात्र तरीका सिस्टम में प्रत्येक इंटरफ़ेस के लिए rp_filter को अक्षम करना था, नॉटिंग में शामिल दो (eth1 और wlan0) न केवल दो।

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(इस पृष्ठ के अंत में महत्वपूर्ण नोट देखें: उन्नत रूटिंग हाउटो - वहां पोस्ट किया गया लिंक अब मौजूद नहीं है, लेकिन मैंने इसे वेकबैक मशीन के माध्यम से पाया)


इस उत्तर के लिए धन्यवाद, मैं भी केवल bahamats समाधान प्राप्त कर सकते हैं अपने जवाब पर विचार कर काम कर रहे।
डायलाटन

मेरे लिए एक काफी मानक ubuntu 12.04 LTS बॉक्स पर, इसके अलावा rp_filter और फ्लशिंग रूट कैश को अक्षम करने के लिए मुझे iptables तर्कों से इंटरफ़ेस नाम भी निकालना पड़ा। जांच करने के लिए पर्याप्त समय क्यों नहीं था।
कॉस्टिन गुआ

0

एक सुझाव: आपको हमेशा आउटपुट श्रृंखला के --sportबजाय उपयोग करना चाहिए --dport

NAT में परिवर्तन होता है dportऔर यह आपके नियम को अनुपयुक्त बना देगा।


2
क्या मुझे कुछ नहीं मिल रहा है? गंतव्य पोर्ट के रूप में dport, परिवर्तित नहीं हो सकता। यह उस सेवा का बंदरगाह है जिसे सत्र तक पहुँचने की कोशिश की जा रही है, जैसे http, ssh, smtp। या तो आप खेल और भ्रमित हो गए, या मुझे कुछ स्पष्ट याद आ रहा है। : पी
कोई

0

मुझे लगता है कि नीचे की आवश्यकता है:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.