SSD Nodes Learn 🎉 VPS $5.50/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-13

Rocky ও AlmaLinux VPS-এ firewalld ব্যবহারের সহজ গাইড

Rocky ও AlmaLinux VPS-এ firewalld দিয়ে SSH ও web port খুলুন, port বন্ধ করুন এবং reboot-এর পর নিয়ম টিকিয়ে রাখুন। zone ও --permanent-এর ফাঁদ জানুন।

firewalld কী এবং Rocky ও AlmaLinux-এ এটি কেন থাকে

firewalld হলো Rocky Linux, AlmaLinux এবং Red Hat Enterprise Linux (RHEL)-এর অন্যান্য rebuild-এ ডিফল্টভাবে ইনস্টল থাকা firewall manager। এটি নিজে packet পরিদর্শন করে না। এটি একটি সংরক্ষিত configuration রাখে এবং সেই configuration-কে nftables rule-এ রূপান্তর করে। একটি command, firewall-cmd, ব্যবহার করে server online থাকা অবস্থায় configuration সম্পাদনা করা যায়।

আপনি যদি Ubuntu VPS-এ ufw কীভাবে কাজ করে জানেন, তাহলে এর উদ্দেশ্যও জানেন। firewalld-এ ufw-তে না থাকা দুটি ধারণা আছে। প্রথমটি হলো zone: একটি নামযুক্ত policy, যার ভিত্তিতে packet শ্রেণিবদ্ধ করা হয়। দ্বিতীয়টি হলো live rule এবং saved rule-এর পৃথকতা। এই পৃথকতা --permanent flag দিয়ে নিয়ন্ত্রিত হয় এবং firewalld ব্যবহারের ক্ষেত্রে বিভ্রান্তির সবচেয়ে বড় কারণ।

নিচের প্রতিটি command আপনি নিজের server-এ চালাবেন। প্রতিটি পরিবর্তন দ্বিতীয় একটি machine থেকে পরীক্ষা করুন, কারণ server-এ সঠিক মনে হওয়া কোনো rule Internet থেকে ভুলভাবে কাজ করতে পারে।

অন্য কিছু করার আগে SSH খুলুন

বেশিরভাগ Rocky এবং AlmaLinux ইনস্টলে firewalld আগে থেকেই থাকে এবং চালু থাকে। সরবরাহ করা configuration-এ SSH অনুমোদিত থাকে। কিছু minimal cloud image থেকে এটি বাদ দেওয়া হয়। অনুমান না করে পরীক্ষা করুন।

sudo dnf install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --state

firewall-cmd --state, running প্রিন্ট করে। service বন্ধ থাকলে অন্য সব firewall-cmd call FirewallD is not running উত্তর দেয় এবং non-zero exit status দিয়ে বন্ধ হয়। কোনো command একেবারেই কাজ করছে না বলে মনে হলে এটিই প্রথমে পরীক্ষা করুন।

এখন বর্তমানে কোন সংযোগ অনুমোদিত তা দেখুন।

sudo firewall-cmd --list-all

প্রকৃত output-এ আরও কয়েকটি line থাকে। গুরুত্বপূর্ণ line-গুলো হলো:

public (active)
  target: default
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  rich rules:

services: line-এর ssh থাকার কারণেই আপনার session এখনও কাজ করছে। এটি না থাকলে অন্য কিছু করার আগে এটি যোগ করুন। SSH rule ছাড়া firewall চালু করলে session বন্ধ হয়ে যাবে এবং আপনি আর সার্ভারে প্রবেশ করতে পারবেন না।

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

target: default-এর অর্থ, কোনো rule-এর সঙ্গে না মেলা packet-কে ICMP (internet control message protocol) host-prohibited reply দিয়ে প্রত্যাখ্যান করা হয়। ফলে বন্ধ port-এ সংযোগ করা client সঙ্গে সঙ্গে No route to host দেখতে পায়। Target হিসেবে DROP নির্ধারণ করলে সার্ভার নীরব থাকে। তখন scanner-গুলো timeout-এর জন্য অপেক্ষা করে।

sudo firewall-cmd --permanent --zone=public --set-target=DROP
sudo firewall-cmd --reload

