CentOS 7-এ ট্রাফিক ফিল্টারিং নিয়ম কনফিগার করার জন্য FirewallD এসেছে। এটি iptables নিয়ম ম্যানেজ করার জন্য সুপারিশ করা টুল। CentOS 8 স্ট্যান্ডার্ড iptables প্যাকেট ফিল্টারিং সার্ভিসের পরিবর্তে nftables ফ্রেমওয়ার্ক ব্যবহার করে, এবং আপনি যখন firewalld-এ ফায়ারওয়াল নিয়ম কনফিগার করেন, তখন আপনি আসলে nftables কনফিগার করছেন। এই আর্টিকেলে আমরা Linux CentOS 8 (এবং CentOS 7) চলমান সার্ভারে firewalld ইনস্টল ও কনফিগার করার পদ্ধতি এবং এই ফায়ারওয়ালের মূল কনসেপ্টগুলো আলোচনা করব।
FirewallD হল একটি ফায়ারওয়াল সার্ভিস যা সার্ভারকে অপ্রয়োজনীয় ট্রাফিক থেকে রক্ষা করে। এটি ডাইনামিক ফায়ারওয়াল নিয়ম ম্যানেজমেন্ট সাপোর্ট করে (রিস্টার্ট ছাড়া)। এটি iptables এবং nftables-এর ইন্টারফেস হিসেবে কাজ করে। FirewallD প্রায় সব Linux ডিস্ট্রোতে ব্যবহার করা যায়।
Firewalld মূল কনসেপ্ট: জোন এবং নিয়ম
firewalld ইনস্টল ও কনফিগার করার আগে, আমরা জানব জোনগুলো কী এবং কিভাবে বিভিন্ন কানেকশনের ট্রাস্ট লেভেল নির্ধারণ করে। আপনি firewalld জোনগুলোতে বিভিন্ন ফিল্টারিং নিয়ম প্রয়োগ করতে পারেন, প্রিডিফাইনড সার্ভিস, প্রোটোকল বা পোর্টের জন্য এক্টিভ ফায়ারওয়াল অপশন সেট করতে পারেন, পোর্ট ফরওয়ার্ডিং এবং rich-rules সেট করতে পারেন।
Firewalld জোন অনুযায়ী ইনবাউন্ড ট্রাফিক ফিল্টার করে যে规则গুলো একটি জোনে প্রয়োগ করা থাকে। যদি সেন্ডার IP অ্যাড্রেস একটি জোনের নিয়মের সাথে মেলে, তবে প্যাকেটটি সেটি জোনের মাধ্যমে পাঠানো হবে। যদি IP অ্যাড্রেস সার্ভারে কনফিগার করা যেকোনো জোনের সাথে মেলে না, তবে ডিফল্ট জোনটি প্যাকেটটি প্রসেস করবে। আপনি যখন firewalld ইনস্টল করবেন, ডিফল্ট জোনটি হবে public।
Firewalld-এ কিছু জোন থাকে যেগুলোতে বিভিন্ন সার্ভিসের জন্য প্রি-কনফিগারড পারমিশন থাকে। আপনি এই সেটিংস ব্যবহার করতে পারেন বা নিজের জোন তৈরি করতে পারেন। Firewalld ইনস্টল করার সময় তৈরি হওয়া ডিফল্ট জোনগুলোর তালিকা (অবস্থিত /usr/lib/firewalld/zones/):
| drop | ন্যূনতম ট্রাস্ট লেভেল। সব ইনবাউন্ড কানেকশন কোনো রেসপন্স ছাড়া ব্লক করা হয়, শুধু আউটবাউন্ড কানেকশন অনুমোদিত। |
| block | এই জোনটি আগেরটির মতো, কিন্তু ইনকামিং রিকোয়েস্ট icmp-host-prohibited মেসেজ (IPv4-এর জন্য) বা icmp6-adm-prohibited মেসেজ (IPv6-এর জন্য) দিয়ে রিজেক্ট করা হয়। |
| public | পাবলিক, अनট্রাস্টেড নেটওয়ার্কের জন্য ব্যবহৃত হয়। আপনি একে একে ইনকামিং কানেকশন অনুমতি দিতে পারেন। |
| external | যখন আপনার ফায়ারওয়াল গেটওয়ে হিসেবে ব্যবহার করা হয় তখন যেকোনো এক্সটার্নাল নেটওয়ার্ককে বোঝায়। এটি মাস্কিং NAT-এর জন্য ব্যবহৃত হয়, যাতে আপনার ইন্টারনাল নেটওয়ার্ক প্রাইভেট থাকে, কিন্তু অ্যাক্সেসযোগ্য। |
| internal | external জোনের বিপরীত। হোস্টের পর্যাপ্ত ট্রাস্ট লেভেল থাকে, অতিরিক্ত কিছু সার্ভিস অ্যাক্সেসযোগ্য। |
| dmz | ডিমিলিটারাইজড জোন (DMZ)-এ থাকা কম্পিউটারগুলোর জন্য এই জোনটি ব্যবহৃত হয় এবং আপনার নেটওয়ার্কে অ্যাক্সেস নেই এমন আইসোলেটেড কম্পিউটারগুলোকে অন্তর্ভুক্ত করে। শুধু নির্বাচিত ইনকামিং কানেকশন অনুমোদিত। |
| work | আপনার ওয়ার্ক কম্পিউটারগুলোর জন্য জোন (নেটওয়ার্কের অধিকাংশ কম্পিউটার বিশ্বস্ত) |
| home | হোম নেটওয়ার্ককে বোঝায়। আপনি অন্যান্য অধিকাংশ কম্পিউটারকে বিশ্বাস করতে পারেন, কিন্তু শুধু নির্বাচিত ইনকামিং কানেকশন সাপোর্ট করা হয়। |
| trusted | নেটওয়ার্কের সব কম্পিউটার বিশ্বস্ত। এটি সবচেয়ে খোলা অপশন যা দায়িত্ববোধের সাথে ব্যবহার করতে হয়। |
Firewalld دو সেট নিয়ম ব্যবহার করে — permanent এবং runtime। Runtime নিয়মগুলো সার্ভার রিস্টার্ট পর্যন্ত সক্রিয় থাকে। ডিফল্টরূপে, আপনি firewalld-এ যে নিয়মগুলো যোগ করেন সেগুলো runtime মনে করা হয়। পার্মানেন্ট নিয়ম যোগ করতে, আপনাকে --permanent ফ্ল্যাগ ব্যবহার করতে হবে। এই নিয়মগুলো সার্ভার রিস্টার্টের পর প্রয়োগ হবে।
CentOS-এ FirewallD ইনস্টল ও এনাবল করা
CentOS 7/8-এ firewalld OS ইনস্টলেশনের সময় ডিফল্টরূপে ইনস্টল থাকে। আপনি যদি firewalld রিমুভ করে থাকেন এবং আবার ইনস্টল করতে চান, তবে স্ট্যান্ডার্ড yum/dnf প্যাকেজ ম্যানেজার ব্যবহার করতে পারেন:
# yum install firewalld -y — CentOS 7-এ
# dnf install firewalld -y — CentOS 8-এ

