EQVPS

VPS پر کھلے پورٹس کیسے چیک کریں: کیا سن رہا ہے، انٹرنیٹ کیا دیکھتا ہے اور Docker کا سرپرائز

وہ ہر پورٹ دیکھیں جس پر آپ کا سرور سن رہا ہے، اس کے پیچھے والا پروسیس تلاش کریں، سرور کو باہر سے اسی طرح اسکین کریں جیسے حملہ آور کرے گا، اور جو ضروری نہیں وہ بند کریں۔ اس میں Docker کا وہ پورٹ بھی شامل ہے جو فائر وال آن ہونے پر بھی کھلا رہتا ہے۔ ہر عدد نئے Ubuntu 24.04 سرور پر ناپا گیا۔

کھلا چھوڑا گیا اور بھلا دیا گیا پورٹ سرور میں داخل ہونے کا روایتی راستہ ہے: عوامی ایڈریس پر ڈیٹابیس، ڈیبگ ڈیش بورڈ، کوئی کنٹینر جس نے ایسا پورٹ پبلش کر دیا جو کوئی نہیں چاہتا تھا۔ اگر آپ دو کمانڈز اور ایک جال جانتے ہیں تو جانچ ایک منٹ لیتی ہے۔ ہم نے نیچے دیا گیا سب کچھ اپنی امیج سے بنے نئے 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 کھلے ہوں۔

ہر تبدیلی کے بعد چیک لسٹ

  1. sudo ss -tulpn: کیا 0.0.0.0 یا [::] والی ہر لائن وہی ہے جو آپ کھولنا چاہتے تھے؟
  2. لیپ ٹاپ سے nmap سرور-آئی-پی: کیا کھلے پورٹس میل کھاتے ہیں؟
  3. عوامی ایڈریس پر ڈیٹابیس، کیش یا ایڈمن پینل: آج ہی 127.0.0.1 یا فائر وال کے پیچھے منتقل کریں۔
  4. Docker کی ہر ports: انٹری: اگر عوامی ویب پورٹ نہیں تو کیا 127.0.0.1: سے شروع ہوتی ہے؟
  5. SSH سب کے لیے کھلا ہے: fail2ban یا صرف کلید سے لاگ اِن شامل کریں۔

Windows Server پر یہی جانچ Get-NetTCPConnection -State Listen سے ہوتی ہے اور رولز Windows Firewall میں ہوتے ہیں۔ $3 والے Nano سے شروع ہونے والے ہر Linux پلان کا ایک ورژن اپنے IPv4 ایڈریس کے ساتھ ہے، اور وہاں جو آپ ss میں دیکھتے ہیں وہی پوری دنیا دیکھتی ہے، سوائے اس کے جو آپ کا فائر وال روکتا ہے۔

عمومی سوالات

نئے VPS پر کون سے پورٹس کھلے ہوتے ہیں؟

ہماری Ubuntu 24.04 امیج پر صرف ایک: پورٹ 22 پر SSH۔ اس کے علاوہ صرف 127.0.0.53 اور 127.0.0.54 پر لوکل DNS ریزولور سنتا ہے جس تک انٹرنیٹ نہیں پہنچ سکتا۔ دوسری مشین سے تمام 65,535 TCP پورٹس کی اسکیننگ نے ٹھیک ایک کھلا پورٹ پایا۔

closed اور filtered پورٹ میں کیا فرق ہے؟

closed کا مطلب ہے کہ سرور نے جواب دیا کہ وہاں کچھ نہیں سن رہا، اس لیے اسکینر کو فوراً پتا چل جاتا ہے۔ filtered کا مطلب ہے کوئی جواب نہیں، فائر وال پیکٹ پھینکتے وقت یہی کرتا ہے۔ دونوں گھس بیٹھیوں کو باہر رکھتے ہیں، لیکن filtered یہ بھی چھپاتا ہے کہ کون سی سروسز موجود ہیں اور ہمارے سرور پر مکمل اسکین کو تقریباً بارہ گنا سست کر دیتا ہے۔

ss ایک پورٹ دکھاتا ہے جسے nmap closed کہتا ہے، کیوں؟

سروس صرف 127.0.0.1 یعنی loopback ایڈریس پر سن رہی ہے۔ خود سرور پر موجود پروگرام کنیکٹ ہو سکتے ہیں، باہر سے کوئی نہیں۔ ss میں Local Address کالم دیکھیں: 127.0.0.1:8080 نجی ہے، 0.0.0.0:8080 یا [::]:8080 انٹرنیٹ سے قابلِ رسائی ہے اگر فائر وال اجازت دے۔

میں نے ufw آن کیا، پھر بھی Docker کا پورٹ کیوں کھلا ہے؟

Docker اپنے فائر وال رولز لکھتا ہے جو ufw کے رولز سے پہلے چیک ہوتے ہیں۔ -p 8081:80 سے چلایا گیا کنٹینر ہمارے سرور پر ufw آن ہونے اور 8081 کے لیے کوئی رول نہ ہونے کے باوجود باہر سے قابلِ رسائی تھا۔ اس کے بجائے localhost پر پبلش کریں، -p 127.0.0.1:8081:80، اور عوامی طرف کے لیے آگے nginx یا Caddy رکھیں۔

اپنے کمپیوٹر سے پورٹ کیسے چیک کروں؟

ایک پورٹ کے لیے nc -zv سرور-آئی-پی 443 چلائیں، یا nmap انسٹال کر کے سب سے عام ہزار پورٹس کے لیے nmap سرور-آئی-پی چلائیں۔ NAT پلان پر انٹرنیٹ سے صرف آپ کا فارورڈ کیا گیا SSH پورٹ جواب دیتا ہے؛ باقی سب جان بوجھ کر ناقابلِ رسائی ہے۔

تبصرے

ابھی کوئی تبصرہ نہیں۔ پہلے بنیں۔

ایک تبصرہ چھوڑیں

تبصرے ظاہر ہونے سے پہلے moderate کیے جاتے ہیں۔