এটি চালানোর আগে এর প্রভাব বুঝে নিন। DROP সার্ভারকে ping-এর উত্তর দেওয়াও বন্ধ করে দেয়। ফলে আপনার নিজস্ব monitoring-ও নীরব হয়ে যাবে।

আমার rule কেন অদৃশ্য হয়ে গেল? --permanent flag

firewalld একই সময়ে দুটি configuration ধরে রাখে। runtime configuration হলো kernel এই মুহূর্তে যে configuration প্রয়োগ করছে। permanent configuration থাকে /etc/firewalld/zones/public.xml-এ এবং reload বা reboot-এর পরে আবার কার্যকর হয়।

--permanent ছাড়া চালানো command শুধু runtime configuration পরিবর্তন করে। এটি সঙ্গে সঙ্গে কার্যকর হয়, কিন্তু পরবর্তী reload বা boot-এর সময় হারিয়ে যায়। --permanent-সহ command file-এ লিখে, কিন্তু বর্তমানে চলমান configuration পরিবর্তন করে না। তাই reload না করা পর্যন্ত port বন্ধ থাকে। কোনো আচরণই bug নয়। উভয় ক্ষেত্রেই command success দেখায় বলে অনেকে বিভ্রান্ত হন।

প্রতিবার এই জোড়াটি লিখুন।

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

আপনি দুটি configuration-ই পড়তে পারেন। এতে দুটি ভুলের কোনটি করেছেন, তা দ্রুত বোঝা যায়।

sudo firewall-cmd --list-services
sudo firewall-cmd --permanent --list-services

প্রথম command-টি বর্তমানে সক্রিয় set দেখায়। দ্বিতীয়টি সংরক্ষিত set দেখায়। সক্রিয় set-এ কোনো service থাকলেও সংরক্ষিত set-এ না থাকলে পরবর্তী reload-এর সময় সেই rule মুছে যাবে। সংরক্ষিত set-এ কোনো rule থাকলেও সক্রিয় set-এ না থাকলে আপনি reload করতে ভুলেছেন। sudo firewall-cmd --runtime-to-permanent বর্তমানে সক্রিয় সবকিছু সংরক্ষিত file-এ কপি করে। কিছু সময় ধরে পরীক্ষা-নিরীক্ষার পরে এটি ব্যবহার করা সুবিধাজনক।

--reload connection tracking state বজায় রাখে, তাই আপনার SSH session চালু থাকে। --complete-reload kernel module-ও reload করে এবং সেই state হারিয়ে ফেলে। ফলে সাধারণত আপনার SSH session-সহ সব খোলা connection বিচ্ছিন্ন হয়ে যায়। সাধারণ reload ব্যবহার করুন।

একটি safety net আগে থেকেই আছে। runtime rule নিজে থেকেই মেয়াদ শেষ করতে পারে।

sudo firewall-cmd --add-service=http --timeout=5m

এই rule পাঁচ মিনিট পরে নিজে থেকে মুছে যায়। এটি --permanent-এর সঙ্গে ব্যবহার করা যায় না। এর উদ্দেশ্য হলো অনিশ্চিত কোনো পরিবর্তন পরীক্ষা করা। পুরোনো safety net-টি আরও ভালো। rule সম্পাদনা করার সময় দ্বিতীয় একটি SSH session চালু রাখুন। নতুন rule কার্যকর আছে কি না, fresh login করে নিশ্চিত না হওয়া পর্যন্ত সেটি বন্ধ করবেন না।

Zones এবং VPS-এ কেন শুধু default zone গুরুত্বপূর্ণ

Zone হলো trust level-সহ নির্ধারিত permissions-এর একটি নামযুক্ত সেট। firewalld প্রতিটি incoming packet-কে ঠিক একটি zone-এ রাখে। প্রথমে এটি প্রতিটি zone-এর sources: list-এর সঙ্গে packet-এর source address মিলিয়ে দেখে। কোনো মিল না থাকলে incoming interface যে zone-এর সঙ্গে bound, সেটি ব্যবহার করে। Interface কোনো zone-এর সঙ্গে bound না থাকলে packet default zone-এ যায়।

sudo firewall-cmd --get-default-zone
sudo firewall-cmd --get-active-zones

