লিনাক্সে কীভাবে সমস্ত ট্র্যাফিককে একটি ইন্টারফেসের মধ্য দিয়ে যায়


12

আমার কাছে একটি স্ব-লিখিত ইন্টারফেস টিউন ( টিউএন / ট্যাপ ভিত্তিক) রয়েছে যা এটি গ্রহণ করে।
এই ইন্টারফেসটি দিয়ে প্রবাহিত করতে আমার সিস্টেমের সমস্ত ট্র্যাফিক দরকার।
ইন্টারফেসের ভূমিকাটি হ'ল:

  1. সেন্সর করা প্যাকেটগুলি বের করার জন্য এবং তাদের সুড়ঙ্গ করার সম্ভাবনা রয়েছে।
  2. অন্য সমস্ত ট্র্যাফিক অচেতনভাবে পাস করুন।

আপনি যেমন অনুমান করছেন আমি একটি অ্যান্টিচেসার সরঞ্জাম তৈরি করার চেষ্টা করছি।
টানেল প্রক্রিয়া সম্পর্কে সিদ্ধান্ত অবশ্যই টিউন প্রক্রিয়াটির মধ্যে নেওয়া উচিত
কারণ কেবলমাত্র আমরা সেখানে বিশ্বস্ত ডিএনএস ব্যবহার করতে পারি।

স্ব-লিখিত ইন্টারফেস টিউন-এর মাধ্যমে কীভাবে সমস্ত ট্র্যাফিক প্রবাহ করা যায় তা আমাকে দেখানোর জন্য আমার আপনার সহায়তা দরকার। যদি টিউনটির পরিবর্তনের দরকার হয় তবে আমি আপনাকে এই জাতীয় পরিবর্তনগুলি সরবরাহ করতে বলি।

নীচে আমি সমস্ত ট্র্যাফিক টিউন এবং ব্যর্থ হয়ে যাওয়ার চেষ্টা করেছি (পিংস ব্যর্থ)।

কম্পাইল

  1. gcc tun0.c
  2. sudo ./a.out

কনফিগার করার পদ্ধতি

  1. sudo ip addr add 10.0.0.1/24 dev tun0
  2. টেবিল তৈরি করুন জন

    $ cat /etc/iproute2/rt_tables 
    #
    # reserved values
    #
    255     local
    254     main
    253     default
    0       unspec
    #
    # local
    #
    #1      inr.ruhep
    
    200 John
    

অর্ডার গুরুত্বপূর্ণ:

  1. sudo ip rule add from all lookup John
  2. sudo ip route add default dev tun0 table John
  3. sudo ip rule add iif tun0 lookup main priority 500

    $ ip rule
    0:      from all lookup local 
    500:    from all iif tun0 lookup main 
    32765:  from all lookup John 
    32766:  from all lookup main 
    35000:  from all lookup default 
    

সমস্যা সমাধান

  1. sudo tcpdump -i wlp2s0 -qtln icmpএবং তারপরে ping -I tun0 8.8.8.8কোনও প্যাকেট ধরা পড়ে না, এর অর্থ কোনও প্যাকেট টিউন 0 থেকে ডাব্লুএলপি 2 এস 0 তে নিয়মের মাধ্যমে প্রেরণ করা হয় না iif tun0 lookup main

  2. আমি যখন প্রতিস্থাপিত tun0সঙ্গে loসর্বত্র তারপর এটা আমার জন্য কাজ করেন।

চেষ্টাও করেছেন

  1. বিপরীত পথ ফিল্টারিং বন্ধ করা হচ্ছে, rp_filter=0ইন/etc/sysctl.conf

উত্তর সমস্যা সমাধান

iptables -I FORWARD -j LOG --log-prefix "filter/FORWARD " 
iptables -t nat -I OUTPUT -j LOG --log-prefix "nat/OUTPUT " 
iptables -t nat -I PREROUTING -j LOG --log-prefix "nat/PREROUTING " 
iptables -t nat -I POSTROUTING -j LOG --log-prefix "nat/POSTROUTNG "
tail -f /var/log/syslog

উত্তর থেকে পরিবর্তিত উত্স এছাড়াও এখানে

উত্তর:


10

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

sysctl -w net.ipv4.ip_forward=1

এর পর, যদি আপনি তাকান করব tcpdumpজন্য wlp2s0আপনি কি লক্ষ্য করতে প্যাকেট উৎস ঠিকানা দিয়ে ছেড়ে 10.0.0.1এবং WLAN ইন্টারফেসের উৎস ঠিকানা না (আপনি আশা কি আমি অনুমান)। সুতরাং আমাদের উত্স ঠিকানা পরিবর্তন করতে হবে এবং এটিকে উত্স NAT বলা হয় । লিনাক্সে নেটফিল্টার / iptables এর সাহায্যে এটি সহজ :

iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.1 -j MASQUERADE

আপনার FORWARDচেইনের ACCEPTনীতি রয়েছে কিনা তাও পরীক্ষা করে দেখুন বা আপনাকে এমন কিছু দিয়ে ফরোয়ার্ড করার অনুমতি দেওয়া দরকার :

iptables -A FORWARD -i tun0 -o wlp2s0 -s 10.0.0.1 -j ACCEPT
iptables -A FORWARD -i wlp2s0 -o tun0 -d 10.0.0.1 -j ACCEPT

সবকিছু এখনই কাজ করা উচিত: লিনাক্স কার্নেল রাউটিং করে, এটি প্যাকেটগুলি tun0ইন্টারফেস থেকে সরানো হয় wlp2s0নেটফিল্টারটি আউটপুট প্যাকেটের জন্য 10.0.0.1আপনার wlp2s0ইন্টারফেসের নির্ধারিত ঠিকানায় উত্স আইপি পরিবর্তন করতে হবে । এটি সমস্ত সংযোগ মুখস্থ করে এবং যখন উত্তর প্যাকেটগুলি ফিরে যায় (যদি তারা) এটি wlp2s0ইন্টারফেসের জন্য নির্ধারিত ঠিকানার গন্তব্য ঠিকানা পরিবর্তন করে 10.0.0.1("কনট্র্যাক" বৈশিষ্ট্য)।
ঠিক আছে, এটা করা উচিত কিন্তু তা না। দেখে মনে হচ্ছে, নেটফিল্টার এই জটিল রাউটিং কনফিগারেশনের সাথে বিভ্রান্ত হয়ে পড়েছে এবং একই প্যাকেটটি প্রথমে OUTPUTচেইনের মধ্য দিয়ে যায় এবং পরে রাউটে পরিণত হয় এবং PREROUTINGচেইনে আসে । কমপক্ষে ডেবিয়ান 8 বাক্সে এটি কাজ করে না।
নেটফিল্টার সমস্যা সমাধানের সর্বোত্তম উপায় হ'ল TRACEবৈশিষ্ট্য:

modprobe ipt_LOG
iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE

আমি কেবল আইসিএমপি প্যাকেটের জন্য ট্রেসিং সক্ষম করেছি, আপনি ডিবাগ করতে অন্য ফিল্টারটি ব্যবহার করতে পারেন।
এটি প্যাকেটটি কী টেবিলগুলি এবং চেইনগুলির মধ্য দিয়ে যায় তা দেখায়। এবং আমি দেখতে পাচ্ছি যে প্যাকেটটি আর FORWARDচেইন ছাড়েনি (এবং এটি nat/POSTROUTINGআসলে চেইন দ্বারা ধরা পড়ছে না SNAT)।
এই কাজটি করার জন্য নীচে কয়েকটি পদ্ধতি রয়েছে।

আবেদন # 1

নেটফিল্টার আন-বিভ্রান্ত করার সর্বোত্তম উপায় হ'ল tun0.cঅ্যাপ্লিকেশনটিতে প্যাকেটের উত্স আইপি ঠিকানা পরিবর্তন করা। এটিও সবচেয়ে প্রাকৃতিক উপায়। আমাদের বাহিরের পথে 10.0.0.1 থেকে 10.0.0.2 এবং ফেরার পথে 10.0.0.2 থেকে 10.0.0.1 এ পরিবর্তন করতে হবে।
আমি tun0.cউত্স ঠিকানা পরিবর্তন কোড দিয়ে পরিবর্তন করেছি । এখানে নতুন ফাইল এবং এখানে patchfile হয় আপনার জন্য tun0.c। আইপি শিরোলেখের পরিবর্তনগুলিতে চেকসাম সংশোধনও জড়িত , তাই আমি ওপেনভিপিএন প্রকল্প থেকে কিছু কোড নিয়েছি । ক্লিন রিবুট এবং tun0_changeip.cলঞ্চের পরে আমি সম্পাদন করা কমান্ডগুলির সম্পূর্ণ তালিকা এখানে রয়েছে :

ifconfig tun0 inet 10.0.0.1/30 up
sysctl -w net.ipv4.ip_forward=1
ip route add default dev tun0 table John
ip rule add from all lookup John
ip rule add from 10.0.0.2 lookup main priority 500
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.2 -j MASQUERADE

দয়া করে মনে রাখবেন যে আপনাকে সেই ক্ষেত্রে বিপরীত পথ ফিল্টারিং বন্ধ করার দরকার নেই , কারণ সবকিছু বৈধ - tun0কেবল তার সাবনেটের সাথে সম্পর্কিত প্যাকেটগুলি গ্রহণ করে এবং প্রেরণ করে। এছাড়াও আপনি ইন্টারফেস-ভিত্তিক পরিবর্তে উত্স-ভিত্তিক রাউটিং করতে পারেন।

