iptables - নির্দিষ্ট ইন্টারফেসে প্যাকেট রুট করার লক্ষ্য?


25

আমার হোম সার্ভারের দুটি প্রধান ইন্টারফেস রয়েছে eth1(একটি মানক ইন্টারনেট সংযোগ) এবং tun0(একটি ওপেনভিপিএন টানেল)। আমি iptablesইউআইডি 1002 এর মালিকানাধীন স্থানীয় প্রক্রিয়া দ্বারা উত্পন্ন সমস্ত প্যাকেটগুলি বাইরে বেরিয়ে আসতে tun0এবং অন্য সমস্ত প্যাকেটগুলি বাইরে বেরিয়ে আসতে বাধ্য করতে চাই eth1

আমি সহজেই ম্যাচ করা প্যাকেটগুলি চিহ্নিত করতে পারি:

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

এখন, আমি পোস্টারুটিং চেইনে (সম্ভবত মঙ্গলের টেবিলের) কিছু নিয়ম রাখতে চাই যাতে ১১ টি চিহ্নিত প্যাকেটগুলি মেলে এবং তাদের পাঠানো হয় 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

সম্পাদনা: আমি কিছু বাছাইয়ের কাজ করেছি, তবে এটি চিহ্নিত প্যাকেটগুলি টিউনটিতে ফরোয়ার্ড করছে না। মূলত, আমি একটি সারণী (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উত্সের ঠিকানাটি সেট করার জন্য আমারও টেবিলের POSTROUTING চেইনে একটি মাস্কেরড নিয়ম দরকার need তবে, OUTPUT এর ম্যাঙ্গেলের পরে পুনঃ-রাউটিংটি সঠিকভাবে কাজ করছে না।

আমি এখন এটিতে 5 ঘন্টা অতিবাহিত করেছি, তাই আমি একটি বিরতি নিচ্ছি এবং সম্ভবত আজকের রাতের পরে বা আগামীকাল কোনও দিন এটিতে ফিরে আসব।

উত্তর:


26

আমি সামান্য কিছু ভিন্ন হলেও সাম্প্রতিক ইস্যুতে আঘাত করেছি। ডিফল্ট ইন্টারফেসের মাধ্যমে অন্যান্য সমস্ত ট্র্যাফিক (এমনকি একই হোস্টের জন্য) রাউটিং করার সময় আমি কেবল একটি ওসিপিভিএন ট্যাপ0 ইন্টারফেসের মাধ্যমে কেবলমাত্র টিসিপি পোর্ট 25 (এসএমটিপি) রুট করতে চেয়েছিলাম ।

এটি করতে, আমাকে প্যাকেটগুলি চিহ্নিত করতে হয়েছিল এবং এটি পরিচালনা করার জন্য বিধিগুলি সেট আপ করতে হয়েছিল। প্রথমে একটি নিয়ম যুক্ত করুন যা কার্নেল রুট প্যাকেটগুলি 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/Docamentation/networking/ip-sysctl.txt2 অনুসারে এটি আরও ভাল পছন্দ বলে মনে হচ্ছে । আপনি যদি এড়িয়ে যান তবে প্যাকেটগুলি পাবেন (এটি ব্যবহারের মাধ্যমে নিশ্চিত হওয়া যায় ) তবে প্যাকেটগুলি গ্রহণ করা হয় না। প্যাকেট গ্রহণ করা হবে যাতে সেটিংস পরিবর্তন করার আদেশ:tcpdump -i tap0 -n

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

কেন আপনি মাস্কেরডের পরিবর্তে এসএনএটি ব্যবহার করবেন? "রানটাইম" এ ইন্টারফেস থেকে আইপি ঠিকানা সংগ্রহ না করা এবং কনফিগার ফাইলে হার্ডকোড না করা ব্যতীত মাস্কেরাদে কি একই কাজ করে না?
ইথান

6
@ ইথান থেকে man iptables: এটি কেবলমাত্র ডায়নামিকভাবে নির্ধারিত আইপি (ডায়ালআপ) সংযোগের সাথে ব্যবহার করা উচিত: আপনার যদি স্থির আইপি ঠিকানা থাকে তবে আপনার এসএনএটি লক্ষ্য ব্যবহার করা উচিত। প্যাকেটটি যে ইন্টারফেসটি বের হচ্ছে তার আইপি ঠিকানায় ম্যাপিং নির্দিষ্টকরণের সমান, তবে ইন্টারফেসটি নীচে গেলে সংযোগগুলি ভুলে যাওয়ার বিষয়টিও কার্যকর হয়। আপনি ঠিক বলেছেন, তবে যেহেতু আমার আইপি কখনই পরিবর্তন হবে না, তাই আমি ম্যানপেজ দ্বারা সুপারিশ অনুযায়ী এসএনএটি ব্যবহার করার সিদ্ধান্ত নিয়েছি।
লেকেনস্টেইন

আমি মনে করি (যদিও এটি পরীক্ষা করা হয়নি) শেষ ধাপ (বিপরীত পাথ উত্সের বৈধতা) প্রয়োজনীয় নয়। আপনি কেবল সঠিক উত্স ঠিকানার (আপনার ডিফল্ট গেটওয়ে অনুসারে) PREROUTINGশৃঙ্খলে আরও একটি নিয়ম যুক্ত করতে DNATপারেন।
ক্রিশ্চিয়ান ওল্ফ

7

আমি এই সমাধান। ইস্যু টেবিল 11. ছক 11 রাউটিং নিয়ম ছিল ছিল হিট পেয়ে, কিন্তু রাউটিং নিয়ম এটা অস্ত্রোপচারের উপযোগী নয় এমন ভুলবেন না। এই স্ক্রিপ্টটি আমি এখন ব্যবহার করছি এবং এটি ভালভাবে কাজ করছে বলে মনে হচ্ছে (যদিও এটি আমার সেটআপের জন্য স্পষ্টত নির্দিষ্ট)। এছাড়াও, আমি একটি নতুন টেবিল তৈরি করেছি মূল আপলিংকের (এথ 1) নিবেদিত।

# 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

## ম্যান্ডারিংকোড সম্পাদনা (কারণ আমি মন্তব্য করতে পারি না, এখনও)

এই উত্তরের জন্য ধন্যবাদ! দেখে মনে হচ্ছে এটি অগোছালো হয়ে যেতে পারে, যেহেতু আপনাকে এখানে রুটের তথ্য বজায় রাখতে হবে (সম্ভবত নকল করা বা অন্য কোনও জিনিস যা রাস্তা নির্ধারণ করতে চায় তা ভঙ্গ করতে পারে।

আপনি ওপেনভিপিএন থেকে আপনার রাউটিং টেবিলের "অদ্ভুত জিনিস" অনুভব করতে পারেন কারণ সার্ভারটি "বেয়ার" ইন্টারনেটের পরিবর্তে ভিপিএন নেটওয়ার্ক ইন্টারফেসের মাধ্যমে সমস্ত ট্র্যাফিককে রুটে "ধাক্কা" দেওয়ার জন্য কনফিগার করা হয়েছে। অথবা আপনার ওপেনভিপিএন কনফিগারেশন বা যে কোনও স্ক্রিপ্ট / অ্যাপ্লিকেশন সেট আপ করে তা রুটগুলি সেট করে।

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

চিয়ার্স!


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কীওয়ার্ডটি রেখে যাওয়ার মতো একই প্রভাব ফেলেছে বলে মনে হচ্ছে ।
ইথান

অপশনগুলি অপসারণ করতে আপনি টিউন 0 এ প্যাকেট ক্যাপচার করার চেষ্টা করতে পারেন এবং দেখুন প্যাকেটগুলি সেই ইন্টারফেসে শেষ হচ্ছে কিনা। tcpdump -i tun0 .. বিকল্প হিসাবে, আপনার ব্যবহারকারীর আইডিতে এটি ভিত্তি করা দরকার? আপনি কেবল গন্তব্য আইপি ঠিকানার ভিত্তিতে এটি করতে পারেন (সহজ)? রুট যোগ করুন <দূরবর্তী হোস্ট> 10.32.0.49 এর মাধ্যমে
এমফারভার

গন্তব্য আইপি ঠিকানাটি বন্ধ থাকলে আমি বেস করতে পারি না - এর মধ্যে অনেকগুলি থাকবে। আমি তাত্ত্বিকভাবে এটি পিডের বাইরেও স্থাপন করতে পারি, তবে এটি আরও জটিল, কারণ ডেমন (গুলি) শুরু না হওয়া পর্যন্ত আমি পিডটি জানব না।
ইথান

0

এটি iptables কমান্ড ছাড়াই করা যায় সহজ আইপি কমান্ড চালান ute

Uid 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
ক্যাস্পারড

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