একটি network interface-সহ VPS-এ প্রথম উত্তরটি প্রায় সবসময় public, এবং আপনি শুধু এই zone-ই ব্যবহার করবেন। firewall-cmd-এ কোনো --zone= argument না থাকলে এটি default zone-এ কাজ করে। তাই এই গাইডের প্রতিটি সংক্ষিপ্ত command-এ zone-এর নাম দেওয়ার প্রয়োজন হয় না।

এখানে এমন একটি সমস্যা আছে, যা troubleshooting-এ অনেক সময় নষ্ট করে। Interface যদি অন্য কোনো zone-এর সঙ্গে bound থাকে, আপনার rules public-এ যুক্ত হবে, কিন্তু traffic অন্য zone-এ পরিচালিত হবে। ফলে আপনি যা-ই যোগ করুন, তার কোনো প্রভাব পড়বে না এবং কোনো সতর্কতাও দেখাবে না। --get-active-zones binding দেখায়:

public
  interfaces: eth0

Interface যদি অন্য কোনো zone name-এর অধীনে দেখা যায়, তাহলে --zone= ব্যবহার করে সেখানে rules লিখুন, অথবা interface-টি সরিয়ে নিন।

sudo firewall-cmd --permanent --zone=public --change-interface=eth0
sudo firewall-cmd --reload

Rocky এবং AlmaLinux-এ NetworkManager interface পরিচালনা করে, এবং connection চালু হলে এটি zone binding আবার প্রয়োগ করে। Reboot-এর পরে যাতে আপনার পরিবর্তন বাতিল না হয়, সেখানেও zone সেট করুন। প্রথম command-এর output থেকে connection name নিন, কারণ এটি device name-এর সঙ্গে সাধারণত এক হয় না।

sudo nmcli connection show
sudo nmcli connection modify "System eth0" connection.zone public

Source matching, interface matching-এর চেয়ে অগ্রাধিকার পায়। এভাবেই একটি address-এর জন্য আলাদা policy প্রয়োগ করা যায়। Built-in trusted zone সবকিছু গ্রহণ করে।

sudo firewall-cmd --permanent --zone=trusted --add-source=203.0.113.10/32
sudo firewall-cmd --reload

এটি ব্যবহারে সতর্ক থাকুন। ওই address-এর জন্য server-এর প্রতিটি port খুলে যায়, এমনকি যে database-কে আপনি private মনে করেছিলেন সেটিও। একটি host নয়, নির্দিষ্ট একটি port অনুমোদন করতে চাইলে rich rule ব্যবহার করুন।

firewalld service কী?

একটি service হলো নামযুক্ত port-এর একটি সংকলন, যা XML file হিসেবে প্রকাশিত হয়। --add-service=https 443/tcp port খুলে, কারণ /usr/lib/firewalld/services/https.xml নির্ধারণ করে https বলতে কী বোঝায়।

sudo firewall-cmd --get-services
sudo firewall-cmd --info-service=https

নামের আড়ালে থাকা port-গুলো দেখতে --info-service চালান:

https
  ports: 443/tcp

কোনো service definition থাকলে তার নাম ব্যবহার করুন। ছয় মাস পরে --list-all পড়লে এটি সহজে বোঝা যায়, এবং Cockpit-এর মতো package নিজস্ব service file ইনস্টল করে। যেসব কিছুর কোনো definition নেই, সেগুলোর জন্য --add-port ব্যবহার করুন।

যে বিষয়টি খেয়াল রাখতে হবে: ssh service বলতে শুধু 22/tcp বোঝায়। সার্ভারে SSH access শক্ত করার সময় আপনি যদি SSH অন্য port-এ সরিয়ে থাকেন, তাহলে --add-service=ssh আপনার ব্যবহৃত port খোলে না।

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

RHEL rebuild-এ ওই দরজায় আরও একটি lock থাকে। SELinux (security-enhanced Linux) port number-এ label প্রয়োগ করে, এবং sshd নিজের label-এর বাইরে থাকা কোনো port-এ bind করতে পারে না। ফলে এটি start হতে অস্বীকার করে এবং log-এ error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. লেখা থাকে। আগে port-এ label প্রয়োগ করুন।

