کھلا چھوڑا گیا اور بھلا دیا گیا پورٹ سرور میں داخل ہونے کا روایتی راستہ ہے: عوامی ایڈریس پر ڈیٹابیس، ڈیبگ ڈیش بورڈ، کوئی کنٹینر جس نے ایسا پورٹ پبلش کر دیا جو کوئی نہیں چاہتا تھا۔ اگر آپ دو کمانڈز اور ایک جال جانتے ہیں تو جانچ ایک منٹ لیتی ہے۔ ہم نے نیچے دیا گیا سب کچھ اپنی امیج سے بنے نئے Ubuntu 24.04 سرور پر کیا اور دوسری مشین سے اسکین کیا، اس لیے آؤٹ پٹ وہی ہیں جو آپ اپنے سرور پر دیکھیں گے۔
1. کیا سن رہا ہے
کمانڈ ss ہے۔ حروف کا مطلب ہے TCP، UDP، سننے والے ساکٹس، پورٹ نمبر اور پروسیس کا نام:
sudo ss -tulpn
نئے سرور پر یہ چھ لائنیں پرنٹ کرتی ہے:
Netid State Local Address:Port Process
udp UNCONN 127.0.0.54:53 systemd-resolve
udp UNCONN 127.0.0.53%lo:53 systemd-resolve
tcp LISTEN 127.0.0.54:53 systemd-resolve
tcp LISTEN 127.0.0.53%lo:53 systemd-resolve
tcp LISTEN 0.0.0.0:22 sshd
tcp LISTEN [::]:22 sshd
اہم کالم Local Address ہے۔ یہ بتاتا ہے کہ کون کنیکٹ ہو سکتا ہے:
| ایڈریس | کون پہنچ سکتا ہے |
|---|---|
127.0.0.1:… یا 127.0.0.53 | صرف اسی سرور کے پروگرام |
0.0.0.0:… | IPv4 کے ذریعے کوئی بھی، جب تک فائر وال نہ روکے |
[::]:… | IPv6 کے ذریعے کوئی بھی (عموماً IPv4 بھی) |
10.0.0.5:… (مخصوص ایڈریس) | ہر وہ شخص جو اس ایڈریس تک پہنچ سکے |
یعنی نیا سرور باہر صرف ایک چیز ظاہر کرتا ہے: پورٹ 22 پر SSH، IPv4 اور IPv6 دونوں پر۔ 127.0.0.53 پر DNS ریزولور نجی ہے۔
صرف وہ دیکھنے کے لیے جو انٹرنیٹ دیکھ سکتا ہے، loopback ایڈریسز کو فلٹر کر دیں:
sudo ss -tlnp | awk 'NR>1 && $4 !~ /^(127\.|\[::1\])/ {print $4, $6}'
ہر انسٹالیشن کے بعد یہ چلائیں۔ ہم نے nginx، Docker اور ایک چھوٹی Python ایپ انسٹال کی تو فہرست 2 سے 10 لائنوں تک بڑھ گئی، جن میں 0.0.0.0:8081 پر docker-proxy اور ایک بے ترتیب localhost پورٹ پر containerd کا ساکٹ شامل تھا۔
2. کون سا پروسیس پورٹ استعمال کر رہا ہے
جب کوئی پورٹ مصروف ہو اور آپ جاننا چاہیں کہ کس نے لیا ہے:
sudo lsof -i :80 -P -n
sudo fuser 80/tcp
sudo ss -tlnp 'sport = :80'
سب سے آسانی سے پڑھا جانے والا lsof ہے۔ nginx کے لیے اس نے root کے طور پر ایک ماسٹر پروسیس اور www-data کے طور پر ایک ورکر دکھایا، دونوں *:80 پر، IPv4 اور IPv6 کے لیے۔ fuser صرف PID پرنٹ کرتا ہے جو اسکرپٹس میں کام آتا ہے۔ اگر پورٹ خالی کرنا ہو تو PID ختم کرنے کے بجائے سروس روکیں، ورنہ systemd اسے دوبارہ چلا دے گا: sudo systemctl stop nginx۔
3. انٹرنیٹ کیا دیکھتا ہے
ss سرور کا نقطۂ نظر دکھاتا ہے۔ انٹرنیٹ کا نقطۂ نظر مختلف ہو سکتا ہے، کیونکہ درمیان میں فائر وال ہے یا سروس 127.0.0.1 سے بندھی ہے۔ اصل تصویر دیکھنے کے لیے سرور کو کسی دوسری مشین سے اسکین کریں، اپنے لیپ ٹاپ یا دوسرے سرور سے۔ ٹول nmap ہے (apt install nmap، یا Windows اور macOS پر nmap.org کا انسٹالر)۔
nmap your-server-ip
nmap -p- your-server-ip
nmap -p 22,80,443,3306 your-server-ip
پہلی شکل سب سے عام 1,000 پورٹس، دوسری تمام 65,535 اور تیسری ایک فہرست چیک کرتی ہے۔ ہمارے نئے سرور پر، کسی فائر وال سے پہلے:
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 6.83 seconds
تمام 65,535 پورٹس کا مکمل اسکین 8.9 سیکنڈ میں ہوا اور وہی ایک پورٹ ملا۔ بند پورٹس فوراً reset سے جواب دیتے ہیں، اسی لیے ان کی اسکیننگ تیز ہوتی ہے۔
تین حالتیں اہم ہیں:
- open: کسی پروگرام نے کنکشن قبول کیا۔ یہی آپ کی حملے کی سطح ہے۔
- closed: سرور نے جواب دیا کہ وہاں کچھ نہیں سن رہا۔ محفوظ ہے، لیکن تصدیق کرتا ہے کہ سرور موجود ہے اور کیا نہیں چلا رہا۔
- filtered: کوئی جواب نہیں۔ فائر وال نے پیکٹ پھینک دیا۔ اسکینر نہیں جان سکتا کہ پیچھے کوئی سروس ہے یا نہیں۔
کچھ انسٹال کیے بغیر ایک پورٹ کے لیے nc -zv سرور-آئی-پی 443 جواب میں succeeded یا refused دیتا ہے، اور فلٹر شدہ پورٹ پر ٹائم آؤٹ تک رکا رہتا ہے۔ UDP کے لیے nmap میں -sU شامل کریں اور انتظار کے لیے تیار رہیں؛ ہمارے سرور پر تین عام UDP پورٹس 53، 123 اور 161 سب closed تھے۔
NAT پلانز کے لیے ایک نوٹ: انٹرنیٹ سے صرف وہ SSH پورٹ پہنچتا ہے جو ہم نے آپ کے لیے فارورڈ کیا ہے۔ مشترکہ ایڈریس کا اسکین ہمارا کنارہ دکھاتا ہے، آپ کا سرور نہیں، اور باقی پورٹس ناقابلِ رسائی ہیں چاہے ان پر کچھ بھی سن رہا ہو۔ اپنے IPv4 ایڈریس والے پلان پر ہر کھلا پورٹ آپ خود سنبھالتے ہیں۔
4. جو ضروری نہیں وہ بند کریں
تین طریقے، بہترین سے وسیع ترین تک۔
localhost سے باندھیں۔ اگر کوئی سروس صرف سرور کے پروگرام استعمال کرتے ہیں تو اسے 127.0.0.1 پر سننے دیں۔ ہم نے ایک چھوٹی ویب ایپ --bind 127.0.0.1 8080 کے ساتھ چلائی: ss نے اسے 127.0.0.1:8080 پر دکھایا اور باہر سے nmap نے 8080/tcp closed بتایا۔ ڈیٹابیسز کے لیے یہی درست ڈیفالٹ ہے: Ubuntu پر Redis، MySQL اور PostgreSQL شروع سے ہی localhost پر سنتے ہیں، اور Redis اور MySQL کے لیے ہماری گائیڈز اسے ایسا ہی رہنے دیتی ہیں۔
سروس روکیں۔ sudo systemctl disable --now نام سننے والے کو ہمیشہ کے لیے ہٹا دیتا ہے۔ ss سے تصدیق کریں کہ وہ غائب ہو گیا۔
فائر وال آن کریں۔ پہلے SSH، پھر جو آپ فراہم کرتے ہیں اسے اجازت دیں، پھر فعال کریں:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw enable
sudo ufw status verbose
باہر سے اسکین مکمل طور پر بدل گیا:
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
8081/tcp open blackice-icecap
Nmap done: 1 IP address (1 host up) scanned in 10.18 seconds
ہر غیر اجازت یافتہ پورٹ closed سے filtered ہو گیا، اور 65,535 پورٹس کا مکمل اسکین اب 8.9 کے بجائے 110 سیکنڈ لینے لگا۔ اسکینر کے لیے ہر پورٹ پر زیادہ وقت، آپ کے سرور کے بارے میں کم معلومات۔ ہماری UFW گائیڈ ریٹ لمٹ، ایک IP کو اجازت دینے اور IPv6 کا احاطہ کرتی ہے۔
لیکن تیسری لائن دیکھیں۔
5. Docker کا سرپرائز
پورٹ 8081 فائر وال آن ہونے اور اسے اجازت دینے والے کسی رول کے بغیر کھلا رہا۔ یہ پورٹ اس کنٹینر کا ہے جو ہم نے docker run -p 8081:80 nginx:alpine سے چلایا تھا۔ Docker کرنل کے فائر وال میں اپنے رولز شامل کرتا ہے اور یہ ufw کے رولز سے پہلے جانچے جاتے ہیں۔ ہمارے سرور پر اس نے یہ رول لکھا:
-A DOCKER ! -i docker0 -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.2:80
پورٹ 8081 کے لیے ہر پیکٹ ufw کے بولنے سے پہلے ہی کنٹینر میں بھیج دیا جاتا ہے۔ ہر وہ کنٹینر جس میں -p یا ports: کی انٹری ہو یہی کرتا ہے، اور ss اسے ایمانداری سے 0.0.0.0:8081 پر docker-proxy کے طور پر دکھاتا ہے۔
حل یہ ہے کہ صرف localhost پر پبلش کریں:
docker rm -f web
docker run -d --name web -p 127.0.0.1:8081:80 nginx:alpine
Compose میں ports: کے نیچے "127.0.0.1:8081:80" لکھیں۔ تبدیلی کے بعد ss نے 127.0.0.1:8081 دکھایا، Docker کے رول میں -d 127.0.0.1/32 شامل ہو گیا، اور باہر سے اسکین نے 8081/tcp filtered بتایا۔ عوامی طرف کے لیے HTTPS کے ساتھ nginx کو reverse proxy کے طور پر آگے رکھیں تاکہ سرور پر صرف پورٹس 22، 80 اور 443 کھلے ہوں۔
ہر تبدیلی کے بعد چیک لسٹ
sudo ss -tulpn: کیا0.0.0.0یا[::]والی ہر لائن وہی ہے جو آپ کھولنا چاہتے تھے؟- لیپ ٹاپ سے
nmap سرور-آئی-پی: کیا کھلے پورٹس میل کھاتے ہیں؟ - عوامی ایڈریس پر ڈیٹابیس، کیش یا ایڈمن پینل: آج ہی
127.0.0.1یا فائر وال کے پیچھے منتقل کریں۔ - Docker کی ہر
ports:انٹری: اگر عوامی ویب پورٹ نہیں تو کیا127.0.0.1:سے شروع ہوتی ہے؟ - SSH سب کے لیے کھلا ہے: fail2ban یا صرف کلید سے لاگ اِن شامل کریں۔
Windows Server پر یہی جانچ Get-NetTCPConnection -State Listen سے ہوتی ہے اور رولز Windows Firewall میں ہوتے ہیں۔ $3 والے Nano سے شروع ہونے والے ہر Linux پلان کا ایک ورژن اپنے IPv4 ایڈریس کے ساتھ ہے، اور وہاں جو آپ ss میں دیکھتے ہیں وہی پوری دنیا دیکھتی ہے، سوائے اس کے جو آپ کا فائر وال روکتا ہے۔
تبصرے
ابھی کوئی تبصرہ نہیں۔ پہلے بنیں۔