গাইড

Linux-এ ufw কনফিগারেশন: সার্ভারের firewall ও nftables-এর মূলকথা

হালনাগাদ: · Skillaria.Top

ufw কনফিগারেশন তিন ধাপে হয়: ডিফল্ট নীতি সেট করুন (sudo ufw default deny incoming ও allow outgoing), SSH ও প্রয়োজনীয় পোর্ট অনুমতি দিন (sudo ufw allow 22/tcp, sudo ufw allow 443/tcp), তারপর sudo ufw enable দিয়ে firewall চালু করুন। নিয়ম যাচাই হয় sudo ufw status numbered দিয়ে, আর ভেতরে ufw netfilter-কে iptables বা nftables-এর মাধ্যমে নিয়ন্ত্রণ করে।

Linux-এ firewall ঠিক করে কোন নেটওয়ার্ক প্যাকেট সার্ভারে ঢুকতে দেওয়া হবে আর কোনটি বাতিল হবে। কাজটি করে কার্নেলের netfilter উপ-সিস্টেম, আর তাকে নিয়ন্ত্রণ করে কয়েকটি ইউটিলিটি: নিম্ন স্তরের iptables ও nftables, এবং তার ওপরের স্তর ufw (Uncomplicated Firewall)। Ubuntu ও Debian-এর বেশিরভাগ সার্ভারে ufw কনফিগারেশন পাঁচ মিনিটের কাজ: সব ইনকামিং বন্ধ করা, SSH ও সেবার পোর্ট খোলা, তারপর চালু করা। নিচে ধাপে ধাপে পদ্ধতি, সাধারণ ভুল এবং পর্দার আড়ালে কী ঘটে তা বোঝার জন্য nftables-এর মূলকথা দেওয়া হলো।

Linux-এ firewall কীভাবে কাজ করে

প্যাকেট ফিল্টারিং বাস করে কার্নেলে — এটি netfilter। সেখানে কিছু হুক (hook) আছে: হোস্টের নিজের জন্য আসা ট্রাফিক (input), বের হওয়া ট্রাফিক (output) এবং ট্রানজিট (forward)। ব্যবহারকারীর ইউটিলিটি শুধু এই হুকগুলোতে নিয়ম লিখে দেয়।

টুলস্তরকখন ব্যবহার
ufwউপরের স্তর, সহজ সিনট্যাক্সUbuntu/Debian-এর একক সার্ভার, সাধারণ নিয়ম
firewalldজোন-ভিত্তিক উপরের স্তরRHEL, Rocky, Fedora
nftables (nft)নিম্ন স্তর, আধুনিকজটিল নিয়ম, NAT, ঠিকানার সেট
iptablesনিম্ন স্তর, পুরোনো হচ্ছেপুরোনো সিস্টেম ও স্ক্রিপ্ট

গুরুত্বপূর্ণ: একটিমাত্র ব্যবস্থাপনা টুল ব্যবহার করুন। ufw ও iptables-এ একসঙ্গে হাতে নিয়ম বদলালে তারা একে অন্যের নিয়ম মুছে ফেলবে, এবং ফলাফল অপ্রত্যাশিত হবে।

ufw ইনস্টল ও যাচাই

Ubuntu-তে ufw সাধারণত আগে থেকেই আছে কিন্তু বন্ধ। Debian-এ আলাদাভাবে ইনস্টল করতে হয়:

$ sudo apt update
$ sudo apt install ufw
$ sudo ufw status
Status: inactive

inactive মানে ufw-এর নিয়মগুলো প্রয়োগ হচ্ছে না। এখনই firewall চালু করা ঠিক নয়: আগে SSH অনুমতি দিতে হবে, নইলে দূরবর্তী সার্ভারে নিজেই নিজের সংযোগ কেটে দেবেন।

ধাপে ধাপে ufw কনফিগারেশন

ধাপ ১. ডিফল্ট নীতি

ডিফল্ট নীতি হলো কোনো নিয়ম না মিললে প্যাকেটের সঙ্গে কী করা হবে। সার্ভারের জন্য নিরাপদ পদ্ধতি: ইনকামিং নিষিদ্ধ, আউটগোয়িং অনুমোদিত।

$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'

আপনার নিজের বের হওয়া সংযোগের উত্তর স্বয়ংক্রিয়ভাবে আসে: ufw সংযোগের অবস্থা ট্র্যাক করে (connection tracking), তাই উত্তরের জন্য আলাদা পোর্ট খোলার দরকার নেই।

ধাপ ২. SSH অনুমতি

$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)

OpenSSH হলো একটি অ্যাপ্লিকেশন প্রোফাইল। SSH অস্বাভাবিক পোর্টে শুনলে সেটি স্পষ্টভাবে অনুমতি দিন: sudo ufw allow 2222/tcp। sshd আসলে কোন পোর্টে শুনছে দেখতে: sudo ss -tlnp | grep sshd।

