macOS-এ একটি সুরক্ষা সুইচ ঠিক ততটাই ভালো যতটা তার পেছনের প্যাকেট ফিল্টার নীতি, আর pf হলো সেই অংশ যা ওই নীতি প্রয়োগ করে। নীতিকে একসঙ্গে দুটি বিপরীত কাজ করতে হয়: ক্লায়েন্টকে তার সার্ভারে পৌঁছাতে দেওয়া যাতে একটি টানেল থাকতে পারে, এবং বাকি সবকিছুকে সরাসরি বের হতে বাধা দেওয়া। প্রকাশিত বেশিরভাগ নিয়মের সেট দ্বিতীয়টি পারে এবং প্রথমটি ভুলে যায়, তাই মেশিন সুরক্ষা পাওয়ার বদলে সংযোগ হারায়। যে সংস্করণটি কাজ করে তা শেষবিন্দু, রিজলভার ও টানেলের নাম বলে, আর কিছু নয়।

একটি প্যাকেট ফিল্টার কী সিদ্ধান্ত নিতে পারে, আর কী পারে না

pf ইন্টারফেস, ঠিকানা, প্রোটোকল নম্বর ও পোর্ট দেখে, এবং সেখানেই থামে। কোন প্রক্রিয়া একটি সকেট খুলেছে তা এটি কখনো জানে না, তাই এক প্রোগ্রামের জন্য লেখা অনুমতি একই পোর্টে পৌঁছাতে পারে এমন প্রতিটি প্রোগ্রামের অনুমতি হয়ে যায়। এভাবেই একটি উদার UDP ব্যতিক্রম সুরক্ষা সুইচকে আবার সাধারণ নেটওয়ার্কে পরিণত করে। অ্যাপ্লিকেশন-সচেতন ব্লকিং ক্লায়েন্ট বা সিস্টেম এক্সটেনশনের কাজ, এই ফাইলের নয়।

ফিল্টার রুটও তৈরি করে না। ক্লায়েন্ট পড়ে গেলে ডিফল্ট রুট এখনো একটি মৃত টানেলের দিকে ইঙ্গিত করতে পারে, এবং pf সেটিকে Wi-Fi-তে নীরব প্রত্যাবর্তনের বদলে আটকানো প্যাকেটে রূপান্তর করে। আটকানোই কাঙ্ক্ষিত ফল, ঘুরে যাওয়ার মতো ত্রুটি নয়।

ক্রম নিয়মের লেখার চেয়ে বেশি বার ফলাফল নির্ধারণ করে। quick ছাড়া pf মিলের পরেও মূল্যায়ন চালিয়ে যায় এবং শেষ মেলা নিয়ম জিতে যায়, তাই নিচের দিকের একটি প্রশস্ত পাস উপরের সতর্ক ব্যতিক্রমগুলোকে ছাড়িয়ে যায়। পাসগুলোকে quick চিহ্নিত করলে প্রথম মিলই চূড়ান্ত হয়, যা একজন নীতি লেখক সাধারণত বোঝান।

প্রথমে ইন্টারফেস ও শেষবিন্দুর তথ্য পড়ুন

প্রতিটি Mac-এ তারহীন ইন্টারফেস একইভাবে নম্বর পায় না, আর টানেল ডিভাইস এমন নম্বর পায় যা বুটের মধ্যে বদলাতে পারে। যে নিয়ম অস্তিত্বহীন ডিভাইসের নাম বলে তা পার্স করার সময় ব্যর্থ হয়, যা স্পষ্ট ও ধরা সহজ, অন্যদিকে ভুল অস্তিত্বমান ডিভাইসের নাম বলা নিয়ম পরিষ্কারভাবে পার্স হয় এবং আপনি যা থামাতে চেয়েছিলেন সেই ট্রাফিক অনুমোদন করে।

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

route -n get default
ifconfig -l
scutil --nc list

প্রথম কমান্ড বর্তমানে জেতা ইন্টারফেসের নাম বলে, দ্বিতীয়টি কার্নেলের জানা প্রতিটি ডিভাইস তালিকাভুক্ত করে, আর তৃতীয়টি সিস্টেম যে VPN কনফিগারেশন চালু করতে পারে তা দেখায়। ওই উত্তরগুলো লিখে রাখুন, তারপর ক্লায়েন্টের নিজের কনফিগারেশন থেকে সার্ভারের ঠিকানা ও পোর্ট পড়ুন।

টানেলের পথ ঘিরে নিয়মের সেট লিখুন

নিচের ফাইলটি ডিফল্টভাবে অস্বীকার করে এবং পাঁচটি জিনিস আবার অনুমোদন করে: লুপব্যাক, টানেল ডিভাইস, ক্লায়েন্টের সার্ভারে যাওয়ার পথ, টানেল তৈরির আগে ব্যবহৃত রিজলভার, এবং তারহীন লিংক ব্যবহারযোগ্য রাখা দুটি বিনিময়। ইন্টারফেসের নাম ও সার্ভারের ঠিকানা আপনার মেশিন থেকে আসে, তাই আপনি যে মান যাচাই করেছেন তা বসান। টানেলের নম্বরও আপনারটির সঙ্গে মিলবে না।

set skip on lo0
block all
pass out quick on utun0
# maintain this line when the server address changes
pass out quick on en1 inet proto udp to 203.0.113.10 port 1194
# only the resolver the client uses before the tunnel exists
pass out quick on en1 inet proto udp to 192.0.2.53 port 53
pass out quick on en1 inet proto udp from any port 68 to any port 67
pass out quick on en1 inet proto udp to 224.0.0.251 port 5353

