จะปิดพอร์ตใน Linux ได้อย่างไร


38

ฉันมีคำถามบางอย่างในการปิดพอร์ตฉันคิดว่าฉันได้สิ่งแปลก ๆ

เมื่อฉันใช้รัน

nmap --top-ports 10 192.168.1.1

แสดงว่าพอร์ต 23 / TCP เปิดอยู่

แต่เมื่อฉันรัน

nmap --top-ports 10 localhost

มันแสดงให้เห็นว่าพอร์ต 23 / tcp ถูกปิด

ข้อใดต่อไปนี้เป็นจริง ฉันต้องการปิดพอร์ตนี้ในทั้งระบบของฉันฉันจะทำอย่างไร


10
พวกเขาเป็นทั้งจริง พอร์ต TCP ไม่ได้เชื่อมโยงกับโฮสต์ พวกมันเกี่ยวข้องกับเน็ตเวิร์กอินเตอร์เฟส ความแตกต่างนั้นบอบบาง แต่สำคัญ อินเทอร์เฟซมักจะเหมือนกับโฮสต์ แต่ไม่เสมอไป ในกรณีนี้ (ตามที่ระบุไว้ในคำตอบ) localhostกำลังเข้าถึงloอินเทอร์เฟซ (วนรอบ) ที่อยู่ IP กำลังเชื่อมต่ออินเทอร์เฟซที่แท้จริงของคุณอาจeth0หรือwlan0หรืออย่างใดอย่างหนึ่ง
strugee

3
ความไร้เดียงสาที่ชัดเจนของคำถามนี้นำไปสู่คำตอบที่ยอดเยี่ยม ขอบคุณสำหรับคำถาม!
dotancohen

คำตอบ:


47

Nmap เป็นเครื่องสแกนพอร์ตที่ยอดเยี่ยม แต่บางครั้งคุณต้องการสิ่งที่เชื่อถือได้มากกว่า คุณสามารถถามเคอร์เนลว่ากระบวนการใดมีพอร์ตที่เปิดโดยใช้netstatยูทิลิตี้:

me @ myhost: ~ $ sudo netstat -tlnp
การเชื่อมต่ออินเทอร์เน็ตที่ใช้งาน (เซิร์ฟเวอร์เท่านั้น)
Proto Recv-Q ผู้ส่งในท้องถิ่นที่อยู่ต่างประเทศที่อยู่รัฐชื่อ PID / ชื่อโปรแกรม
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1004 / dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 822 / cupsd       
tcp6 0 0 ::: 22 ::: * ฟัง 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * ฟัง 822 / cupsd       

ตัวเลือกที่ฉันได้รับคือ:

  • -t TCP เท่านั้น
  • -l ฟังพอร์ตเท่านั้น
  • -n อย่าค้นหาบริการและชื่อโฮสต์เพียงแสดงหมายเลข
  • -p แสดงข้อมูลกระบวนการ (ต้องใช้สิทธิ์รูท)

ในกรณีนี้เราสามารถเห็นได้ว่าsshdกำลังฟังบนอินเตอร์เฟสใด ๆ ( 0.0.0.0) พอร์ต 22 และcupsdกำลังฟังบนลูปแบ็ค ( 127.0.0.1) พอร์ต 631 เอาต์พุตของคุณอาจแสดงว่าtelnetdมีที่อยู่ในตัวของ192.168.1.1:23ซึ่งหมายความว่ามันจะไม่ตอบรับการเชื่อมต่อบนอะแดปเตอร์ย้อนกลับ (เช่นคุณทำไม่ได้telnet 127.0.0.1)

มีเครื่องมืออื่น ๆ ที่จะแสดงข้อมูลที่คล้ายกัน (เช่นlsofหรือ/proc) แต่ netstat นั้นมีอยู่อย่างกว้างขวางที่สุด มันใช้งานได้กับ Windows ( netstat -anb) BSD netstat นั้นแตกต่างกันเล็กน้อย: คุณจะต้องใช้sockstat (1)เพื่อรับข้อมูลกระบวนการแทน