ধাপ ৩. সেবার পোর্ট খোলা

$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp

প্রোটোকল উল্লেখ করুন: /tcp ছাড়া ufw পোর্ট TCP ও UDP দুটোর জন্যই খুলবে, আর অপ্রয়োজনীয় খোলা দরজা কোনো কাজে আসে না।

ধাপ ৪. firewall চালু

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

ufw সঙ্গে সঙ্গে চালু হবে এবং প্রতিবার বুটে স্বয়ংক্রিয়ভাবে চালু হবে। বর্তমান SSH সেশন বন্ধ করবেন না: দ্বিতীয় একটি সেশন খুলে সংযোগ কাজ করছে কিনা নিশ্চিত হন।

ধাপ ৫. নিয়ম যাচাই

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)

IPv6-এর নিয়ম ufw নিজে তৈরি করে, যদি /etc/default/ufw-এ IPV6=yes থাকে (ডিফল্ট মান এটিই)।

ufw-এ পোর্ট খোলার সব রূপ

ufw allow ছোট ও বিস্তারিত দুই রূপই বোঝে। সাধারণ ক্ষেত্রে ছোট রূপ যথেষ্ট, আর উৎস, ইন্টারফেস বা গন্তব্য ঠিকানা উল্লেখ করতে হলে বিস্তারিত রূপ।

কাজকমান্ড
TCP পোর্টsudo ufw allow 443/tcp
UDP পোর্টsudo ufw allow 51820/udp
পোর্টের পরিসরsudo ufw allow 6000:6007/tcp
সেবার নাম দিয়েsudo ufw allow https
একটি IP থেকেsudo ufw allow from 203.0.113.10
একটি সাবনেট থেকে পোর্টেsudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp
একটি ইন্টারফেসেsudo ufw allow in on eth1 to any port 3306 proto tcp
নিষিদ্ধ করাsudo ufw deny 23/tcp
উত্তরসহ প্রত্যাখ্যানsudo ufw reject 25/tcp

deny ও reject-এর পার্থক্য: deny প্যাকেট নীরবে ফেলে দেয়, তাই ক্লায়েন্ট টাইমআউট পর্যন্ত অপেক্ষা করে; reject উত্তর পাঠায় যে পোর্ট বন্ধ। বাইরের বিশ্বের জন্য সাধারণত deny বেছে নেওয়া হয়, আর অভ্যন্তরীণ নেটওয়ার্কে reject বেশি সুবিধাজনক, কারণ ক্লায়েন্ট সঙ্গে সঙ্গে ত্রুটি দেখে।

শুধু একটি সার্ভার থেকে ডেটাবেসে প্রবেশ

একটি সাধারণ কাজ: PostgreSQL বা MySQL ইন্টারনেট থেকে দেখা যাবে না, কিন্তু পাশের সার্ভারের অ্যাপ্লিকেশন সংযুক্ত হতে পারবে।

$ sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp
Rule added

deny incoming নীতির কারণে পোর্ট 5432 বাকি সবার জন্য বন্ধ থাকে। অতিরিক্ত হিসেবে ডেটাবেস সার্ভিসকে শুধু অভ্যন্তরীণ ঠিকানায় শোনার জন্য কনফিগার করুন — firewall ও সেবার সেটিং একে অন্যকে রক্ষা করে।

অ্যাপ্লিকেশন প্রোফাইল

প্যাকেজ তাদের পোর্টের বিবরণ /etc/ufw/applications.d/-এ রাখতে পারে। প্রোফাইলের তালিকা ও বিষয়বস্তু:

$ sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
$ sudo ufw app info "Nginx Full"
Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient web server

Ports:
  80,443/tcp

প্রোফাইল অনুমতি দিতে: sudo ufw allow "Nginx Full"। স্পেসযুক্ত নাম উদ্ধৃতিচিহ্নে লিখুন। নিজের প্রোফাইল একই ডিরেক্টরিতে INI ফরম্যাটে লিখে sudo ufw app update নাম দিয়ে প্রয়োগ করা যায়।

ufw-এর নিয়ম মুছে ফেলা

সবচেয়ে নির্ভরযোগ্য উপায় — নম্বর দিয়ে:

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

$ sudo ufw delete 2
Deleting:
 allow 80/tcp
Proceed with operation (y|n)? y
Rule deleted

মুছলে নম্বর সরে যায়, তাই পরের মুছার আগে আবার status numbered চালান। দ্বিতীয় উপায় — নিয়মটি delete শব্দ দিয়ে আবার লেখা: sudo ufw delete allow 80/tcp; এতে IPv4 ও IPv6 দুটো রূপই একসঙ্গে মুছে যায়।