firewalld ডেমনটি অটোমেটিক্যালি стар্ট করার জন্য সেটিকে স্টার্টআপে যোগ করুন:
# systemctl enable firewalld
এবং চালু করুন:
# systemctl start firewalld
সার্ভিস স্ট্যাটাস চেক করুন:
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) Docs: man:firewalld(1) Main PID: 13646 (firewalld) CGroup: /system.slice/firewalld.service └─13646 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid systemd[1]: Starting firewalld - dynamic firewall daemon...
অথবা এই কমান্ড দিয়েও করতে পারেন:
# firewall-cmd --state
firewall-cmd কমান্ড হলো firewalld-এর nftables/iptables-এর ফ্রন্ট-এন্ড।
# firewall-cmd --state
running
FirewallD নিয়ম ম্যানেজমেন্ট
ডিফল্ট FirewallD নিয়ম
firewalld নিয়ম কনফিগার করার আগে, আপনাকে চেক করতে হবে কোন জোনটি ডিফল্ট হিসেবে ব্যবহৃত হচ্ছে:
# firewall-cmd --get-default-zone

যেহেতু আমরা এখনই firewalld ইনস্টল করেছি এবং এখনো কনফিগার করিনি, ডিফল্ট জোন হল public।
এ্যাক্টিভ জোন চেক করুন। শুধু একই জোন আছে — public:
# firewall-cmd --get-active-zones
public interfaces: eth0
আমরা দেখতে পাচ্ছি, eth0 ইন্টারফেস public জোন দ্বারা ম্যানেজ হচ্ছে।
CentOS নেটওয়ার্ক ইন্টারফেসের তালিকা নিচের মতো দেখতে পারেন:
# ip link show
# nmcli device status
এ্যাক্টিভ জোনগুলোর নিয়মগুলো দেখতে কমান্ডটি ব্যবহার করুন:
# firewall-cmd --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
এই লিস্টিং-এ দেখতে পাচ্ছেন যে, DHCP ক্লায়েন্ট এবং SSH-র সাথে সম্পর্কিত সাধারণ অপারেশনগুলো জোনে যোগ করা আছে।
উপলব্ধ জোনগুলো
সকল জোনের তালিকা দেখতে এই কমান্ড চালান:
# firewall-cmd --get-zones
আমার পাওয়া লিস্ট:
block dmz drop external home internal public trusted work
নির্দিষ্ট জোনের নিয়ম দেখতে কমান্ডে -zone ফ্ল্যাগ যোগ করুন:
# firewall-cmd --zone=home --list-all
home target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client mdns samba-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
সকল জোনের নিয়ম দেখতে:
# firewall-cmd --list-all-zones
ডিফল্ট জোন কীভাবে পরিবর্তন করবেন?
ডিফল্টরূপে সব নেটওয়ার্ক ইন্টারফেস public জোনে থাকে, তবে সেগুলো যেকোনো জোনে নিচের কমান্ড দিয়ে সরানো যায়:
# firewall-cmd --zone=home --change-interface=eth0
--zone= প্যারামিটারের পর আপনি যেই জোনটি চান সেটি নির্দিষ্ট করুন।
ডিফল্ট জোনকে home-এ পরিবর্তন করতে এই কমান্ড চালান:
# firewall-cmd --set-default-zone=home
FirewallD-এ অ্যাপ নিয়ম কীভাবে যোগ করবেন?
এক অ্যাপের জন্য পোর্ট খোলার জন্য, আপনি সার্ভিসটিকে এক্সেপশন হিসেবে যোগ করতে পারেন। উপলব্ধ সার্ভিসের তালিকা দেখতে নিচের কমান্ড ব্যবহার করুন:
# firewall-cmd --get-services

