iptables - विशिष्ट इंटरफ़ेस के लिए रूट पैकेट पर लक्ष्य?


25

मेरे होम सर्वर में दो मुख्य इंटरफेस हैं, eth1(एक मानक इंटरनेट कनेक्शन) और tun0(एक ओपनवीपीएन सुरंग)। मैं iptablesयूआईडी 1002 के स्वामित्व वाली एक स्थानीय प्रक्रिया द्वारा उत्पन्न सभी पैकेटों के माध्यम से बाहर निकलने के लिए tun0, और अन्य सभी पैकेटों के माध्यम से बाहर निकलने के लिए उपयोग करना चाहता हूं eth1

मैं आसानी से मिलान पैकेट को चिह्नित कर सकता हूं:

iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11

अब, मैं 11 के साथ चिह्नित पैकेटों से मिलान करने के लिए POSTROUTING श्रृंखला (संभवत: टेबल के लिए संभवत:) में कुछ नियम रखना चाहता हूं tun0, इसके बाद एक नियम है, जो सभी पैकेटों से मेल खाता है और उन्हें भेजता है eth1

मुझे लक्ष्य लक्ष्य मिला, लेकिन यह केवल स्रोत इंटरफ़ेस को फिर से लिखने के लिए लगता है (जब तक कि मैं इसे गलत तरीके से नहीं पढ़ रहा हूं)।

क्या iptables इसके लिए सक्षम है? क्या मुझे इसके बजाय रूटिंग टेबल (इसके माध्यम से ip routeया सिर्फ विरासत routeकमांड) के साथ गड़बड़ करना है?

संपादित करें: मैंने सोचा कि शायद मुझे अधिक जानकारी प्रदान करनी चाहिए। मेरे पास वर्तमान में कोई अन्य iptables नियम नहीं हैं (हालांकि मैं भविष्य में असंबंधित कार्यों को करने के लिए कुछ नियम बना सकता हूं)। इसके अलावा, का उत्पादन ip routeहै:

default via 192.168.1.254 dev eth1  metric 203
10.32.0.49 dev tun0  proto kernel  scope link  src 10.32.0.50
85.17.27.71 via 192.168.1.254 dev eth1
192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.73  metric 203

मैंने रूटिंग टेबल को नहीं छुआ है - यह वर्तमान में कैसा है (हालांकि यह काफी गंदा दिखता है)। मुझे क्षमा करें, लेकिन मेरे पास routeइस मशीन पर स्थापित विरासत आदेश नहीं है ।

और निश्चित रूप से आउटपुट ip addr, eth0 और eth2 को नजरअंदाज किया जा सकता है - वे एनआईसी हैं जिनका उपयोग वर्तमान में नहीं किया जा रहा है:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 1c:6f:65:2a:73:3f brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast     state UP qlen 1000
    link/ether 00:1b:21:9d:4e:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.73/24 brd 192.168.1.255 scope global eth1
    inet6 fe80::21b:21ff:fe9d:4ebb/64 scope link
       valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:1b:21:6a:c0:4b brd ff:ff:ff:ff:ff:ff
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc     pfifo_fast state UNKNOWN qlen 100
    link/none
    inet 10.32.0.50 peer 10.32.0.49/32 scope global tun0

संपादित करें: मैंने कुछ काम कर लिया है, लेकिन यह चिन्हित पैकेटों को टू0 पर अग्रेषित नहीं कर रहा है। असल में, मैंने एक तालिका (11) जोड़ी, और इस्तेमाल की:

ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11

जब मैं बस करता हूं sudo -u user1000 wget -qO- whatismyip.org, मुझे अपने घर का बाहरी आईपी पता मिलता है, लेकिन अगर मैं करता हूं, तो मुझे sudo -u user1002 wget -qO- whatismyip.orgअपने घर का आईपी पता भी मिलता है (लेकिन मुझे ओपनवीपीएन सुरंग के दूसरे छोर पर आईपी मिलना चाहिए)।

रनिंग iptables -vLयह पुष्टि करता है कि पैकेट अंकन नियम से मेल खा रहे हैं, लेकिन वे रूटिंग नियम का पालन नहीं करते हैं।