নিয়মের ক্রম ও শুরুতে যোগ করা

ufw নিয়মগুলো ওপর থেকে নিচে পরীক্ষা করে, প্রথম মেলা নিয়মটি কার্যকর হয়। তাই কোনো নির্দিষ্ট ঠিকানার নিষেধাজ্ঞা সাধারণ অনুমতির ওপরে থাকতে হবে:

$ sudo ufw insert 1 deny from 198.51.100.23
Rule inserted

সাধারণ কমান্ডে deny যোগ করলে সেটি allow 443/tcp-এর পরে যাবে এবং ওই পোর্টের জন্য কাজ করবে না।

SSH-কে ব্রুট-ফোর্স থেকে রক্ষা: ufw limit

limit নিয়ম সংযোগ অনুমতি দেয়, কিন্তু সেই ঠিকানা ব্লক করে যা ৩০ সেকেন্ডে ৬ বা তার বেশি সংযোগ খুলেছে:

$ sudo ufw limit OpenSSH
Rule updated

এটি ব্যাপক পাসওয়ার্ড ব্রুট-ফোর্সের বিরুদ্ধে সহজ সুরক্ষা। গুরুতর সুরক্ষার জন্য শুধু কী দিয়ে লগইন চালু করুন এবং চাইলে fail2ban যোগ করুন — সে ufw-এর মাধ্যমে ঠিকানা ব্লক করতে পারে।

ufw-এর লগ

লগিং চালু হয় sudo ufw logging on দিয়ে; স্তর — low, medium, high, full। রেকর্ড যায় /var/log/ufw.log-এ (rsyslog-এর মাধ্যমে) এবং কার্নেল জার্নালে:

$ sudo journalctl -k | grep 'UFW BLOCK' | tail -2
Oct 14 10:12:03 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=45.155.205.1 DST=192.0.2.10 PROTO=TCP SPT=51544 DPT=3389
Oct 14 10:12:09 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=89.248.165.7 DST=192.0.2.10 PROTO=TCP SPT=40312 DPT=23

SRC ও DPT ক্ষেত্র দেখায় কে কোন পোর্টে ঢুকতে চেয়েছিল। সেবা সাড়া না দিলে এবং লগে তার পোর্টে UFW BLOCK থাকলে বুঝবেন নিয়মটি যোগ হয়নি।

ufw ও Docker: পোর্ট নিয়ম অমান্য করে খোলা কেন

এটি সবচেয়ে বিখ্যাত ফাঁদ। Docker পোর্ট প্রকাশ করার সময় (-p 8080:80) নিজেই NAT নিয়ম ও DOCKER চেইন যোগ করে, আর কনটেইনারের ট্রাফিক forward দিয়ে যায়, ufw-এর ইনকামিং নিয়ম বাইপাস করে। ফলে ufw status-এ 8080 পোর্ট দেখা যায় না, কিন্তু বাইরে থেকে তা খোলা থাকে।

সমাধানের উপায়:

  • পোর্ট শুধু localhost-এ প্রকাশ করুন: -p 127.0.0.1:8080:80, আর বাইরে পৌঁছে দিন রিভার্স প্রক্সির (nginx) মাধ্যমে।
  • নিজের নিয়ম DOCKER-USER চেইনে যোগ করুন — Docker এটি মুছে ফেলে না।
  • সহায়ক কনটেইনারের পোর্ট একেবারেই প্রকাশ করবেন না, বরং Docker নেটওয়ার্কের মাধ্যমে সংযুক্ত করুন।

রিসেট ও বন্ধ করা

$ sudo ufw disable     # বন্ধ করা, নিয়ম থেকে যায়
$ sudo ufw reset       # সব নিয়ম মুছে বন্ধ করা
$ sudo ufw reload      # কনফিগারেশন আবার পড়া

reset-এর আগে ufw নিয়ম-ফাইলের কপি /etc/ufw/-এ তারিখসহ নামে রাখে। নিয়মগুলো থাকে /etc/ufw/user.rules ও user6.rules-এ — এগুলো হাতে সম্পাদনা না করে শুধু কমান্ড দিয়ে বদলান।

nftables-এর মূলকথা

nftables হলো Linux কার্নেলে iptables-এর আধুনিক প্রতিস্থাপন। Debian 10+ ও Ubuntu 20.10+-এ iptables কমান্ড ডিফল্টভাবে iptables-nft সামঞ্জস্য স্তরের মাধ্যমে চলে, তাই ufw-এর নিয়মও শেষ পর্যন্ত nftables-এ যায়। কার্নেলে যা লোড হয়েছে সব দেখতে:

$ sudo nft list ruleset

