ตรวจสอบว่าพอร์ตเปิดหรือปิดบนเซิร์ฟเวอร์ Linux หรือไม่


209

ฉันจะตรวจสอบว่าพอร์ตกำลังฟังบนเซิร์ฟเวอร์ Linux ได้อย่างไร


2
ยังไม่ชัดเจนว่าคุณถามอะไร "เปิด" คุณหมายถึงอะไร คุณหมายถึงเซิร์ฟเวอร์กำลังฟังพอร์ตอยู่หรือไม่ หรือคุณหมายถึงไฟร์วอลล์ของระบบอนุญาต หรืออะไร?
David Schwartz

ฉันคิดว่าพอร์ตกำลังถูกบล็อกบนเซิร์ฟเวอร์ของฉันและต้องการยกเลิกการปิดกั้น / เปิดอีกครั้ง
James Anderson

14
netstat -an | grep PORTNUMBER | grep -i listenหากเอาต์พุตไม่มีพอร์ตแสดงว่าไม่ได้ใช้งาน
automatix

คำตอบ:


187

คุณสามารถตรวจสอบว่ากระบวนการรับฟังพอร์ต TCP หรือ UDP ด้วยnetstat -tuplenหรือไม่

ในการตรวจสอบว่าพอร์ตบางพอร์ตสามารถเข้าถึงได้จากด้านนอก (นี่อาจเป็นสิ่งที่คุณต้องการ) คุณสามารถใช้เครื่องสแกนพอร์ตเช่นNmapจากระบบอื่น การเรียกใช้ Nmap บนโฮสต์เดียวกันกับที่คุณต้องการตรวจสอบนั้นค่อนข้างไร้ประโยชน์สำหรับจุดประสงค์ของคุณ


54
GNU netstat รู้พารามิเตอร์-t, -u, -p, -l, และ-e -nขอบคุณที่ตัวเลือก parser -tuplenมันสามารถแสดงเป็น linux.die.net/man/8/netstat
joschi

3
นอกจากนี้telnetคำสั่งมักจะรองรับ TCP เท่านั้นดังนั้นคุณจะโชคไม่ดีถ้าบริการที่คุณต้องการตรวจสอบทำงานบนโปรโตคอลอื่น
joschi

1
ใช่ฉันใช้ windows ดังนั้นความสับสน
เด็กซ์เตอร์

2
nc เป็นทางเลือกที่ดีกว่าสำหรับ telnet รองรับ UDP ด้วย
Tsvetomir Dimitrov

1
ใช้กับ sudo netstat -tuplensudo: สิ่งนี้จะให้กระบวนการที่คุณเป็นเจ้าของไม่ใช่เพียงแค่คุณ แต่เป็นกระบวนการอื่น ๆ และจะพิมพ์รายละเอียดเพิ่มเติม (เช่น PID / ชื่อโปรแกรม) หากพวกเขาไม่ได้แสดงเป็นผู้ใช้ที่ไม่ใช่รูท
John Red

102

วิธีที่เร็วที่สุดในการทดสอบว่าพอร์ต TCP เปิดอยู่หรือไม่ (รวมถึงไฟร์วอลล์ฮาร์ดแวร์ที่คุณอาจมี) คือพิมพ์จากคอมพิวเตอร์ระยะไกล (เช่นเดสก์ท็อปของคุณ):

telnet myserver.com 80

ซึ่งจะพยายามเปิดการเชื่อมต่อกับพอร์ต 80 บนเซิร์ฟเวอร์นั้น หากคุณหมดเวลาหรือปฏิเสธพอร์ตจะไม่เปิดขึ้น :)


1
บอกว่ามันไม่รู้จัก "เทลเน็ต" เป็นคำสั่ง ...
เจมส์เดอร์สัน

6
"yum install telnet" เพื่อติดตั้งแพ็คเกจไคลเอ็นต์ telnet
cjc

8
เขียนด้านบน:if you get a time out or deny, the port is not open
อุตสาหกรรม

2
ถ้าคุณไม่มี perms ในการติดตั้ง telnet มีเครื่องมือมาตรฐานอื่นหรือไม่
KC Baltz

3
ฉันลอง“ telnet myhost 22” และหมดเวลา แต่ฉันสามารถ ssh เข้าไปในเครื่องนั้นได้ ?!
Torsten Bronger

30

ตกลงโดยสรุปคุณมีเซิร์ฟเวอร์ที่คุณสามารถเข้าสู่ระบบได้ คุณต้องการดูว่ามีบางอย่างกำลังฟังอยู่บนพอร์ตบ้างไหม ในฐานะที่เป็น root ให้เรียกใช้:

netstat -nlp

สิ่งนี้จะแสดงรายการกระบวนการที่กำลังฟังบนพอร์ต TCP และ UDP คุณสามารถสแกน (หรือ grep) สำหรับกระบวนการที่คุณสนใจและ / หรือหมายเลขพอร์ตที่คุณคาดว่าจะเห็น