संपादित करें: मैंने इस पर एक लंबा समय बिताया है, और हालांकि यह अभी भी काम नहीं करता है, मुझे लगता है कि मैं थोड़ा करीब हूं।

Iptables नियम को mangleतालिका की OUTPUT श्रृंखला में होना चाहिए । मुझे लगता है कि मुझे natस्रोत का पता सेट करने के लिए तालिका की पोस्टिंग श्रृंखला में एक मास्टर नियम की भी आवश्यकता है । हालाँकि, OUTPUT के मैनल के बाद होने वाली री-रूटिंग सही तरीके से काम नहीं कर रही है।

मैंने अब इस पर 5 घंटे बिताए हैं, इसलिए मैं एक ब्रेक ले रहा हूं और शायद आज रात या कल कुछ समय बाद वापस आऊंगा।

जवाबों:


26

मैंने हाल ही में एक समान मुद्दा मारा है, भले ही थोड़ा अलग हो। मैं एक OpenVPN tap0 इंटरफ़ेस पर केवल TCP पोर्ट 25 (SMTP) को रूट करना चाहता था , जबकि डिफ़ॉल्ट इंटरफ़ेस पर अन्य सभी ट्रैफ़िक (समान होस्ट के लिए) को रूट कर रहा था ।

ऐसा करने के लिए, मुझे पैकेट को चिह्नित करना था और इसे संभालने के लिए नियम स्थापित करने थे। सबसे पहले, एक नियम जोड़ें जो कर्नेल रूट पैकेट 2को तालिका के माध्यम से चिह्नित करता है 3(बाद में समझाया गया है):

ip rule add fwmark 2 table 3

आप एक प्रतीकात्मक नाम जोड़ सकते थे /etc/iproute2/rt_tables, लेकिन मैंने ऐसा करने की जहमत नहीं उठाई। संख्या 2और 3बेतरतीब ढंग से चुनी जाती है। वास्तव में, ये एक ही हो सकते हैं लेकिन स्पष्टता के लिए मैंने इसे इस उदाहरण में नहीं किया है (हालांकि मैं इसे अपने सेटअप में करता हूं)।

एक अलग इंटरफ़ेस पर यातायात को पुनर्निर्देशित करने के लिए एक मार्ग जोड़ें, यह मानते हुए कि प्रवेश द्वार है 10.0.0.1:

ip route add default via 10.0.0.1 table 3

बहोत महत्वपूर्ण! अपना रूटिंग कैश फ्लश करें, अन्यथा आपको कोई प्रतिक्रिया वापस नहीं मिलेगी और कुछ घंटों के लिए अपने बालों में हाथ रखकर बैठेंगे:

ip route flush cache

अब, नामित पैकेटों को चिह्नित करने के लिए एक फ़ायरवॉल नियम निर्धारित करें:

iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2

उपरोक्त नियम केवल तभी लागू होता है जब पैकेट स्थानीय मशीन से आते हैं। देखें http://inai.de/images/nf-packet-flow.png । अपनी आवश्यकताओं के लिए इसे समायोजित करें। उदाहरण के लिए, यदि आप tap0इंटरफ़ेस पर केवल जावक HTTP ट्रैफ़िक को रूट करना चाहते हैं, तो 465 से 80 को बदल दें।

tap0स्रोत आईपी के रूप में अपना लैन पता प्राप्त करने से पहले भेजे गए पैकेट को रोकने के लिए , इसे अपने इंटरफ़ेस पते में बदलने के लिए निम्नलिखित नियम का उपयोग करें ( 10.0.0.2इंटरफ़ेस के लिए आईपी पते के रूप में tap0)

iptables -t nat -A POSTROUTING -o tap0 -j SNAT --to-source 10.0.0.2

