সুতরাং আপনার কনফিগারেশনে, আপনি যে প্যাকেটগুলি প্রথমে নেটওয়ার্কে প্রেরণের চেষ্টা করেছেন সেখান থেকে শুরু করে 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
প্যাকেটগুলি ডিভাইসে পৌঁছানোর ঠিক আগে এখানে আমরা উত্সের ঠিকানাটি পরিবর্তন করি tun0
। tun0.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