nftables-এর কাঠামো: একটি টেবিল (পরিবার ip, ip6, অথবা দুটোর জন্য inet) ধারণ করে চেইন, যা netfilter-এর হুকের সঙ্গে যুক্ত, আর চেইনে থাকে নিয়ম। সার্ভারের জন্য ন্যূনতম firewall /etc/nftables.conf-এ:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        ct state invalid drop
        iif "lo" accept
        ip protocol icmp accept
        meta l4proto ipv6-icmp accept
        tcp dport { 22, 80, 443 } accept
    }
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

প্রয়োগ ও বুটে চালু করা:

$ sudo nft -c -f /etc/nftables.conf   # শুধু সিনট্যাক্স যাচাই
$ sudo systemctl enable --now nftables

নিয়ম চলতে থাকা অবস্থায়ও যোগ করা যায়, কিন্তু ফাইলে না লিখলে রিবুটের পর তা হারিয়ে যায়:

$ sudo nft add rule inet filter input tcp dport 5432 ip saddr 10.0.0.5 accept
$ sudo nft -a list chain inet filter input   # -a নিয়মের handle দেখায়
$ sudo nft delete rule inet filter input handle 9

nftables-এর প্রধান সুবিধা — সেট ({ 22, 80, 443 }) এবং IPv4 ও IPv6-এর জন্য একটি inet টেবিল। নিজের nftables.service ufw-এর সঙ্গে একই সময়ে চালাবেন না: flush ruleset ufw-এর নিয়ম মুছে দেবে।

সাধারণ ভুল

  • SSH-এর নিয়ম ছাড়া ufw চালু করা — সংযোগ হারিয়ে যায়। রক্ষা করে প্রদানকারীর কনসোল (VNC/serial): sudo ufw allow OpenSSH বা sudo ufw disable।
  • পোর্ট খোলা, কিন্তু সেবা অপ্রাপ্য — সেবা 127.0.0.1-এ শুনছে, বাইরের ঠিকানায় নয়। ss -tlnp দেখুন।
  • ক্লাউডের আলাদা firewall আছে — অনেক প্রদানকারীর নিরাপত্তা গ্রুপ থাকে; পোর্ট সেখানেও খুলতে হবে।
  • deny কাজ করছে না — নিয়মটি অনুমতির নিচে রয়েছে; insert 1 ব্যবহার করুন।

সারসংক্ষেপ

মূল ufw কনফিগারেশন হলো default deny incoming, SSH ও সেবার পোর্টের অনুমতি, ufw enable এবং status numbered দিয়ে যাচাই। নির্দিষ্ট প্রবেশাধিকারের জন্য from ও port-সহ নিয়ম, SSH-এর জন্য limit, আর Docker ব্যবহারে মনে রাখবেন যে সে ufw বাইপাস করে। NAT বা জটিল নিয়মের প্রয়োজন হলে nftables-এ যান। সার্ভারের firewall সুরক্ষা Linux কোর্সে হাতে-কলমে শেখানো হয়।

সাধারণ প্রশ্ন

ufw ও iptables-এর পার্থক্য কী?

ufw একটি উপরের স্তর, যার সরল সিনট্যাক্স আছে এবং যা নিজেই iptables বা nftables-এর নিয়ম তৈরি করে। iptables ও nftables নিম্ন স্তরের টুল, যারা সম্পূর্ণ নিয়ন্ত্রণ দেয়, কিন্তু বেশি জ্ঞান লাগে।

ufw-এর নিয়ম কি রিবুটের পরও থাকে?

হ্যাঁ। sudo ufw enable দেওয়ার পর firewall বুটে চালু হয়, আর নিয়মগুলো থাকে /etc/ufw/user.rules ও user6.rules-এ।

বের হওয়া সংযোগের জন্য পোর্ট খোলা লাগে কি?

allow outgoing নীতিতে লাগে না। সংযোগের অবস্থা ট্র্যাকিংয়ের কারণে ufw আপনার বের হওয়া সংযোগের উত্তর নিজে থেকেই পাস করে।

ufw চালু থাকলে ping কীভাবে অনুমতি দেব?

ডিফল্টভাবে ufw ইনকামিং ICMP echo-request আগেই অনুমতি দেয়: এই নিয়মটি /etc/ufw/before.rules-এ আছে। ping নিষিদ্ধ করতে ওই ফাইলে ACCEPT বদলে DROP করুন এবং sudo ufw reload চালান।

CentOS ও Rocky Linux-এ ufw আছে কি?

সেখানে স্ট্যান্ডার্ড টুল হলো firewalld, তার কমান্ড firewall-cmd। ufw EPEL থেকে ইনস্টল করা যায়, কিন্তু firewalld-এর সঙ্গে মেশানো ঠিক নয়।

ভিডিওতে বিষয়টি শিখুন

“Linux: с нуля до уверенного администрирования” কোর্সে বিষয়টি অনুশীলনসহ বিস্তারিত শেখানো হয়েছে।

কোর্সে যান