หากกระบวนการที่คุณคาดว่าไม่ได้มีคุณควรเริ่มกระบวนการนั้นและตรวจสอบ netstat อีกครั้ง หากกระบวนการนั้นอยู่ที่นั่น แต่กำลังฟังบนอินเทอร์เฟซและพอร์ตที่คุณไม่ได้คาดไว้นั่นก็คือปัญหาการกำหนดค่า (เช่นมันอาจจะฟัง แต่บนอินเทอร์เฟซแบบย้อนกลับเท่านั้นดังนั้นคุณจะเห็น 127.0.0.1:3306 และ ไม่มีบรรทัดอื่นสำหรับพอร์ต 3306 ในกรณีของการกำหนดค่าเริ่มต้นสำหรับ MySQL)

หากกระบวนการนี้เกิดขึ้นและกำลังฟังพอร์ตที่คุณคาดหวังคุณสามารถลองใช้ "telnet" ไปยังพอร์ตนั้นจาก Macbook ของคุณในสำนักงาน / ที่บ้านของคุณเช่น

 telnet xxxxxxxxxxxx.co.uk 443

ที่จะทดสอบว่า (สมมติว่าพอร์ตมาตรฐาน) มีเว็บเซิร์ฟเวอร์ที่กำหนดค่าไว้สำหรับ SSL โปรดทราบว่าการทดสอบนี้โดยใช้ telnet จะทำงานได้ก็ต่อเมื่อกระบวนการกำลังรับฟังพอร์ต TCP หากเป็นพอร์ต UDP คุณอาจลองกับไคลเอ็นต์ที่คุณกำลังจะใช้เพื่อเชื่อมต่อ (ฉันเห็นว่าคุณใช้พอร์ต 224 นี่คือ masqdialer และฉันไม่รู้ว่ามันคืออะไร)

หากบริการอยู่ที่นั่น แต่คุณไม่สามารถเข้าถึงได้จากภายนอกแสดงว่ามีไฟร์วอลล์ที่บล็อกคุณ ในกรณีดังกล่าวให้เรียกใช้:

 iptables -L -n

นี่จะแสดงกฎไฟร์วอลล์ทั้งหมดตามที่กำหนดไว้ในระบบของคุณ คุณสามารถโพสต์ได้ แต่โดยทั่วไปหากคุณไม่อนุญาตให้ทุกอย่างในเครือข่าย INPUT คุณอาจต้องอนุญาตการรับส่งข้อมูลบนพอร์ตที่เป็นปัญหาอย่างชัดเจน:

 iptables -I INPUT -p tcp --dport 224 -j ACCEPT

หรือบางสิ่งบางอย่างตามสายเหล่านั้น อย่าเรียกใช้คำสั่งไฟร์วอลล์ของคุณสุ่มสี่สุ่มห้าตามสิ่งที่คนแปลกหน้าบางคนบอกคุณบนอินเทอร์เน็ต พิจารณาสิ่งที่คุณทำ

หากไฟร์วอลล์ของคุณในกล่องอนุญาตการรับส่งข้อมูลที่คุณต้องการ บริษัท โฮสติ้งของคุณอาจใช้ไฟร์วอลล์ (เช่นพวกเขาอนุญาตให้ SSH (22 / tcp), HTTP (80 / tcp) และ HTTPS (443 / tcp) เท่านั้น และปฏิเสธการรับส่งข้อมูลอื่น ๆ ทั้งหมด) ในกรณีนี้คุณจะต้องเปิดตั๋วฝ่ายช่วยเหลือเพื่อแก้ไขปัญหานี้ แต่ฉันคิดว่าอาจมีบางอย่างใน cPanel ของคุณที่อาจอนุญาต


คุณช่วยเพิ่มวิธีการเลิกคำสั่ง iptables -I ได้ไหม ขอบคุณ !!
Evgeny

1
"iptables -D" ตามด้วยสิ่งอื่นที่คุณมีหลังจาก "-I" ในคำสั่งดั้งเดิม โดยทั่วไปให้ค้นหาเอกสาร
cjc

11

ฉันใช้คอมโบของnetstatและlsof:

netstat -an | grep <portnumber>
lsof -i:<portnumber>

เพื่อดูว่ามีการใช้พอร์ตและสิ่งที่ใช้อยู่


ไม่มีสิ่งใดแจ้งว่ามีหรือไม่มี sudo
Dheeraj Thedijje

1
@DheerajThedijje - พอร์ตนั้นไม่เปิด
วอร์เรน

ใช่มันไม่ได้รับมัน
Dheeraj Thedijje

7

หากคุณเชื่อมต่อกับระบบและสามารถเรียกใช้คำสั่งในฐานะ root คุณสามารถตรวจสอบผลลัพธ์ของ iptables

iptables -L -vn

นี้จะแสดงรายการกฎไฟร์วอลล์และพอร์ตที่มีเป้าหมายเปิดACCEPTและปิดพอร์ตใด ๆ REJECTอย่างชัดเจนกำหนดเป้าหมาย


และถ้าคุณมี firewalld ก็ง่ายเช่นfirewall-cmd --query-port=port/protocol firewall-cmd --query-port=80/tcp
Agostino

6

lsof -i :ssh จะแสดงรายการกระบวนการทั้งหมดที่เปิดพอร์ต ssh ทั้งการเชื่อมต่อการฟังและการใช้งาน


คำนำหน้าsudoถ้ามันไม่ส่งคืนผลลัพธ์ใด ๆ
Elijah Lynn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.