अंत में, रिवर्स पाथ सोर्स वेलिडेशन को आराम दें। कुछ लोग आपको इसे सेट करने के लिए सुझाव देते हैं 0, लेकिन https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt के2 अनुसार बेहतर विकल्प लगता है । यदि आप इसे छोड़ देते हैं, तो आपको पैकेट प्राप्त होंगे (इसका उपयोग करके पुष्टि की जा सकती है ), लेकिन पैकेट स्वीकार नहीं किए जाते हैं। सेटिंग बदलने के लिए आदेश स्वीकार किए जाते हैं इसलिए पैकेट स्वीकार किए जाते हैं:tcpdump -i tap0 -n

sysctl -w net.ipv4.conf.tap0.rp_filter=2

आप MASQUERADE के बजाय SNAT का उपयोग क्यों करते हैं? क्या MASQUERADE एक ही काम नहीं करता है, सिवाय इसके कि आईपी एड्रेस को "रनटाइम" पर इंटरफेस से इकट्ठा किया जाए और कॉन्फिग फाइल में हार्डकोड न किया जाए?
एथन

6
@ ईथन फ्रॉम man iptables: इसका उपयोग केवल डायनामिक रूप से असाइन किए गए आईपी (डायलअप) कनेक्शन के साथ किया जाना चाहिए: यदि आपके पास एक स्थिर आईपी पता है, तो आपको एसएनएटी लक्ष्य का उपयोग करना चाहिए। संदेशवाहक इंटरफ़ेस के आईपी पते पर एक मैपिंग निर्दिष्ट करने के बराबर है पैकेट बाहर जा रहा है, लेकिन यह भी प्रभाव पड़ता है कि इंटरफ़ेस के नीचे जाने पर कनेक्शन भूल जाते हैं। आप सही हैं, लेकिन चूंकि मेरा आईपी कभी नहीं बदलेगा, इसलिए मैंने मैनपेज द्वारा एसएनएटी की सिफारिश का उपयोग करने का फैसला किया।
लेकेनस्टाइन

मुझे लगता है (हालांकि परीक्षण नहीं किया गया) अंतिम चरण (रिवर्स पाथ सोर्स वेलिडेशन) आवश्यक नहीं है। आप सही स्रोत पते (अपने डिफ़ॉल्ट गेटवे के अनुसार) में PREROUTINGश्रृंखला में एक और नियम जोड़ सकते हैं DNAT
ईसाई वुल्फ

7

मैंने इसका हल निकाला। यह समस्या तालिका 11 में रूटिंग नियमों के साथ थी। तालिका 11 हिट हो रही थी , लेकिन रूटिंग नियम इसे अक्षम बनाते हैं। यह स्क्रिप्ट अब मैं उपयोग करता हूं, और यह अच्छी तरह से काम करने लगता है (हालांकि यह स्पष्ट रूप से मेरे सेटअप के लिए विशिष्ट है)। इसके अलावा, मैंने मुख्य अपलिंक (eth1) के लिए समर्पित एक नई तालिका 21 बनाई।

# Add relevant iptables entries.
iptables -t mangle -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# Flush ALL THE THINGS.
ip route flush table main
ip route flush table 11
ip route flush table 21
ip rule flush

# Restore the basic rules and add our own.
ip rule add lookup default priority 32767
ip rule add lookup main priority 32766
ip rule add fwmark 11 priority 1000 table 11
# This next rule basically sends all other traffic down eth1.
ip rule add priority 2000 table 21

# Restore the main table.  I flushed it because OpenVPN does weird things to it.
ip route add 127.0.0.0/8 via 127.0.0.1 dev lo
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.73
ip route add default via 192.168.1.254

# Set up table 21.  This sends all traffic to eth1.
ip route add 192.168.1.0/24 dev eth1 table 21
ip route add default via 192.168.1.254 dev eth1 table 21

# Set up table 11.  I honestly don't know why 'default' won't work, or
# why the second line here is needed.  But it works this way.
ip route add 10.32.0.49/32 dev tun0 table 11
ip route add 10.32.0.1 via 10.32.0.50 dev tun0 table 11
ip route add 0.0.0.0/1 via 10.32.0.50 dev tun0 table 11

ip route flush cache

## MeanderingCode संपादित करें (क्योंकि मैं टिप्पणी नहीं कर सकता, फिर भी)