আউটপুটে অনেক সার্ভিস থাকবে। একটি সার্ভিসের বিস্তারিত তথ্য তার XML ফাইলে থাকে। এই ফাইলগুলো অবস্থিত /usr/lib/firewalld/services.-এ।
উদাহরণস্বরূপ:
# cd /usr/lib/firewalld/services
# cat smtp.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>Mail (SMTP)</short> <description>This option allows incoming SMTP mail delivery. If you need to allow remote hosts to connect directly to your machine to deliver mail, enable this option. You do not need to enable this if you collect your mail from your ISP's server by POP3 or IMAP, or if you use a tool such as fetchmail. Note that an improperly configured SMTP server can allow remote machines to use your server to send spam.</description> <port protocol="tcp" port="25"/> </service>
XML ফাইলে সার্ভিসের বিবরণ, প্রোটোকল এবং firewalld-এ খোলা থাকা পোর্ট নম্বর থাকে।

নিয়ম যোগ করার সময়, নির্দিষ্ট সার্ভিসের জন্য ফায়ারওয়াল অ্যাক্সেস অনুমতি দিতে --add-service প্যারামিটার ব্যবহার করতে পারেন:
# firewall-cmd --zone=public --add-service=http
# firewall-cmd --zone=public --add-service=https
নিয়ম যোগ করার পর, সার্ভিসগুলো নির্দিষ্ট জোনে যোগ হয়েছে কিনা চেক করুন:
# firewall-cmd --zone=public --list-services
dhcpv6-client http https ssh
আপনি যদি নিয়মগুলো পার্মানেন্ট করতে চান, তবে সেগুলো যোগ করার সময় --permanent প্যারামিটার ব্যবহার করুন।
এক জোন থেকে সার্ভিস রিমুভ করতে:
# firewall-cmd --permanent --zone=public --remove-service=http
# firewall-cmd --zone=public --permanent --list-services
dhcpv6-client https ssh test
আপনি যদি নিজের সার্ভিসটি এক্সেপশনে যোগ করতে চান, তবে নিজে XML ফাইল তৈরি করে সেখানে ডেটা নির্দিষ্ট করতে পারেন। যেকোনো সার্ভিস থেকে ডেটা কপি করে নাম, বিবরণ এবং পোর্ট নম্বর পরিবর্তন করুন।
smtp.xml ইউজার সার্ভিসের ডিরেক্টরিতে কপি করুন:
# cp /usr/lib/firewalld/services/smtp.xml /etc/firewalld/services
ফাইলে সার্ভিসের বিবরণ পরিবর্তন করুন।

