dnsmasq-এ OpenVPN ক্লায়েন্টের নাম: স্ক্রিপ্ট নাকি স্থির এন্ট্রি?
ক্লায়েন্টের ঠিকানা বদলায়, সার্ভিসের নাম বদলায় না। VPN সেশনের ভিত্তিতে ক্লায়েন্টের নাম তৈরি করুন, drop-in ফাইলে সার্ভিসের নাম স্থির করুন, তারপর ক্লায়েন্টদের সেটি ব্যবহার করান।
প্রায় প্রতিটি ছোট OpenVPN গেটওয়েতে দুটি নাম-সমস্যা দেখা যায়। সংযুক্ত ল্যাপটপকে তার সার্টিফিকেটে থাকা নাম দিয়ে পৌঁছানো যায় না, আর টানেলের পিছনের সার্ভিসগুলোর কোনো নামই নেই। এগুলো একটিমাত্র সমস্যা বলে মনে হয়, কিন্তু বিপরীত সমাধান দরকার, কারণ একটি ঠিকানা প্রতিটি সেশনেই বদলায়, অন্যটি বদলায় না। কিছু সম্পাদনা করার আগে ঠিক করুন আপনি কোন ধরনের নাম যোগ করছেন।
প্রতি নামে সিদ্ধান্ত নিন, পুরো গেটওয়েতে নয়
পরীক্ষাটি সহজ: ক্লায়েন্ট আবার সংযুক্ত হলে এই ঠিকানাটি কি বদলায়? যদি হ্যাঁ, নামটি VPN সেশন থেকে তৈরি করতে হবে। যদি না, এটি একটি স্থির এন্ট্রিতে থাকবে যা আপনি পড়তে ও পর্যালোচনা করতে পারেন।
| Name kind | Source of truth | Where it lives |
|---|---|---|
| Connected client | The address OpenVPN just assigned | Generated hosts file, rewritten per session |
| Service behind the tunnel | A fixed address you chose | Static address= drop-in |
| Anything with a certificate name | The certificate, not the pool | Either, but the name must match the certificate |
দুটো মিশিয়ে ফেলাই সাধারণ ভুল। তৈরি ফাইলে আটকানো সার্ভিসটি স্ক্রিপ্ট যখন প্রথমবার ফাইলটি পুনরায় লেখে তখনই হারিয়ে যায়, আর স্থির এন্ট্রিতে লেখা ক্লায়েন্ট এমন কাউকে নির্দেশ করে যে শেষবার ওই ঠিকানাটি ধরে রেখেছিল। উভয় ভুলই অদৃশ্য থাকে যতক্ষণ না কোনো নাম ভুল মেশিনে রিজলভ হয়। ততক্ষণে যে ব্যক্তি ডিবাগ করছে সে ধরে নেয় DNS নষ্ট, ফাইল নয়।
গতিশীল পথ: learn-address এবং পুল
OpenVPN অ্যাসাইনমেন্ট জানে, তাই তাকেই বলতে দিন। এই সার্ভার অপশনগুলো অ্যাসাইনমেন্টকে টেকসই ও স্ক্রিপ্টযোগ্য করে:
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ip-pool 60
script-security 2
learn-address /etc/openvpn/learn-address.sh
learn-address প্রতিবার কোনো ঠিকানা যোগ, হালনাগাদ বা মুছে ফেলার সময় আপনার স্ক্রিপ্ট চালায় এবং অপারেশন, ঠিকানা ও কমন নেম পাঠায়। একটি ন্যূনতম স্ক্রিপ্ট প্রতি ক্লায়েন্টের জন্য একটি লাইন যোগ করে এবং মুছে ফেলার সময় তা সরিয়ে দেয়:
#!/bin/sh
HOSTS=/etc/openvpn/hosts.lan
case "$1" in
add|update) echo "$2 $3" >> "$HOSTS" ;;
delete) sed -i "/^$2 /d" "$HOSTS" ;;
esac
kill -HUP $(cat /var/run/dnsmasq.pid)
tun ডিভাইসে দ্বিতীয় আর্গুমেন্টটি ক্লায়েন্টের টানেল ঠিকানা, তাই লাইনটি সরাসরি ব্যবহারযোগ্য। tap ডিভাইসে OpenVPN এর বদলে ক্লায়েন্টের MAC ঠিকানা পাঠায়, কারণ একটি tap সেগমেন্ট IPv4 ছাড়াও অন্য প্রোটোকল বহন করতে পারে, এবং তখন কিছু লেখার আগে কমন নেম দিয়ে পুল ফাইলে ঠিকানাটি খুঁজতে হবে।
তৈরি ফাইলটি আসলে কী তা পরিষ্কার রাখুন: এখন কে সংযুক্ত তার একটি স্ন্যাপশট। সংযোগ বিচ্ছিন্ন হলে নাম মুছে যায়, যা নেটওয়ার্কের মধ্যে চলাচল করা ল্যাপটপের জন্য ঠিক যা আপনি চান, এবং সারা রাত চালু থাকা সার্ভারের জন্য ঠিক যা আপনি চান না।
স্থির পথ: address= এবং ডোমেইন সম্প্রসারণ
সিস্টেমের hosts ফাইলের বদলে dnsmasq-কে তৈরি ফাইলটির দিকে নির্দেশ করুন এবং একটি ডোমেইন দিন যাতে ছোট নামগুলো পূর্ণরূপে যোগ্য নামে সম্প্রসারিত হয়:
domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces
domain সেট থাকলে 10.8.0.6 alice এর মতো একটি লাইন alice এবং alice.corp.example উভয়ের জন্যই উত্তর দেয়। listen-address কেবল টানেল গেটওয়ে ও loopback-এ রাখুন, কারণ দুর্ঘটনাক্রমে LAN ইন্টারফেসে প্রকাশিত একটি রিজলভার এমন একটি সার্ভিস যা আপনি দিতে চাননি।
যে সার্ভিসগুলো কখনো পুল থেকে আসে না, তারা নিজেদের এন্ট্রি পায়। সেগুলো ডিস্ট্রিবিউশনের কনফিগারেশন ডিরেক্টরির অধীনে আলাদা drop-in ফাইলে রাখুন যাতে প্যাকেজ আপগ্রেড সেগুলো মুছে না ফেলে:
address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5
রিজলভারটি হস্তান্তর করুন, নয়তো কিছুই ঘটবে না
যে রিজলভারকে কেউ জিজ্ঞাসা করে না তা কিছুই বদলায় না। সার্ভারকে এটি ঘোষণা করতে হবে:
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"
Windows ক্লায়েন্ট উভয় অপশন নিজেরাই প্রয়োগ করে। বেশিরভাগ Linux ক্লায়েন্ট করে না: তাদের প্রয়োজন একটি সমর্থিত রিজলভার ইন্টিগ্রেশন, যেমন ডিস্ট্রিবিউশনের update-resolv-conf হুক বা NetworkManager-এর DNS ব্যবস্থাপনা, অথবা হাতে সেট করা সার্চ ডোমেইন ও নেমসার্ভার। push মানা হয়েছে ধরে নেওয়ার বদলে ক্লায়েন্টের প্রকৃত রিজলভার যাচাই করুন, কারণ উপেক্ষিত push দেখতে ঠিক এমন সার্ভারের মতো যেটি উত্তর দিচ্ছে না।
তিন স্তরে যাচাই করুন
প্রথমে সরাসরি সার্ভারকে জিজ্ঞাসা করুন, তারপর একটি ক্লায়েন্টকে, তারপর অ্যাপ্লিকেশনকে:
dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example
যদি সরাসরি কোয়েরি উত্তর দেয় কিন্তু অ্যাপ্লিকেশন না, তবে দোষ জোনের নয়, ক্লায়েন্ট হ্যান্ডঅফের। যদি নাম রিজলভ হয় এবং সংযোগ এখনও ব্যর্থ হয়, নাম ঠিক আছে এবং এরপর মার্শরুট বা ফায়ারওয়াল দেখতে হবে।
দুটি শ্রেণি কনফিগারেশনের পাশে লিখে রাখুন: কোন নামগুলো তৈরি হয়, কোনগুলো স্থির, এবং কোনটিকে কোন সার্টিফিকেটের সঙ্গে মিলতে হবে। পরবর্তী যে ব্যক্তি একটি সার্ভার যোগ করবে সে প্রথমে যে প্যাটার্ন পায় সেটাই কপি করবে।