इस उत्तर के लिए धन्यवाद! ऐसा लगता है जैसे यह गड़बड़ हो सकता है, क्योंकि आपको यहां रूट की जानकारी को बनाए रखना होगा (संभवतः नकल करना, या अन्य चीजों को तोड़ना जो रूट सेट करना चाह सकते हैं।

आप OpenVPN से अपनी रूटिंग टेबल में "अजीब चीजों" का अनुभव कर रहे होंगे क्योंकि सर्वर "पुश" मार्गों से कॉन्फ़िगर किया गया है, जो "नंगे" इंटरनेट के बजाय वीपीएन नेटवर्क इंटरफ़ेस के माध्यम से मार्ग में सभी ट्रैफ़िक को सक्षम करता है। या आपका OpenVPN कॉन्फिगरेशन या जो भी स्क्रिप्ट / एप्लिकेशन सेट करता है वह रूट सेट कर रहा है।

पूर्व के मामले में, आप अपने OpenVPN विन्यास को संपादित करने और युक्त "मार्ग-nopull" एक लाइन में डाल सकते हैं
(कई मौजूदा लिनक्स डेस्कटॉप distros पर नेटवर्क-प्रबंधक-OpenVPN, उदाहरण के लिए) OpenVPN या किसी आवरण के लिए बाद, जांच विन्यास में
में या तो मामले में, रूटिंग कॉन्फ़िगरेशन को समाप्त करना जहां यह सेट हो रहा है, टेबल को फ्लश करने की तुलना में क्लीनर और सुरक्षित है, इस पर निर्भर करता है कि आप इस स्क्रिप्ट को कब चलाते हैं और आपका सिस्टम क्या कर रहा है।

चीयर्स!


2

मुझे लगता है कि आप चाहते हैं:

/sbin/ip route add default via 10.32.0.49 dev tun0 table 11
/sbin/ip rule add priority 10000 fwmark 11 table 11

http://lartc.org/howto/lartc.netfilter.html

लेकिन मैंने ऊपर परीक्षण नहीं किया है।


पहला कमांड "एरर: या तो" टू "डुप्लिकेट है, या" 10.32.0.49 "एक कचरा है।"
एथन

क्षमा करें डिफ़ॉल्ट और आईपी के बीच के माध्यम से भूल गए।
mfarver

मैं इसे करने की कोशिश की। यह defaultकीवर्ड को छोड़ने के समान ही प्रभाव डालता है।
ईथन

विकल्पों को समाप्त करने के लिए आप tun0 पर एक पैकेट कैप्चर करने की कोशिश कर सकते हैं, और देखें कि पैकेट उस इंटरफ़ेस पर समाप्त हो रहे हैं या नहीं। tcpdump -i tun0 .. वैकल्पिक रूप से, क्या आपको उपयोगकर्ता आईडी पर आधार बनाने की आवश्यकता है? क्या आप इसे गंतव्य आईपी पते (आसान) के आधार पर कर सकते हैं? मार्ग जोड़ <रिमोट होस्ट> 10.32.0.49 के माध्यम से
mfarver

मैं आधार नहीं कर सकता अगर गंतव्य आईपी पता बंद हो - उनमें से कई होंगे। मैं भी सैद्धांतिक रूप से इसे बंद कर सकता था, लेकिन यह और भी कठिन है, क्योंकि मुझे तब तक पता नहीं चलेगा जब तक डेमॉन (ओं) की शुरुआत नहीं हो जाती।
एथन

0

यह iptables कमांड के बिना किया जा सकता है सरल IP कमांड निष्पादित करें

यूआईडी 1002 के लिए:

ip rule add uidrange 1002-1002 table 502

इंटरफ़ेस के लिए तालिका 502 पर डिफ़ॉल्ट मार्ग जोड़ें जो आप कहना चाहते हैं

eth0 ip rule add default via a.b.c.d dev eth0

मैंने उस कमांड का परीक्षण किया, और यह काम नहीं किया:Error: argument "uidrange" is wrong: Failed to parse rule type
kasperd

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