XML ফাইলটিকেও রিনেম করতে হবে (আমি আমার সার্ভিসকে test নামে ডাকা)। তারপর firewalld রিস্টার্ট করুন এবং নিশ্চিত করুন আপনার সার্ভিস লিস্টে এসেছে:
# firewall-cmd --get-services
syslog-tls telnet test tftp
এখন আপনি সার্ভিসকে যেকোনো জোনে যোগ করতে পারেন:
# firewall-cmd --zone=public --add-service=test --permanent
# firewall-cmd --zone=public --permanent --list-services
dhcpv6-client http https ssh test
যদি লিস্টে কোনো সার্ভিস না পান, তবে আপনি নিচের কমান্ড দিয়ে firewalld-এ আপনার পছন্দের পোর্ট খুলতে পারেন:
# firewall-cmd --zone=public --add-port=77/tcp — TCP পোর্ট 77 খুলবে
# firewall-cmd --zone=public --add-port=77/udp — UDP পোর্ট 77 খুলবে
# firewall-cmd --zone=public --add-port=77-88/udp — UDP পোর্ট রেঞ্জ 77-88 খুলবে
# firewall-cmd --zone=public --list-ports — অনুমোদিত পোর্টের তালিকা দেখাবে
ICMP রিকোয়েস্ট ব্লক/অনুমতি দিতে:
# firewall-cmd --zone=public --add-icmp-block=echo-reply
# firewall-cmd --zone=public --remove-icmp-block=echo-reply
যোগ করা পোর্ট রিমুভ করতে:
# firewall-cmd --zone=public --remove-port=77/udp — UDP পোর্ট 77-এর জন্য runtime নিয়ম রিমুভ করবে
# firewall-cmd --permanent --zone=public --remove-port=77/udp — পার্মানেন্ট নিয়ম রিমুভ করবে

FirewallD-এ নতুন জোন কীভাবে তৈরি করবেন?
আপনি নিজের জোন তৈরি করতে পারেন (আমি আমারটিকে our নাম দিয়েছি):
# firewall-cmd --permanent --new-zone=our
নতুন জোন তৈরি করার পর, সার্ভিস তৈরির মতোই, আপনাকে firewalld রিস্টার্ট করতে হবে:
# firewall-cmd --reload
# firewall-cmd --get-zones
block dmz drop external home internal our public trusted work
our জোনটি এখন উপলব্ধ। আপনি এতে সার্ভিস যোগ করতে পারেন বা কিছু পোর্ট খুলতে পারেন।
Firewalld: IP অ্যাড্রেস ব্লক করা এবং এক্সেপশন তৈরি করা
আপনি firewalld-এ বিশ্বস্ত IP অ্যাড্রেস এক্সেপশনে যোগ করতে পারেন বা অনিচ্ছাকৃত IP অ্যাড্রেস ব্লক করতে পারেন।
আপনার সার্ভারে একটি IP অ্যাড্রেস (যেমন 8.8.8.8) এক্সেপশনে যোগ করতে এই কমান্ড চালান:
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.8.8" accept'
জোন চেক করুন এবং নিশ্চিত করুন যে IP অ্যাড্রেস rich-rules-এ এক্সেপশন হিসেবে যোগ হয়েছে:
# firewall-cmd --zone=public --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http https ssh test ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="8.8.8.8" accept
এক IP অ্যাড্রেস ব্লক করতে, accept-কে reject- দিয়ে রিপ্লেস করুন:
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.4.4" reject'
# firewall-cmd --zone=public --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http https ssh test ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="8.8.8.8" accept rule family="ipv4" source address="8.8.4.4" reject
আপনি একটি সার্ভিসকে শুধু নির্দিষ্ট IP অ্যাড্রেস থেকে রিকোয়েস্ট গ্রহণ করার জন্য অনুমতি দিতে পারেন:
#firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" service name="https" accept'আপনি যদি আপনার সার্ভারে সকল রিকোয়েস্ট দ্রুত ব্লক করতে চান, তবে panic কমান্ড ব্যবহার করুন:
# firewall-cmd --panic-onপ্যানিক মোড ডিজেবল করতে এই কমান্ড ব্যবহার করুন:
# firewall-cmd --panic-offঅথবা আপনার সার্ভার রিস্টার্ট করলেও হবে।
আপনি আপনার firewalld কনফিগারেশন লকডাউন করতে পারেন যাতে রুট প্রিভিলেজ वाली লোকাল সার্ভিসগুলো আপনার তৈরি করা ফায়ারওয়াল নিয়ম পরিবর্তন করতে না পারে:
# firewall-cmd --lockdown-onলকডাউন মোড ডিজেবল করতে:
# firewall-cmd --lockdown-offFirewallD দিয়ে পোর্ট ফরওয়ার্ডিং কনফিগারেশন
আপনি firewalld-এ পোর্ট ফরওয়ার্ডিং নিয়ম তৈরি করতে পারেন। TCP পোর্ট 443 কে 9090-এ ফরওয়ার্ড করতে:
# firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=9090 --permanentWindows-এ netsh ব্যবহার করে পোর্ট ফরওয়ার্ডিং কনফিগার করা যায়।
পোর্ট ফরওয়ার্ডিং নিয়ম রিমুভ করতে:
# firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=9090