UFW বানানো হয়েছিল যাতে ফায়ারওয়াল তিনটি কমান্ডে সাজানো যায়, আর তাতে সে সফল। সমস্যা অন্যত্র: ufw status অভিপ্রায় দেখায়, ফলাফল নয়। কোনো নিয়ম তালিকায় থাকতে পারে আর একেবারে কিছুই বন্ধ না করতে পারে — তিনটি আলাদা কারণে, আর তিনটিই বাস্তব সার্ভারে নিয়মিত মেলে।
এমন শুরু যা আপনাকে বাইরে ফেলে না
কমান্ডের ক্রম গুরুত্বপূর্ণ। আগে SSH-কে অনুমতি দিন, তারপর চালু করুন:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
SSH-কে অনুমতি দেওয়ার আগে ufw enable আপনার নিজের সেশন কেটে দেয়, আর তারপর কেবল প্রদানকারীর কনসোলই থাকে। সার্ভার আগে থেকেই সাজানো আর আপনি নিশ্চিত না হলে দ্বিতীয় একটা সংযোগ খোলা রাখুন — সেটি ব্যর্থ সম্পাদনা টিকে যায়।
বিস্তারিত অবস্থা দেখুন; সংক্ষিপ্তটি ডিফল্ট নীতি লুকিয়ে রাখে:
sudo ufw status verbose
প্রথম ভুল: নিয়ম আছে আর পোর্ট গোটা দুনিয়ার জন্য খোলা
অন্যের কনফিগারেশনে সবচেয়ে প্রচলিত লাইন:
sudo ufw allow 3306
এভাবেই MySQL «যাতে বাড়ি থেকে যুক্ত হতে পারি» বলে খোলা হয় — আর গোটা ইন্টারনেটের জন্য খুলে যায়। দুটি সঠিক রূপ আছে, আর দুটিই ভালো:
sudo ufw allow from 203.0.113.25 to any port 3306
অথবা, আরও নির্ভরযোগ্যভাবে, সেবাটিকে বাইরে বেরোতেই দেবেন না: MySQL-এর কনফিগে bind-address = 127.0.0.1, আর বাইরের প্রবেশাধিকার SSH টানেল দিয়ে। ফায়ারওয়াল দ্বিতীয় সারি; প্রথমটি হলো সেবা প্রকাশ্য ঠিকানায় না শোনা। UFW-র নিয়ম ভুল করে মুছে যেতে পারে, অথচ bind-address নিজে থেকে বদলায় না।
দ্বিতীয় ভুল: IPv6
ufw allow from 203.0.113.25-এর মতো নিয়ম কেবল IPv4-তে প্রযোজ্য। সার্ভারের IPv6 ঠিকানা থাকলে — আর বেশিরভাগ VPS-এর তা চালু অবস্থায় থাকে — সেবাটি তাতে নাগালে থেকে যায়। প্রদানকারী ঠিকানা দিয়েছে, আপনার সেটা মনে নেই, স্ক্যানারের আছে।
যাচাই করুন v6 ছাঁকা আদৌ চালু কি না (/etc/default/ufw-তে IPV6=yes) আর সেবাটি অকারণে ::-তে শুনছে কি না:
ss -tulpn | grep ':::'
যেসব নিয়মে ঠিকানা স্পষ্ট করে লেখা, সেগুলো প্রোটোকলের প্রতিটি সংস্করণের জন্য আলাদা করে লিখতে হয়।
তৃতীয় ভুল: Docker
সবচেয়ে বিরক্তিকরটি। Docker পোর্ট প্রকাশ করার সময় নিজের নিয়ম iptables-এর শৃঙ্খলে UFW যেগুলো লেখে তার আগে যোগ করে। ফলে -p 5432:5432 দিয়ে চালানো কন্টেইনার ইন্টারনেট থেকে নাগালে থাকে, যদিও UFW Status: active আর deny incoming নীতি জানায়। ফায়ারওয়াল ভাঙেনি — কেবল তার পালাই আসে না।
নিরাময় UFW-তে নয়, বরং পোর্ট কীভাবে প্রকাশ করা হয়েছে তাতে:
ports:
- "127.0.0.1:5432:5432"
স্থানীয় ঠিকানায় বাঁধা সবচেয়ে সরল ও নির্ভরযোগ্য সমাধান। বাইরের দিকে কেবল তাই থাকা উচিত যা সত্যিই দর্শনার্থীদের সেবা দেয়: সাধারণত কোনো রিভার্স প্রক্সির পোর্ট 80 ও 443।
নিয়মের ক্রম
UFW প্রথম মিলে যাওয়া নিয়ম প্রয়োগ করে আর সেখানেই থামে। তাই অনুমতির পরে যোগ করা নিষেধ কাজ করবে না: তার কাছে পালাই আসে না। সংখ্যায়ন দেখুন আর যেখানে দরকার সেখানে ঢোকান:
sudo ufw status numbered
sudo ufw insert 1 deny from 198.51.100.0/24
sudo ufw delete 7
নিয়ম সংখ্যা ধরে মোছা হয়, কিন্তু প্রতিটি মোছার পরে সংখ্যা সরে যায় — একটা করে মুছুন আর তালিকা আবার পড়ুন।
বাইরে থেকে যাচাই
স্থানীয় কমান্ড দেখায় কী সাজানো হয়েছে। আসলে কী দাঁড়াল তা কেবল অন্য যন্ত্র থেকেই দেখা যায়:
nmap -Pn -p- 203.0.113.25
nc -zv 203.0.113.25 3306
অন্য যেকোনো সার্ভার বা আপনার বাড়ির কম্পিউটার চলবে। এই একটিমাত্র যাচাই মিথ্যা বলে না, আর প্রতিটি লক্ষণীয় পুনর্বিন্যাসের পরে এটি চালানো ভালো — বিশেষত এমন কিছু বসানোর পরে যা «নেটওয়ার্ক নিজেই সাজায়»: Docker, কন্ট্রোল প্যানেল, VPN।
লগ
ডিফল্টে UFW প্রায় কিছুই লেখে না। এটি চালু করুন:
sudo ufw logging low
এন্ট্রি যায় /var/log/ufw.log-এ — তবে কেবল যদি সিস্টেমে rsyslog থাকে। Debian 12 ও Ubuntu 24.04-এ সেটি না-ও থাকতে পারে, আর তখন সব যায় systemd-এর জার্নালে:
sudo journalctl -k | grep -i '\[UFW'
ফাঁকা /var/log/ufw.log নিজে থেকে কিছুই বোঝায় না — আগে জার্নালে দেখুন।
ফায়ারওয়ালের কাছে কী আশা করবেন
UFW তাই বন্ধ করে যা নাগালে থাকার কথা নয়। যা খোলা, তাতে আসা অনুরোধের বিষয়বস্তু সে দেখে না: পোর্ট 443 সবার জন্য খোলা, আর সাইটে যা আসে তা নির্বিঘ্নে আসে। এটা অন্য সরঞ্জামের কাজ — অ্যাপ্লিকেশনের স্তরে WAF, ট্রাফিকের স্তরে IDS। ফায়ারওয়ালের কাজ আরও বিনয়ী ও আরও গুরুত্বপূর্ণ: খোলা পোর্টের তালিকা যেন আপনার ধারণার সঙ্গে মেলে। সক্রিয় নিয়মসহ সেই তালিকা এক পাতায় কেমন দেখায় — নিচের ডেমোতে।