Linux में ufw सेटअप: सर्वर पर firewall और nftables की बुनियाद
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 है। वह हुक (hooks) देता है: होस्ट पर आने वाला ट्रैफ़िक, बाहर जाने वाला, और बीच से गुज़रने वाला (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 सेटअप चरण-दर-चरण
चरण 1. डिफ़ॉल्ट नीतियाँ
डिफ़ॉल्ट नीति यह तय करती है कि कोई पैकेट किसी नियम से मेल न खाए तो क्या किया जाए। सर्वर के लिए सुरक्षित तरीका है: इनकमिंग बंद, आउटगोइंग खुला।
$ 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), इसलिए जवाब के लिए पोर्ट खोलने की ज़रूरत नहीं।
चरण 2. SSH की अनुमति दें
$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)
OpenSSH एक एप्लिकेशन प्रोफ़ाइल है। अगर SSH किसी गैर-मानक पोर्ट पर सुन रहा है, तो उसे साफ़ तौर पर खोलें: sudo ufw allow 2222/tcp। असल में कौन-सा पोर्ट sshd सुन रहा है, यह sudo ss -tlnp | grep sshd से देखें।
चरण 3. सेवाओं के पोर्ट खोलें
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
प्रोटोकॉल ज़रूर लिखें: /tcp के बिना ufw पोर्ट TCP और UDP दोनों के लिए खोल देगा, और बेवजह खुला दरवाज़ा किसी काम का नहीं।
चरण 4. 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 सेशन बंद न करें: दूसरा सेशन खोलकर जाँच लें कि कनेक्शन चल रहा है।
चरण 5. नियम जाँचें
$ 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 बाकी सबके लिए बंद रहता है। इसके अलावा DBMS को भी केवल आंतरिक पते पर सुनने के लिए सेट करें: 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 नियम कनेक्शन की अनुमति देता है, पर वह पता ब्लॉक कर देता है जिसने 30 सेकंड में 6 या उससे ज़्यादा कनेक्शन खोले हों:
$ sudo ufw limit OpenSSH
Rule updated
यह पासवर्ड के बड़े पैमाने पर ब्रूट-फ़ोर्स के खिलाफ़ सरल सुरक्षा है। गंभीर सुरक्षा के लिए सिर्फ़ key से लॉगिन चालू करें और चाहें तो 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, और बाहर की पहुँच reverse proxy (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 भी है — कई प्रदाताओं के पास security groups होते हैं; वहाँ भी पोर्ट खोलना होगा।
- 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: с нуля до уверенного администрирования” कोर्स में अभ्यास के साथ विस्तार से समझाया गया है।
कोर्स पर जाएँ