sudo dnf install -y policycoreutils-python-utils
sudo semanage port -a -t ssh_port_t -p tcp 2222

এই মুহূর্তে কোনগুলো খোলা আছে তা কীভাবে দেখব?

sudo firewall-cmd --list-all
sudo firewall-cmd --list-rich-rules
sudo nft list table inet firewalld | head -n 40

প্রথম দুটি কমান্ড firewalld-এর বিবেচনা অনুযায়ী অবস্থা দেখায়। তৃতীয়টি kernel-এ বর্তমানে থাকা নিয়ম পড়ে, firewalld যে table পরিচালনা করে সেখান থেকে। দুটির ফল একই হওয়া উচিত।

এর কোনোটিই নিশ্চিত প্রমাণ নয়। অন্য একটি মেশিন থেকে পরীক্ষা করুন:

nc -zv 203.0.113.20 443

পরীক্ষাটি সার্ভারেই চালাবেন না। firewalld loopback interface-এ আসা সবকিছু গ্রহণ করে। তাই আপনার নিয়ম যা-ই বলুক, curl http://localhost:8080 সফল হবে। এই পরীক্ষা service সচল আছে কি না তা জানায়। firewall সম্পর্কে এটি কিছুই জানায় না।

একটি web port অনুমোদন করুন

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services

শেষ command-টি এখন আগের তালিকার পাশাপাশি http https-ও দেখাবে। site এখনও সাড়া না দিলে firewall আপনার সমস্যার কারণ নাও হতে পারে। একটি rule packet অনুমোদন করে। তবে সেই packet গ্রহণ করার জন্য কোনো process-কে listening অবস্থায় থাকতে হবে।

sudo ss -tlnp

0.0.0.0:443 অথবা *:443 হিসেবে দেখানো socket যেকোনো address থেকে connection গ্রহণ করে। 127.0.0.1:443 হিসেবে দেখানো socket শুধু loopback-এ সাড়া দেয়, এবং কোনো firewall rule-ই সেটিকে বাইরে থেকে reachable করতে পারবে না। Linux-এ port ও listening socket এই পার্থক্যটি আরও বিস্তারিতভাবে ব্যাখ্যা করে।

কোনো port আবার কীভাবে বন্ধ করব?

sudo firewall-cmd --permanent --remove-service=http
sudo firewall-cmd --reload

এখানেও --permanent rule প্রযোজ্য, এবং এই ক্ষেত্রে এর প্রভাব আরও গুরুতর। কোনো service শুধু runtime থেকে সরালে port-টি বন্ধ দেখাবে, কিন্তু পরবর্তী reload বা reboot-এর সময় saved file থেকে আবার খুলে যাবে। এটি এমন একটি security gap, যা আপনি বুঝতে পারবেন না, কারণ আপনার চালানো check সফল হয়েছে।

যে জিনিস আগে থেকেই ছিল না, সেটি সরানোর চেষ্টা করলে Warning: NOT_ENABLED: http দেখায় এবং তবুও exit 0 থাকে। একই জিনিস দুবার যোগ করলে Warning: ALREADY_ENABLED: http দেখায়। দুটিই নিরাপদ। ভুল বানানে লেখা নাম আলাদা: Error: INVALID_SERVICE-এর অর্থ হলো firewalld-এর কাছে ওই নামে কোনো definition নেই এবং কিছুই পরিবর্তন করা হয়নি।

আপনার --list-all-এ যদি cockpit দেখা যায় এবং আপনি port 9090-এ Cockpit web console ব্যবহার না করেন, তাহলে এটি সরিয়ে দিন। প্রতিটি open port এমন একটি service, যেটির security patch আপনাকে নিয়মিত প্রয়োগ করতে হবে।

একটি port-কে একটি source address-এ সীমাবদ্ধ করুন

Rich rule হলো দীর্ঘ রূপ। সাধারণ service name দিয়ে প্রয়োজনীয় নিয়ম প্রকাশ করা না গেলে এটি ব্যবহার করা হয়। SSH-কে একটি office address-এ সীমাবদ্ধ করতে দুটি command লাগে। দ্বিতীয় command-টি অনেকেই ভুলে যান।

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" service name="ssh" accept'
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload

একটি zone হলো permission-এর সমষ্টি। এটি এমন numbered list নয়, যেখানে প্রথম match পাওয়ার পর পরীক্ষা থেমে যায়। Rich rule একটি address-এর জন্য accept যোগ করে। এটি কাউকে deny করে না। ssh যদি এখনও services: line-এ থাকে, তাহলে পুরো Internet এখনও port 22-এ পৌঁছাতে পারে। সে ক্ষেত্রে rich rule কার্যকরভাবে কোনো পরিবর্তন করে না। Broad entry সরিয়ে দিন। তা না হলে narrow rule শুধু নামেই থাকবে।

যে port-এর কোনো service name নেই, সেটির পরিবর্তে port-টি সরাসরি উল্লেখ করুন।

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" port port="5432" protocol="tcp" accept'

কোনো noisy network-এর packet drop করে তার record রাখতে চাইলে action-এর আগে log element লিখুন। Rich rule language এই ক্রম প্রত্যাশা করে।

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.0/24" log prefix="fw-drop " level="info" limit value="3/m" drop'
sudo firewall-cmd --reload
sudo journalctl -k -g fw-drop

limit value journal-এ অতিরিক্ত packet-এর flood জমা হওয়া ঠেকায়। SSH-কে একটি মাত্র address-এ সীমাবদ্ধ করার আগে নিশ্চিত হন যে address-টি স্থির। বাড়ির Internet connection-এর IP address পরিবর্তন হলে সেই দিন থেকেই আপনি server-এ ঢুকতে পারবেন না। তাই আগে provider-এর console access পরীক্ষা করে কার্যকর অবস্থায় রাখুন।

ufw কমান্ড এবং তাদের firewall-cmd সমতুল্য

একই কাজ, ভিন্ন টুল। প্রতিটি --permanent লাইনের পরে একটি sudo firewall-cmd --reload থাকা প্রয়োজন। এই তালিকায় সেটি দেখানো সম্ভব নয়।

  • sudo ufw enable এর সমতুল্য হলো sudo systemctl enable --now firewalld
  • sudo ufw disable এর সমতুল্য হলো sudo systemctl disable --now firewalld
  • sudo ufw status verbose এর সমতুল্য হলো sudo firewall-cmd --list-all
  • sudo ufw allow OpenSSH এর সমতুল্য হলো sudo firewall-cmd --permanent --add-service=ssh
  • sudo ufw allow 443/tcp এর সমতুল্য হলো sudo firewall-cmd --permanent --add-port=443/tcp
  • sudo ufw delete allow 443/tcp এর সমতুল্য হলো sudo firewall-cmd --permanent --remove-port=443/tcp
  • sudo ufw allow from 203.0.113.10 to any port 22 এর সমতুল্য হলো উপরে দেখানো rich rule
  • sudo ufw reload এর সমতুল্য হলো sudo firewall-cmd --reload
  • sudo ufw default deny incoming ইতিমধ্যেই public zone-এর আচরণ। --set-target=DROP হলো এর নীরব সংস্করণ।
  • sudo ufw logging on এর সমতুল্য হলো sudo firewall-cmd --set-log-denied=all

একটি পার্থক্য স্পষ্টভাবে উল্লেখ করা দরকার। ufw নিয়মের একটি নম্বরযুক্ত তালিকা রাখে, এবং আপনি position 1-এ একটি নিয়ম insert করতে পারেন। firewalld-এ নিয়মের কোনো নম্বর নেই। তাই এখানে “এই নিয়মটি প্রথমে রাখুন” কথাটির কোনো অর্থ নেই। firewalld-এর দুটি entry পরস্পরবিরোধী মনে হলেও broad accept কার্যকর হয়, কারণ rule set-এ কোনো deny নেই। broad entry-টি আপনাকেই remove করতে হবে।

কেন firewall বন্ধ দেখালেও আমার Docker container-এ সংযোগ করা যায়?

