Rocky বা AlmaLinux VPS-এ firewalld ব্যবহার শেখা
Rocky বা AlmaLinux VPS-এ firewalld দিয়ে SSH ও web port খুলুন, port বন্ধ করুন এবং reboot-এর পরও নিয়ম রাখুন। zones ও --permanent-এর ফাঁদ বুঝুন।
firewalld কী এবং Rocky ও AlmaLinux-এ এটি ডিফল্টভাবে কেন থাকে
firewalld হলো Rocky Linux, AlmaLinux এবং Red Hat Enterprise Linux (RHEL)-এর অন্যান্য rebuild-এ ডিফল্টভাবে ইনস্টল থাকা firewall manager। উভয় distribution-ই এটি নিজে বেছে নেয়নি; তারা এই default উত্তরাধিকারসূত্রে পেয়েছে। CentOS দিক পরিবর্তন করার পর Rocky ও AlmaLinux কীভাবে Red Hat-এর কাজ পুনর্নির্মাণ করতে শুরু করে তা জানলে বিষয়টি আরও পরিষ্কার হবে। firewalld নিজে packet inspect করে না। এটি একটি সংরক্ষিত configuration রাখে এবং সেই configuration-কে nftables rule-এ রূপান্তর করে। server online থাকা অবস্থায় একটি command, firewall-cmd, ব্যবহার করে এটি সম্পাদনা করা যায়। এই guide-এ দুই distribution-এর মধ্যে কোনো পার্থক্য থাকবে না, কারণ যে বিষয়গুলো আসলে Rocky ও AlmaLinux-কে আলাদা করে সেগুলো হলো compatibility promise এবং এখনও supported CPU-এর পরিসর, firewall নয়।
আপনি যদি আগে থেকেই Ubuntu VPS-এ ufw কীভাবে কাজ করে তা জানেন, তাহলে এর কাজও জানেন। firewalld এমন দুটি ধারণা যোগ করে, যা ufw-তে নেই। প্রথমটি হলো zones: একটি নামযুক্ত policy, যার মধ্যে packet-গুলো শ্রেণিবদ্ধ করা হয়। দ্বিতীয়টি হলো live rules এবং saved rules-এর বিভাজন। এর জন্য --permanent flag ব্যবহৃত হয় এবং এটিই এই tool-এ বিভ্রান্তির সবচেয়ে বড় উৎস।
নিচের প্রতিটি বিষয় আপনার নিজের server-এ চালানোর command। প্রতিটি পরিবর্তন দ্বিতীয় একটি 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 --statefirewall-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 --reloadtarget: 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-ও আর কোনো response পাবে না।
আমার 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 দেখায় বলে মানুষ প্রায়ই বিভ্রান্ত হয়।
প্রতিবার দুই ধরনের configuration-ই লিখুন।
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 হারিয়ে ফেলে। ফলে সাধারণত আপনার session-সহ সব খোলা connection বন্ধ হয়ে যায়। সাধারণ reload ব্যবহার করুন।
একটি safety net আগে থেকেই আছে। runtime rule নিজে থেকেই মেয়াদ শেষ করতে পারে।
sudo firewall-cmd --add-service=http --timeout=5mএই rule পাঁচ মিনিট পরে নিজেকে সরিয়ে ফেলে। এটি --permanent-এর সঙ্গে একত্রে ব্যবহার করা যায় না। এটাই এর উদ্দেশ্য: অনিশ্চিত কোনো পরিবর্তন পরীক্ষা করা। পুরোনো safety net আরও ভালো। Rule edit করার সময় একটি দ্বিতীয় SSH session খোলা রাখুন। নতুন rule কার্যকর কি না, fresh login দিয়ে নিশ্চিত না হওয়া পর্যন্ত সেটি বন্ধ করবেন না।
Zones কী এবং VPS-এ কেন শুধু default zone গুরুত্বপূর্ণ
Zone হলো trust level-সহ নামযুক্ত permissions-এর একটি সেট। firewalld প্রতিটি incoming packet-কে ঠিক একটি zone-এ অন্তর্ভুক্ত করে। প্রথমে এটি প্রতিটি zone-এর sources: তালিকার সঙ্গে 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-ই ব্যবহার করবেন। কোনো --zone= argument ছাড়া firewall-cmd default zone-এ কাজ করে। তাই এই গাইডের প্রতিটি সংক্ষিপ্ত command-এ zone-এর নাম উল্লেখ না করলেও কাজ হয়।
এখানে এমন একটি সমস্যা হয়, যা সমাধান করতে পুরো একটি বিকেল নষ্ট হতে পারে। Interface যদি অন্য কোনো zone-এর সঙ্গে bound থাকে, আপনার rules public-এ যুক্ত হয়, কিন্তু traffic অন্যত্র পরিচালিত হয়। ফলে আপনি যত rule-ই যোগ করুন, কোনো প্রভাব পড়ে না এবং কোনো warning-ও দেখায় না। --get-active-zones binding দেখায়:
public
interfaces: eth0Interface যদি অন্য কোনো zone-এর নামে দেখা যায়, তাহলে --zone= ব্যবহার করে সেই zone-এ rules লিখুন, অথবা interface-টি সরিয়ে দিন।
sudo firewall-cmd --permanent --zone=public --change-interface=eth0
sudo firewall-cmd --reloadRocky এবং AlmaLinux-এ NetworkManager interface পরিচালনা করে এবং connection চালু হলে zone আবার প্রয়োগ করে। তাই reboot-এর পর আপনার configuration বদলে না যাওয়ার জন্য NetworkManager-এও zone সেট করুন। প্রথম command-এর output থেকে connection name নিন, কারণ এটি সাধারণত device name-এর মতো হয় না।
sudo nmcli connection show
sudo nmcli connection modify "System eth0" connection.zone publicSource 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 খুলে যায়, যার মধ্যে আপনি private মনে করা database-ও রয়েছে। একটি host-এর বদলে নির্দিষ্ট একটি port খুলতে চাইলে rich rule ব্যবহার করুন।
firewalld service কী?
একটি service হলো XML file হিসেবে প্রকাশিত port-এর একটি নামযুক্ত bundle। --add-service=https 443/tcp খুলে, কারণ /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নাম থাকলে সেটিই ব্যবহার করুন। ছয় মাস পরে --list-all-এ এটি পড়তে সুবিধা হবে, এবং Cockpit-এর মতো package নিজস্ব service file install করে। কোনো কিছুর definition না থাকলে --add-port ব্যবহার করুন।
যে সীমাবদ্ধতাটি মনে রাখতে হবে: ssh service বলতে 22/tcp বোঝায়, আর কিছু নয়। আপনি যদি সার্ভারে SSH access hardening করার সময় SSH অন্য port-এ সরিয়ে নিয়ে থাকেন, তাহলে --add-service=ssh আপনার ব্যবহৃত port খুলবে না।
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reloadRHEL rebuild-এর ক্ষেত্রে ওই port-এর ওপর আরেকটি security 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-এ বর্তমানে থাকা rules পড়ে, firewalld যে table পরিচালনা করে সেখান থেকে। দুটির ফল একই হওয়া উচিত।
এর কোনোটিই প্রমাণ নয়। অন্য একটি machine থেকে পরীক্ষা করুন:
nc -zv 203.0.113.20 443Server-এ নিজে এই পরীক্ষা চালাবেন না। firewalld loopback interface-এ আসা সবকিছু গ্রহণ করে। তাই আপনার rules যা-ই বলুক, 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 অনুমোদন করে। কোনো process-কে সেই packet গ্রহণের জন্য listening অবস্থায় থাকতে হয়।
sudo ss -tlnp0.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 hole, যা আপনি বুঝতে পারবেন না, কারণ আপনার চালানো 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, যেটির patch আপনাকে বজায় রাখতে হবে। যেসব service চালু রাখার সিদ্ধান্ত নেন, সেগুলোর জন্য dnf-automatic timer অনুযায়ী security update ইনস্টল করতে পারে, ফলে এই কাজটি আপনার মনে রাখার ওপর নির্ভর করবে না। তবে patch ইনস্টল করা এবং সেটি চালানো এক বিষয় নয়। Update ইনস্টল হওয়ার পরে needs-restarting দেখায় কোন service এখনও পুরোনো library ব্যবহার করছে।
একটি 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 হলো permissions-এর সমষ্টি। এটি এমন 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-droplimit value journal-এ অতিরিক্ত packet-এর record জমে যাওয়া থামায়। SSH-কে একটি address-এ সীমাবদ্ধ করার আগে নিশ্চিত করুন যে address-টি স্থিতিশীল। Home connection-এর IP address পরিবর্তন হলে পরিবর্তনের দিনই আপনি নিজের server-এ প্রবেশাধিকার হারাতে পারেন। তাই আগে provider-এর console access পরীক্ষা করে সচল রাখুন।
ufw কমান্ড এবং তাদের firewall-cmd সমতুল্য
কাজ একই, টুল ভিন্ন। প্রতিটি --permanent লাইনের পরে একটি sudo firewall-cmd --reload দিতে হবে। এই তালিকার মতো সংক্ষিপ্ত তালিকায় সেটি দেখানো যায় না।
sudo ufw enableহয়ে যায়sudo systemctl enable --now firewalldsudo ufw disableহয়ে যায়sudo systemctl disable --now firewalldsudo ufw status verboseহয়ে যায়sudo firewall-cmd --list-allsudo ufw allow OpenSSHহয়ে যায়sudo firewall-cmd --permanent --add-service=sshsudo ufw allow 443/tcpহয়ে যায়sudo firewall-cmd --permanent --add-port=443/tcpsudo ufw delete allow 443/tcpহয়ে যায়sudo firewall-cmd --permanent --remove-port=443/tcpsudo ufw allow from 203.0.113.10 to any port 22উপরে দেখানো rich rule-এ পরিণত হয়sudo ufw reloadহয়ে যায়sudo firewall-cmd --reloadsudo ufw default deny incomingইতিমধ্যেইpubliczone যেভাবে কাজ করে, সেটিই বোঝায়, আর--set-target=DROPহলো এর নীরব সংস্করণsudo ufw logging onহয়ে যায়sudo firewall-cmd --set-log-denied=all
একটি পার্থক্য স্পষ্টভাবে বলা দরকার। ufw নম্বরযুক্ত তালিকা রাখে, এবং আপনি position 1-এ একটি rule insert করতে পারেন। firewalld-এ rule number নেই, তাই “এই rule-টি প্রথমে রাখুন” কথাটির এখানে কোনো অর্থ নেই। firewalld-এর দুটি entry পরস্পরবিরোধী মনে হলে broad accept কার্যকর হয়, কারণ সেটে কোনো deny নেই। broad entry-টি আপনাকেই remove করতে হবে।
Docker container-এর firewall বন্ধ মনে হলেও সেটিতে সংযোগ করা যায় কেন?
কারণ published container port আপনার zone যে firewall অংশ নিয়ন্ত্রণ করে, সেখানে পৌঁছায় না। docker run -d -p 8080:80 nginx Docker-কে নিজের NAT (network address translation) এবং forwarding rule লিখতে বলে। 8080 port-এ আসা packet পুনর্লিখিত হয়ে container-এ পাঠানো হয়। তাই এটি host-এ deliver না হয়ে forward হয়। আপনার zone-এর services: এবং ports: line host-এ deliver হওয়া packet নিয়ন্ত্রণ করে। Forward path Docker-এর rule নিয়ন্ত্রণ করে, এবং সেগুলো 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 থেকে পরীক্ষা করুন। এই overlap-এর কারণেই এই distribution-গুলোতে Docker Engine install করা Ubuntu guide-এ উল্লেখ না থাকা কয়েকটি ধাপ প্রয়োজন করে। এর শুরুতেই রয়েছে Podman-এর docker command আগে থেকেই নিজের দখলে থাকা।
রিবুটের পরও চালু থাকা এবং যে ত্রুটিগুলো দেখতে পাবেন
sudo systemctl is-enabled firewalld
sudo systemctl status firewalldenabled এবং active (running) আপনার প্রয়োজনীয় জিনিস। Firewall চালু থাকলেও enabled না থাকলে প্রথম reboot পর্যন্তই সুরক্ষা দেয়। নতুন VPS-এ প্রথম দশ মিনিটে যে যাচাইগুলোর তালিকা অনুসরণ করেন, সেখানে SSH key এবং update-এর পাশে এই যাচাইটিও রাখুন।
Raw nftables command এবং firewalld একসঙ্গে ব্যবহার করবেন না। firewalld inet firewalld নামের একটি table পরিচালনা করে। sudo nft flush ruleset এটি মুছে দেয়। এরপর সার্ভার সব ধরনের traffic-এর জন্য উন্মুক্ত হয়ে যায়। তবু firewall-cmd --list-all আপনার নির্ধারিত configuration দেখায়, কারণ firewalld kernel-এ থাকা বাস্তব অবস্থা নয়, তার নিজের ধারণা অনুযায়ী অবস্থা জানায়। sudo firewall-cmd --reload rule পুনরায় ইনস্টল করে। Rule লিখতে firewall-cmd ব্যবহার করুন, যাতে reload-এর পরও সেগুলো ফিরে আসে।
একটি সার্ভারে দুইটি firewall manager। firewalld-এর পাশে ufw বা iptables-services ইনস্টল করলে পরস্পরের অবস্থা না জেনে দুইটি program rule লিখবে। কোনটি কার্যকর হবে, তা নির্ভর করবে সর্বশেষ কোন service চালু হয়েছে তার ওপর। একটি বেছে নিন। Rocky এবং AlmaLinux-এ distribution support-সহ manager হলো firewalld।
সার্ভারের সামনে provider firewall। অনেক VPS panel-এ আলাদা network firewall থাকে। --list-all কোনো port open দেখালেও বাইরে থেকে connection ব্যর্থ হলে সার্ভারে কিছু পরিবর্তন করার আগে panel পরীক্ষা করুন। উল্টো ঘটনাও ঘটে: panel-এ rule open থাকলেও firewalld packet প্রত্যাখ্যান করলে কোনো কাজ হবে না।
sudo ছাড়া firewall-cmd চালানো। প্রতিটি পরিবর্তনের জন্য root প্রয়োজন। এটি ছাড়া authorization check request প্রত্যাখ্যান করে এবং কিছুই পরিবর্তিত হয় না। ফলে প্রথম দেখায় মনে হতে পারে command-টি উপেক্ষা করা হয়েছে।
বেশিরভাগ দিনে ছয়টি command যথেষ্ট: অবস্থা দেখার জন্য --list-all, কিছু open করার জন্য --permanent --add-service অথবা --add-port, বন্ধ করার জন্য --permanent --remove-service, সংরক্ষিত 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 চালান। এটি live set-টি 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 সংজ্ঞায়িত না থাকলে, অথবা সেটি non-standard port-এ listen করলে --add-port ব্যবহার করুন। ssh service-এ শুধু 22/tcp থাকে। তাই SSH 2222-এ সরালে --add-port=2222/tcp এবং ওই port-এর জন্য একটি SELinux label প্রয়োজন।
firewall-cmd port বন্ধ দেখালেও আমার Docker container-এ সংযোগ করা যাচ্ছে কেন?
প্রকাশিত port Docker-এর নিজস্ব NAT rule দিয়ে পুনর্লিখিত হয়ে container-এ forward হয়। তাই packet host-এ deliver হয় না। Zone-এর service ও port list শুধু host-এ deliver হওয়া packet-এর ক্ষেত্রে প্রযোজ্য। ফলে --list-all কিছু না দেখালেও container Internet থেকে উত্তর দেয়। docker run -d -p 127.0.0.1:8080:80 nginx ব্যবহার করে port-টি loopback-এ publish করুন এবং এর সামনে একটি reverse proxy বসান।
firewalld-এর পরিবর্তে Rocky Linux-এ ufw install করা যাবে কি?
একই server-এ দুটি firewall manager একে অপরের configuration না জেনে rule লেখে। কোন rule set কার্যকর থাকবে, তা নির্ভর করে কোন service সর্বশেষ start হয়েছে তার ওপর। Rocky Linux এবং AlmaLinux-এ firewalld সমর্থিত tool। এটি আগে থেকেই install করা থাকে এবং ufw যে একই nftables backend ব্যবহার করত, firewalld সেটিই পরিচালনা করে। Default zone এবং --permanent flag একবার শিখলেই এই tool ব্যবহারের মূল বিষয়গুলো জানা হয়ে যায়।