প্রচার # 2

SNATপ্যাকেট tun0ইন্টারফেসে পৌঁছানোর আগে এটি করা সম্ভব । যদিও এটি খুব সঠিক নয়। এই ক্ষেত্রে আপনাকে অবশ্যই বিপরীত পথ ফিল্টারিং বন্ধ করতে হবে :

sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0

এখন, করুন SNAT: iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT - থেকে উত্স ip.address.of.your.wlan.interface

প্যাকেটগুলি ডিভাইসে পৌঁছানোর ঠিক আগে এখানে আমরা উত্সের ঠিকানাটি পরিবর্তন করি tun0tun0.cকোডগুলি এই প্যাকেটগুলিকে "যেমন রয়েছে" (পরিবর্তিত উত্সের ঠিকানা সহ) পুনরায় পাঠান এবং সেগুলি ওয়ালান ইন্টারফেসের মাধ্যমে সফলভাবে রুটে দেওয়া হয়। তবে আপনার ওয়ালান ইন্টারফেসে একটি গতিশীল আইপি থাকতে পারে এবং ব্যবহার করতে চান MASQUERADE(ইন্টারফেসের ঠিকানাটি স্পষ্টভাবে নির্দিষ্ট না করার জন্য)। আপনি কীভাবে এটি ব্যবহার করতে পারেন তা এখানে MASQUERADE:

iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT --to-source 10.0.55.1
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.55.1 -j MASQUERADE

10.0.55.1আইপি ঠিকানাটি " " নোট করুন - এটি আলাদা। আপনি এখানে যে কোনও আইপি ব্যবহার করতে পারেন, তাতে কিছু আসে যায় না। প্যাকেটগুলি ইন্টারফেসে nat/POSTROUTINGশৃঙ্খলে পৌঁছে যায় wlp2s0যদি আমরা আগে উত্স আইপি পরিবর্তন করি। এবং এখন এটি ওয়ালান ইন্টারফেসের জন্য একটি স্ট্যাটিক আইপির উপর নির্ভর করে না।

আবেদন # 3

আপনি ব্যবহার করতে পারেন fwmark। এই ভাবে আপনি প্রয়োজন হবে না SNATকিন্তু আপনি শুধুমাত্র বহির্গামী প্যাকেট ক্যাপচার করব:
আমরা প্রথমে নিষ্ক্রিয় করতে বিপরীত পথ ফিল্টারিং জন্য tun0কারণ এটি প্যাকেট যে অন্য নেটওয়ার্ক অন্তর্গত ফরোয়ার্ড করব:

sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0

Now let's alter the routing rules a bit:
# Delete old rules
ip rule del iif tun0 lookup main
ip rule del from all lookup John

# Packets will start going from wlan interface so they will have source address of it
iptables -t mangle -A OUTPUT -o wlp2s0 -j MARK --set-mark 1
ip rule add fwmark 0x1 lookup John

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


আপনি নিজের অ্যাপ্লিকেশনটিকে স্বচ্ছ প্রক্সি হিসাবে গড়ে তুলতেও বিবেচনা করতে পারেন । আমি মনে করি টিউন ডিভাইস থেকে প্যাকেটগুলি বিশ্লেষণ করার পরিবর্তে এটি আরও সহজ হবে।


আমাকে ব্যবহার করতে হয়েছিল -j SNAT,-s SNAT
ilyaigpetrov

এটি কাজ করে তবে পারফরম্যান্স খুব মাঝে মাঝে হয় (এটি 10 ​​সেকেন্ডের জন্য স্টল করে তারপর কাজ চালিয়ে যেতে পারে)। আমি কেন এটি হয় এবং কীভাবে এটি ঠিক করতে হবে তা নির্ধারণ করতে চলেছি।
ilyaigpetrov

1
দুঃখিত এটি আমার টাইপ ছিল। আমি আমার উত্তরের সাথে আরও একটি পদ্ধতির যোগ করেছি। পারফরম্যান্স ইস্যু সম্পর্কে কোনও ধারণা নেই। যাইহোক, ট্র্যাফিকটি ফিল্টার এবং ডাইভার্ট করার জন্য iptables DNAT সহ স্বচ্ছ প্রক্সি ব্যবহার করবেন না কেন?
tifssoft

আমি আপনার চিহ্ন পদ্ধতির পুনরুত্পাদন করতে সক্ষম নই, আমি sudo ip rule add iif tun0 lookup main priority 500এটিতে কেবল যুক্ত করেছি তবে এখনও এটি কার্যকর হয়নি। আমি এই পদ্ধতির পছন্দ করি, করুণা করি যে আমি এটি পুনরুত্পাদন করতে পারি না।
iaaigpetrov

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