কারণ published container port আপনার zone যে firewall অংশ নিয়ন্ত্রণ করে, সেখানে পৌঁছায় না। docker run -d -p 8080:80 nginx Docker-কে নিজস্ব NAT (network address translation) এবং forwarding rule লেখার নির্দেশ দেয়। 8080-এ আসা packet পুনর্লিখিত হয়ে container-এ পাঠানো হয়। তাই এটি host-এ deliver না হয়ে forward হয়। আপনার zone-এর services: এবং ports: line host-এ deliver করা packet নিয়ন্ত্রণ করে। Docker-এর rule forward path নিয়ন্ত্রণ করে এবং সেগুলো packet গ্রহণ করে।

ফলে এমন একটি server তৈরি হয় যেখানে sudo firewall-cmd --list-all 8080 port দেখায় না, কিন্তু অন্য একটি machine থেকে nc -zv 203.0.113.20 8080 ব্যবহার করে সংযোগ করা যায়। Docker কী install করেছে তা দেখুন:

sudo iptables -t nat -L DOCKER -n

সমাধানটি publish flag-এ রয়েছে। Port-টি loopback-এ bind করুন এবং এর সামনে একটি reverse proxy রাখুন।

docker run -d -p 127.0.0.1:8080:80 nginx

এখন container server-এ curl http://127.0.0.1:8080-এর উত্তর দেয়, কিন্তু বাইরের কোনো সংযোগের উত্তর দেয় না। Ubuntu ব্যবহারকারীরাও একই সমস্যার মুখোমুখি হন। এটি কেন Docker container সরাসরি ufw পাশ কাটিয়ে port publish করে-এ ব্যাখ্যা করা হয়েছে। Rocky এবং AlmaLinux base repository-তে যে rootful Podman সরবরাহ করে, সেটিও একই NAT পদ্ধতিতে port publish করে। তাই zone list-এর ওপর নির্ভর না করে অন্য একটি machine থেকে পরীক্ষা করুন।

রিবুটের পরেও এটি চালু রাখা এবং যে ত্রুটিগুলো দেখবেন

sudo systemctl is-enabled firewalld
sudo systemctl status firewalld

enabled এবং active (running) হলো আপনার প্রয়োজনীয় কমান্ড। firewall চালু থাকলেও enabled না থাকলে প্রথম reboot পর্যন্তই সুরক্ষা দেবে। নতুন VPS-এ প্রথম দশ মিনিটে যে কাজগুলো করবেন তালিকায় SSH key এবং update-এর পাশে এই যাচাইটিও রাখুন।

Raw nftables command এবং firewalld একসঙ্গে ব্যবহার করবেন না। firewalld inet firewalld নামের একটি table নিয়ন্ত্রণ করে। sudo nft flush ruleset এটি মুছে দেয়। এরপর সার্ভার সব ধরনের network traffic-এর জন্য উন্মুক্ত হয়ে যায়। তবু firewall-cmd --list-all আপনার নির্ধারিত configuration দেখাতে থাকে, কারণ firewalld kernel-এ থাকা configuration নয়, এটি যে configuration ধরে নিচ্ছে সেটিই জানায়। sudo firewall-cmd --reload rule পুনরায় ইনস্টল করে। Reload-এর পরেও rule ফিরে পেতে firewall-cmd দিয়ে rule লিখুন।

একটি সার্ভারে দুটি firewall manager। firewalld-এর পাশে ufw বা iptables-services ইনস্টল করলে দুটি program একে অপরের অবস্থা না জেনেই rule লিখবে। কোন configuration কার্যকর হবে, তা নির্ভর করবে কোন service সর্বশেষে start হয়েছে তার ওপর। একটি বেছে নিন। Rocky এবং AlmaLinux-এ distribution support-সহ manager হলো firewalld।

সার্ভারের সামনে provider firewall। অনেক VPS panel-এ আলাদা network firewall থাকে। --list-all কোনো port open দেখালেও বাইরে থেকে connection ব্যর্থ হলে সার্ভারে পরিবর্তন করার আগে panel পরীক্ষা করুন। বিপরীত ঘটনাও ঘটতে পারে: panel-এর rule open থাকলেও firewalld packet প্রত্যাখ্যান করলে connection হবে না।

sudo ছাড়া firewall-cmd চালানো। প্রতিটি পরিবর্তনের জন্য root প্রয়োজন। এটি ছাড়া authorization check request প্রত্যাখ্যান করে এবং কিছুই পরিবর্তন হয় না। ফলে এক নজরে মনে হতে পারে command-টি উপেক্ষা করা হয়েছে।