เมื่อคุณมี ID กระบวนการและชื่อโปรแกรมคุณสามารถไปที่การค้นหากระบวนการและฆ่ามันหากคุณต้องการที่จะปิดพอร์ต สำหรับการควบคุมที่ละเอียดยิ่งขึ้นคุณสามารถใช้ไฟร์วอลล์ (iptables บน Linux) เพื่อ จำกัด การเข้าถึงเฉพาะบางที่อยู่ คุณอาจต้องปิดการใช้งานบริการเริ่มต้น ถ้า PID คือ "-" บน Linux อาจเป็นกระบวนการเคอร์เนล (ซึ่งเป็นเรื่องปกติกับ NFS เป็นต้น) ดังนั้นขอให้โชคดีในการค้นหาว่ามันคืออะไร

หมายเหตุ: ฉันพูดว่า "เชื่อถือ" เพราะคุณไม่ได้ถูกขัดขวางโดยสภาพเครือข่ายและไฟร์วอลล์ ถ้าคุณเชื่อใจในคอมพิวเตอร์ของคุณมันยอดเยี่ยมมาก อย่างไรก็ตามหากคุณสงสัยว่าคุณถูกแฮ็คคุณอาจไม่สามารถเชื่อถือเครื่องมือในคอมพิวเตอร์ของคุณได้ การแทนที่ยูทิลิตี้มาตรฐาน (และบางครั้งก็เรียกระบบ) ด้วยคนที่ซ่อนกระบวนการหรือพอร์ตบางอย่าง (รูทคิท) เป็นวิธีปฏิบัติมาตรฐานในหมู่ผู้โจมตี ทางออกที่ดีที่สุดของคุณคือการทำสำเนาทางนิติเวชของดิสก์และกู้คืนจากการสำรองข้อมูล จากนั้นใช้สำเนาเพื่อกำหนดวิธีที่พวกเขาเข้าไปและปิดมัน


14

ระบบลีนุกซ์มีอินเตอร์เฟสแบบย้อนกลับที่เรียกว่าซึ่งใช้สำหรับการสื่อสารภายใน ชื่อโฮสต์ของมันคือlocalhostและที่อยู่ IP 127.0.0.1ของมันคือ

เมื่อคุณเรียกใช้nmapบนlocalhostคุณทำงานจริง portscan บนเสมือนติดต่อย้อนกลับ 192.168.1.1เป็นที่อยู่ IP ของคุณทางกายภาพ (ส่วนใหญ่มีแนวโน้มeth0) อินเตอร์เฟซ

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

หากคุณเปิดพอร์ต TCP 23 อาจเป็นไปได้ว่าคุณมีtelnetเซิร์ฟเวอร์ที่ใช้งานอยู่ (ซึ่งไม่ใช่สิ่งที่ดีเนื่องจากไม่มีการเข้ารหัส) หรือคุณมีม้าโทรจันบางชนิดในเครื่องของคุณ


1
ดังนั้นฉันจะปิดได้อย่างไร
user74080

4
@ user74080 คุณสามารถเพิ่มiptablesกฎเพื่อให้ได้คำตอบที่ใกล้เคียง แต่จะทำให้บริการไม่ได้ใช้งานซึ่งสิ้นเปลืองทรัพยากร ดังนั้นหากคุณtelnetdใช้งานเพียงแค่ปิดเครื่อง
psimon

12

หากต้องการ "ปิด" พอร์ตที่คุณสามารถใช้ได้ iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP

1
ในคำตอบนี้ "การปิดพอร์ต" หมายถึง "เพิกเฉยต่อการรับส่งข้อมูล" พอร์ตยังคงเปิดอยู่ แต่ไม่สามารถเข้าถึงได้อีกต่อไป นอกจากนี้โปรดทราบว่าDROPมันทำตามที่ระบุไว้มันจะเห็นแพ็คเก็ตแล้วไม่สนใจมัน โดยปกติ (ไม่เปิดใช้งาน iptables) เคอร์เนลจะส่งพอร์ต ICMP ที่ไม่สามารถเข้าถึงแพ็กเก็ตกลับมาได้ (ซึ่งสามารถจำลองด้วยREJECTเป้าหมายแทนDROP)
Lekensteyn

