
اشرح لماذا قد يكون منفذ TCP على Linux قابلاً للوصول أو غير قابل للوصول
يشرح PortClue لماذا قد يكون منفذ TCP على جهاز Linux قابلاً للوصول أو غير قابل للوصول.
فهو يحوّل حالة المقبس (socket) والعملية (process) والجدار الناري (firewall) وDocker إلى سلسلة أدلة قصيرة
بدلاً من إجبارك على ربط ss و/proc وnftables وiptables وdocker inspect يدوياً.

شغّله بدون تحديد منفذ لاكتشاف نقاط نهاية TCP المحلية التي تستحق الانتباه:
$ sudo portclue
LOCAL TCP LISTENERS
PORT SERVICE CONFIDENCE BIND OWNER SOURCE BIND SCOPE
22 OpenSSH server HIGH 0.0.0.0,:: ssh.service host ALL_INTERFACES
8080 NGINX web server HIGH 0.0.0.0,:: nginx host ALL_INTERFACES
8443 api service MEDIUM 192.0.2.10 demo-api docker SPECIFIC_INTERFACE
9000 Python HTTP server MEDIUM 127.0.0.1 python3 host LOOPBACK_ONLY
BIND SCOPE describes socket binding, not firewall reachability.
Run `portclue PORT` for the complete evidence chain and local exposure verdict.
تصف ALL_INTERFACES وSPECIFIC_INTERFACE وLOOPBACK_ONLY المكان الذي يقبل فيه
المقبس حركة المرور. وهي لا تدّعي عمداً أن جداراً نارياً يسمح بذلك.
افحص منفذاً للحصول على تحليل الجدار الناري المحلي الكامل:
$ sudo portclue 8080
POTENTIAL EXTERNAL EXPOSURE
TCP port 8080
0.0.0.0:8080/tcp [POTENTIAL]
Service NGINX web server
Category web
Confidence HIGH
Identity evidence executable basename matched "nginx"
-> LISTEN NETLINK_INET_DIAG reports socket inode 123456 bound to 0.0.0.0:8080/tcp
-> OWNED PID 4242 (nginx), systemd unit nginx.service
-> ALL_INTERFACES 0.0.0.0 accepts traffic addressed to any local interface
-> ACCEPT nftables: a direct rule matches TCP destination port 8080 and returns accept
Unknown outside this machine:
- router port forwarding
- cloud firewall or security group
- upstream NAT, including carrier-grade NAT
[!IMPORTANT] PortClue v0.1 هو نموذج أولي مبكر ومتحفظ لنظام Linux. تعني
POTENTIALأن المسار المحلي المرصود يسمح بحركة المرور؛ وهو لا يدّعي أن المنفذ قابل للوصول من الإنترنت العام. تنتج تعبيرات الجدار الناري غير المدعومةUNKNOWN.
ss أو lsofNETLINK_INET_DIAG، وهي نفس واجهة
النواة التي يستخدمها ss، وتأتي تفاصيل العمليات من /proc. لا يتم تحليل أي شيء من مخرجات
أداة أخرى، لذا فإن حاوية لا تحتوي على ss ولا lsof تحصل مع ذلك على
المستمع ومالكه. تحليل الجدار الناري يشغّل nft أو iptables-save، ويبلّغ
عن UNKNOWN بدونهما.ss -ltnp المقبس ومعرّف العملية (PID).
أما ما إذا كان هذا الربط (bind) محلياً فقط (loopback-only)، وما إذا كانت قاعدة جدار ناري تسمح به، وما إذا كان
المنفذ نشراً لـ Docker بدلاً من مستمع على المضيف، فهو عمل كنت ستقوم به يدوياً.UNKNOWN، وليس
إجابة خاطئة واثقة.NETLINK_INET_DIAG، وليس عبر استخراج مخرجات ss/procsystemctl shownft --json list rulesetiptables-save عندما تكون nftables غير متاحةيحدّد PortClue ما ينتمي إليه المنفذ قبل شرح التعرض. تُرتَّب الأدلة بالترتيب التالي:
/etc/services.المالك الفعلي يتجاوز دائماً اسم المنفذ الاصطلاحي. إذا كان اصطلاح المنفذ فقط
معروفاً، تُوسَم الهوية صراحةً بثقة LOW. الكتالوج المضمّن مخزّن في
internal/identify/catalog.json ويُشحن
داخل الملف التنفيذي الواحد؛ ولا يقوم PortClue بتنزيل بيانات الهوية أثناء التشغيل.
PortClue للقراءة فقط. فهو لا يتصل بالمنفذ المفحوص، ولا يفحص مضيفاً آخر، ولا يغيّر قواعد الجدار الناري، ولا يوقف العمليات أو الحاويات، ولا يرفع البيانات، ولا يشغّل خادماً (daemon).
يعمل على Linux (amd64 وarm64). يقوم السكربت بتنزيل أرشيف GitHub
Release المطابق، والتحقق من SHA256SUMS، وتثبيت ملف تنفيذي واحد. وهو
لا يعدّل إعدادات الصدفة (shell config).
تثبيت المستخدم (الافتراضي، بدون root). يثبّت في ~/.local/bin، مملوكاً لك:
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh
portclue
يعمل تثبيت المستخدم بدون root ويبلّغ عن الأدلة المتاحة
لحسابك، مع الإشارة إلى ما هو مفقود. هذا كافٍ لاستكشاف المستمعات وخرائط
Docker. ولأن sudo لا يبحث في ~/.local/bin وهذا الملف التنفيذي
قابل للكتابة من قبل مستخدمك، لا تشغّل هذه النسخة باستخدام sudo.
تثبيت النظام (مملوك لـ root، من أجل sudo portclue). يقرأ PortClue الأدلة
الأكثر اكتمالاً (/proc المقيّد، وحالة الجدار الناري الكاملة) بصلاحيات root. لذلك،
ثبّت ملفاً تنفيذياً مملوكاً لـ root في /usr/local/bin (يستخدم السكربت sudo فقط
في خطوة التثبيت النهائية، وليس للتنزيل أو الاستخراج):
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh -s -- --system
sudo portclue
تجاوزات اختيارية: PORTCLUE_VERSION=0.1.2 (بدون v البادئة) و
PORTCLUE_INSTALL_DIR لأي من الوضعين.
إلغاء التثبيت:
# user install
rm ~/.local/bin/portclue
# system install
sudo rm /usr/local/bin/portclue
# or, matching how you installed:
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh -s -- --uninstall
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh -s -- --system --uninstall
نزّل portclue-VERSION-linux-ARCH.tar.gz وSHA256SUMS المطابقين من
GitHub Releases، وتحقق من
المجموع الاختباري (checksum)، ثم ثبّت:
sha256sum -c SHA256SUMS --ignore-missing
tar -xzf portclue-0.1.2-linux-amd64.tar.gz # or linux-arm64
sudo install -m 0755 portclue-0.1.2-linux-amd64/portclue /usr/local/bin/portclue
portclue --version
تعيين المعمارية:
uname -m | Archive |
|---|---|
x86_64 | linux-amd64 |
aarch64, arm64 | linux-arm64 |
يتضمن كل أرشيف الملف التنفيذي، وREADME، ورخصة Apache-2.0، وإشعارات الأطراف الثالثة.
يتطلب Linux وGo 1.27+:
go install github.com/pbxqdown/portclue/cmd/[email protected]
يضع هذا الملف التنفيذي في $(go env GOPATH)/bin. يُفضَّل استخدام
أرشيف الإصدار المُتحقَّق من مجموعه الاختباري أو سكربت التثبيت عندما تريد مخرجات تثبيت قابلة لإعادة الإنتاج.
المتطلبات: Linux وGo 1.27 أو أحدث.
go build -o portclue ./cmd/portclue
./portclue
./portclue --json
./portclue 8080
./portclue --json 8080
يقبل وضع النظرة العامة مرشّحات اختيارية (تبقى الحقول المتجاهَلة غير مقيّدة):