বেশিরভাগ দিনে ছয়টি command যথেষ্ট: অবস্থা দেখার জন্য --list-all, কিছু open করার জন্য --permanent --add-service বা --add-port, close করার জন্য --permanent --remove-service, saved file প্রয়োগ করার জন্য --reload, এবং কিছু পরীক্ষা-নিরীক্ষার পর --runtime-to-permanent। zone হলো public, flag হলো --permanent, আর নির্ভরযোগ্য যাচাই একমাত্র অন্য একটি machine থেকেই করা যায়।

FAQ

আমার firewalld rule reboot-এর পরে কেন হারিয়ে গেল?

Rule-টি শুধু runtime configuration-এ যুক্ত হয়েছিল। sudo firewall-cmd --add-service=http সঙ্গে সঙ্গে কার্যকর হয় এবং পরবর্তী reload বা boot-এর সময় বাতিল হয়ে যায়, কারণ /etc/firewalld/zones/public.xml-এ থাকা সংরক্ষিত configuration পরিবর্তন করা হয়নি। --permanent যোগ করুন এবং তারপর sudo firewall-cmd --reload চালান। হাতে যোগ করা বিদ্যমান rule সংরক্ষণ করতে sudo firewall-cmd --runtime-to-permanent চালান; এটি সক্রিয় rule-এর তালিকা saved file-এ কপি করে।

--permanent দিয়ে rule যোগ করার পর কোনো পরিবর্তন হয় না কেন?

কারণ --permanent file-এ rule লিখে, কিন্তু চলমান firewall পরিবর্তন করে না। sudo firewall-cmd --reload saved configuration kernel-এ load না করা পর্যন্ত port বন্ধ থাকে। sudo firewall-cmd --list-services এবং sudo firewall-cmd --permanent --list-services তুলনা করুন। Saved list-এ এমন entry থাকলে যা live list-এ নেই, তাহলে reload করাই বাদ পড়েছে।

আমার কি --add-service নাকি --add-port ব্যবহার করা উচিত?

আপনি যে service চালাচ্ছেন, তার জন্য কোনো নাম থাকলে --add-service ব্যবহার করুন। এতে উদ্দেশ্য স্পষ্ট থাকে, এবং sudo firewall-cmd --info-service=https দেখায় ওই নামটি ঠিক কোন port-গুলো অন্তর্ভুক্ত করে। কোনো সংজ্ঞায়িত service না থাকলে, অথবা service-টি non-standard port-এ listening করলে --add-port ব্যবহার করুন। ssh service-এ শুধু 22/tcp থাকে। তাই SSH 2222-এ সরালে ওই port-এর জন্য --add-port=2222/tcp এবং একটি SELinux label প্রয়োজন।

firewall-cmd port বন্ধ দেখালেও আমার Docker container-এ পৌঁছানো যায় কেন?

Published port Docker-এর নিজস্ব NAT rule দিয়ে পুনর্লিখিত হয় এবং container-এ forward করা হয়। তাই packet host-এ deliver হয় না। Zone-এর service ও port list শুধু host-এ deliver হওয়া packet-এর ক্ষেত্রে প্রযোজ্য। ফলে --list-all কিছু না দেখালেও container Internet থেকে response দেয়। docker run -d -p 127.0.0.1:8080:80 nginx ব্যবহার করে port-টি loopback-এ publish করুন এবং এর সামনে একটি reverse proxy রাখুন।

firewalld-এর পরিবর্তে Rocky Linux-এ কি ufw install করা উচিত?

একই server-এ থাকা দুটি firewall manager একে অপরের নিয়ম না জেনে rule লেখে। কোন rule set কার্যকর থাকবে, তা নির্ভর করে কোন service সর্বশেষ start হয়েছে তার ওপর। Rocky Linux এবং AlmaLinux-এ firewalld-ই supported tool। এটি আগে থেকেই install করা থাকে এবং ufw যে একই nftables backend ব্যবহার করত, firewalld-ও সেটিই চালায়। Default zone এবং --permanent flag একবার বুঝে নিলেই পুরো tool ব্যবহার করতে পারবেন।