DHCP লাইনটি আছে কারণ একটি Mac তার ঠিকানা থাকার আগেই ঠিকানা চায়, তাই অনুরোধটি 68 পোর্ট থেকে 67 পোর্টের দিকে ব্যবহারযোগ্য উৎস ঠিকানা ছাড়াই বের হয়। মাল্টিকাস্ট লাইনটি সিস্টেমকে তারহীন লিংক ব্যবহারের যোগ্য কি না বিচার করতে দেয়, আর এটি সরিয়ে দিলে এমন মেশিন তৈরি হয় যা সচল নেটওয়ার্কেও কোনো সংযোগের কথা বলে না। শেষবিন্দুর লাইনটিই OpenVPN-কে তার সার্ভারে পৌঁছাতে দেয়; এটি ছাড়া block all বাইরের হ্যান্ডশেক ফেলে দেয় এবং টানেল কখনো ওঠে না। রিজলভারের লাইনটি সাধারণ DNS অনুমতির চেয়ে সংকীর্ণ, কারণ এটি মেশিনের প্রতিটি প্রশ্নের বদলে একটি ঠিকানা ও একটি পোর্টের নাম বলে।

এই শেষবিন্দু ও রিজলভার ব্যতিক্রম দুটিই অবশ্যই থাকতে হবে; বাকি সব আটকানো থাকে। ক্লায়েন্ট আক্ষরিক ঠিকানায় ডায়াল করলে রিজলভার লাইনটি বাদ দিন এবং শেষবিন্দুর লাইনটি রাখুন। সার্ভারের ঠিকানা বদলালে পরের সংযোগের আগে ওই লাইনটি হালনাগাদ করুন, অথবা ক্লায়েন্টের নিজের হুক থেকে pf টেবিল ভরুন এবং বদলে টেবিলের সঙ্গে মেলান।

টানেল নামান, তারপর রিবুট করুন

লোড করার আগে পার্স করুন, কারণ সিনট্যাক্স ত্রুটি শুকনো চালানিতে সস্তা আর দূরবর্তী সেশনে ব্যয়বহুল। তারপর ফাইলটি লোড করুন, ফিল্টার বন্ধ থাকলে চালু করুন, এবং আসলে কী বলবৎ আছে তা ফিরে পড়ুন। ফিরে পড়া আনুষ্ঠানিকতা নয়: অন্য অ্যাঙ্কর আপনার না লেখা নিয়ম যোগ করতে পারে, তাই ছাপা সেটটি আপনার ফাইলের সঙ্গে মিলিয়ে নিন।

sudo pfctl -n -v -f /etc/pf.conf
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
sudo pfctl -s rules
sudo pfctl -s Anchors
sudo pfctl -a <anchor> -s rules
sudo pfctl -s info

নিয়ম লোড থাকা অবস্থায় টানেল নামিয়ে একটি পাতা লোড করার চেষ্টা করুন। সাধারণ ট্রাফিক থামা উচিত, এবং মেশিন ঘুমিয়ে জেগে ওঠার পরও তা থামা থাকা উচিত, কারণ ওই রূপান্তরেই পুরনো অবস্থা ফিরে আসে। আবার সংযোগ করে নিশ্চিত করুন যে নিয়মের সেট না ছুঁয়েই ট্রাফিক ফিরে আসে। টানেল নামানো অবস্থায় ব্রাউজার এখনো কাজ করলে কোনো নিয়ম আপনার ধারণার চেয়ে প্রশস্ত, আর ফিরে পড়া সাধারণত তার নাম বলে দেয়।

রিবুট হলো সেই অংশ যা মানুষ এড়িয়ে যায়। macOS বুটে /etc/pf.conf পড়ে, কিন্তু ফাইল পড়া মানে ফিল্টার চালু করা নয়, তাই এখন কাজ করা নিয়মের সেট পুনরায় চালুর পর নিষ্ক্রিয় হতে পারে। এরপর sudo pfctl -s info চালান এবং নিশ্চিত করুন যে স্ট্যাটাস লাইনটি ফিল্টারকে সক্রিয় বলে।

বেরোনোর ও পুনরায় চালুর পথ সৎ রাখুন

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

sudo pfctl -d
sudo pfctl -f /etc/pf.conf.previous
sudo pfctl -s rules

স্থায়িত্বের জন্য দরকার একটি লঞ্চ ডেমন যা pfctl -e চালায় এবং বুটে আপনার ফাইল লোড করে। অন্য যেকোনো বিশেষাধিকারপ্রাপ্ত কাজের মতোই এটিকে দেখুন: পরম পথ, পরে পড়ার মতো একটি লগ, এবং শারীরিকভাবে পৌঁছানো যায় এমন মেশিনে পরীক্ষা। নীরবে ব্যর্থ হওয়া ডেমন মেশিনটিকে অসুরক্ষিত ও স্বাভাবিক দেখতে রেখে যায়।

ফাঁকগুলো নথিভুক্ত করুন, শুরু করুন এমন একটি দ্বিতীয় VPN ক্লায়েন্ট দিয়ে যা নিজের টানেল ডিভাইস তৈরি করে। আপনার নিয়ম একটি টানেল ইন্টারফেসের নাম বলে, তাই দ্বিতীয়টি আটকানো থাকে বা পরে যোগ করা প্রশস্ত নিয়মে মেলে। টিথারিং ও হটস্পট ইন্টারফেস কেবল মাঝে মাঝে দেখা যায় এবং একই টীকা প্রাপ্য। ওই ফাঁকগুলোর কোনোটিই নীতিটি এড়িয়ে যাওয়ার কারণ নয়; এগুলো সেই শর্ত যার অধীনে এটি এখনো খাটে।

সম্পর্কিত নিবন্ধ