3
@Lekensteyn ICMP พอร์ตไม่สามารถเข้าถึงได้สำหรับ UDP แพ็คเก็ตที่เหมาะสมในการตอบกลับด้วยเป็นแพ็คเก็ต TCP RST ซึ่งนอกจากนี้ยังสามารถสร้างขึ้นโดยใช้เป้าหมายโดยการเขียนREJECT -j REJECT --reject-with tcp-reset
kasperd

แม้จะมีคะแนนต่ำกว่านี่เป็นคำตอบแรกที่ตอบคำถามได้จริง ใครก็ตามที่สามารถเพิ่มคะแนนเพิ่มเติมได้ที่นี่โปรดทำเช่นนั้น
EnzoR

2

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

พอร์ต 23 ใช้สำหรับ telnet ปกติจะไม่ใช้อีกต่อไป ลองทำnmap -sV 192.168.1.1เพื่อค้นหาว่าโปรแกรมใดเปิดพอร์ต

(192 ... เป็น IP เครือข่ายท้องถิ่นดังนั้นผลลัพธ์ของnmap <your outside world IP>จะให้ผลลัพธ์ที่แตกต่างเนื่องจากการตั้งค่าไฟร์วอลล์ที่เป็นไปได้ ฯลฯ )


1

หากคุณมีบริการที่ทำงานและฟังพอร์ต 23 เป็น arguably ทำความสะอาดเพื่อหยุดกระบวนการที่ฟังพอร์ต 23 (อาจจะtelnet) มากกว่าที่จะให้มันทำงานและปิดหรือบล็อกพอร์ต 23 iptablesโดยใช้

เมื่อไม่มีกระบวนการฟังบนพอร์ตแม้ในกรณีที่ไม่มีบล็อกไฟร์วอลล์ความพยายามใด ๆ ที่จะเชื่อมต่อกับมันควรส่งผลให้เกิดการ "ปฏิเสธการเชื่อมต่อ" ทันที ( ECONNREFUSEDเพื่อconnect(2))

วิธีหนึ่งในการค้นหากระบวนการ (และ pid ของมัน) ที่ฟังพอร์ต 23 หากมีกระบวนการดังกล่าวคือ:

sudo lsof -i -P | grep ':23 '

ใน-iรายการด้านบนแสดงพอร์ตอินเทอร์เน็ตแบบเปิด (ทั้ง UDP และ TCP) และ -P ยับยั้งการแปลพอร์ตเป็นชื่อบริการ (ผ่าน/etc/services)

หลังจากที่คุณพบว่ากระบวนการทำงานฟังพอร์ต 23 คุณสามารถคิดออกวิธีการที่จะได้เริ่มต้นโดยดูที่ต้นไม้กระบวนการ (มีพูดpstree) หากพาเรนต์ของมันinit(มีโอกาสมาก) คุณอาจค้นหาชื่อซ้ำของกระบวนการภายใต้/etcซ้ำ เช่น:

sudo grep -r telnet /etc

วิธีนี้จะนำคุณไปสู่วิธีที่ดีที่สุดในการปิดใช้งานไม่ให้ทำงานในอันดับที่ 1


ไม่จำเป็นต้องใช้ grep (และถ้าไม่มีก็ไม่จำเป็นต้องมีเครื่องหมายคำพูด) sudo lsof -Pi :23คุณสามารถใช้
Théophile

คำพูดอยู่ที่นั่นด้วยเหตุผลที่ดี เพื่อให้แน่ใจว่ามีเฉพาะพอร์ตเทลเน็ต ( 23) เท่านั้น หากคุณไม่ได้เว้นวรรคหลังจาก:23นั้นจะจับคู่:234และ:2345อื่น ๆ
ซื้อได้ที่

อ่าฉันเข้าใจแล้ว ที่เหมาะสมสำหรับ grep ดูเหมือนว่าคำสั่งที่ไม่มี grep ( lsof -Pi :23) จะค้นหาการจับคู่ที่ตรงกัน
Théophile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.