Làm thế nào để đóng cổng trong Linux?


38

Tôi có một số câu hỏi trong việc đóng cổng, tôi nghĩ rằng tôi đã nhận được một số điều kỳ lạ.

Khi tôi sử dụng thực thi

nmap --top-ports 10 192.168.1.1

nó cho thấy cổng 23 / TCP đang mở.

Nhưng khi tôi thi hành

nmap --top-ports 10 localhost

nó cho thấy cổng 23 / tcp đã bị đóng.

Điều nào trong số họ là đúng? Tôi muốn đóng cổng này trên toàn bộ hệ thống của mình, làm thế nào tôi có thể làm điều đó?


10
cả hai đều đúng Các cổng TCP không được liên kết với máy chủ. chúng được liên kết với các giao diện mạng. sự khác biệt là tinh tế nhưng quan trọng. giao diện thường giống như máy chủ, nhưng không phải lúc nào cũng vậy. trong trường hợp này (như đã nêu trong câu trả lời) localhostđang truy cập vào logiao diện (loopback). Địa chỉ IP đang tích hợp giao diện thực của bạn, có thể eth0hoặc wlan0hoặc somesuch.
strugee

3
Sự ngây thơ rõ ràng của câu hỏi này đã dẫn đến một số câu trả lời tuyệt vời. Cảm ơn vì đã hỏi!
dotancohen

Câu trả lời:


47

Nmap là một trình quét cổng tuyệt vời, nhưng đôi khi bạn muốn một cái gì đó có thẩm quyền hơn. Bạn có thể hỏi kernel những quy trình nào có cổng nào mở bằng cách sử dụng netstattiện ích:

tôi @ myhost: ~ $ sudo netstat -tlnp
Kết nối Internet đang hoạt động (chỉ máy chủ)
Proto Recv-Q Send-Q Địa chỉ cục bộ Trạng thái địa chỉ nước ngoài PID / Tên chương trình
tcp 0 0 127.0.0.1:53 0.0.0.0:* NGHE 1004 / dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* NGHE 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* NGHE 822 / cupsd       
tcp6 0 0 ::: 22 ::: * NGHE 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * NGHE 822 / cupsd       

Các tùy chọn tôi đã đưa ra là:

  • -t Chỉ TCP
  • -l Chỉ nghe cổng
  • -n Đừng tra cứu tên dịch vụ và máy chủ, chỉ hiển thị số
  • -p Hiển thị thông tin quá trình (yêu cầu quyền root)

Trong trường hợp này, chúng ta có thể thấy rằng sshdđang lắng nghe trên bất kỳ 0.0.0.0cổng giao diện ( ) cổng 22 nào và cupsdđang nghe trên cổng loopback ( 127.0.0.1) 631. Đầu ra của bạn có thể hiển thị telnetdcó địa chỉ cục bộ 192.168.1.1:23, nghĩa là nó sẽ không trả lời các kết nối trên bộ điều hợp loopback (ví dụ bạn không thể telnet 127.0.0.1).

Có những công cụ khác sẽ hiển thị thông tin tương tự (ví dụ lsofhoặc /proc), nhưng netstat là công cụ có sẵn rộng rãi nhất. Nó thậm chí hoạt động trên Windows ( netstat -anb). BSD netstat hơi khác một chút: bạn sẽ phải sử dụng sockstat (1) để lấy thông tin quy trình thay thế.

Khi bạn có ID tiến trình và tên chương trình, bạn có thể tìm kiếm quy trình và giết nó nếu bạn muốn đóng cổng. Để kiểm soát chi tiết hơn, bạn có thể sử dụng tường lửa (iptables trên Linux) để giới hạn quyền truy cập chỉ vào một số địa chỉ nhất định. Bạn có thể cần phải vô hiệu hóa một dịch vụ khởi động. Nếu PID là "-" trên Linux, thì đó có thể là một quá trình hạt nhân (ví dụ như điều này phổ biến với NFS), vì vậy chúc may mắn tìm ra nó là gì.

Lưu ý: Tôi đã nói "có thẩm quyền" vì bạn không bị cản trở bởi các điều kiện mạng và tường lửa. Nếu bạn tin tưởng máy tính của bạn, điều đó thật tuyệt. Tuy nhiên, nếu bạn nghi ngờ rằng mình đã bị hack, bạn có thể không tin tưởng các công cụ trên máy tính của mình. Thay thế các tiện ích tiêu chuẩn (và đôi khi cả các cuộc gọi hệ thống) bằng các tiện ích ẩn các quy trình hoặc cổng nhất định (còn gọi là rootkit) là một thông lệ tiêu chuẩn giữa những kẻ tấn công. Đặt cược tốt nhất của bạn tại thời điểm này là tạo một bản sao pháp y của đĩa của bạn và khôi phục từ bản sao lưu; sau đó sử dụng bản sao để xác định cách họ vào và đóng nó lại.


14

Một hệ thống Linux có giao diện loopback được gọi là giao tiếp nội bộ. Tên máy chủ của nó là localhostvà địa chỉ IP của nó là 127.0.0.1.

Khi bạn chạy nmaptrên localhost, bạn thực sự chạy portscan trên giao diện loopback ảo . 192.168.1.1là địa chỉ IP của giao diện vật lý (rất có thể eth0) của bạn.

Vì vậy, bạn đã chạy nmaptrên hai giao diện mạng khác nhau, đây là lý do tại sao có sự khác biệt trong các cổng mở. Cả hai đều đúng.

Nếu bạn mở cổng TCP 23, có khả năng bạn có một telnetmáy chủ đang chạy (điều này không tốt do thiếu mã hóa) hoặc bạn có một loại ngựa trojan nào đó trên máy của mình.


1
vậy làm thế nào tôi có thể đóng nó?
dùng74080

4
@ user74080 Bạn có thể thêm một iptablesquy tắc như một câu trả lời gần đó cho thấy, nhưng nó sẽ giữ cho dịch vụ không được sử dụng, tiêu tốn tài nguyên. Vì vậy, nếu bạn đã telnetdchạy, chỉ cần tắt nó.
psimon

12

Để "đóng" cổng bạn có thể sử dụng iptables

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

1
Trong câu trả lời này, "đóng cổng" có nghĩa là "bỏ qua bất kỳ lưu lượng truy cập nào đến nó". Cổng vẫn mở, nhưng không thể truy cập được nữa. Cũng lưu ý rằng DROPnhư đã nói, nó nhìn thấy gói và sau đó bỏ qua nó. Thông thường (không bật iptables), kernel sẽ gửi lại gói ICMP không thể truy cập được của cổng (có thể được mô phỏng với REJECTmục tiêu thay vì DROP).
Lekensteyn

3
@Lekensteyn Cổng ICMP không thể truy cập được dành cho UDP. Gói thích hợp để trả lời là gói TCP RST, cũng có thể được tạo bằng cách sử dụng REJECTđích bằng cách viết -j REJECT --reject-with tcp-reset.
kasperd

Mặc dù điểm thấp hơn, đây là câu trả lời đầu tiên để thực sự trả lời câu hỏi. Bất cứ ai có thể thêm nhiều điểm ở đây, xin vui lòng làm như vậy.
EnzoR

2

Nếu bạn làm như vậy nmap localhost, nó sẽ cho bạn biết về một tình huống khác: một số chương trình trên linux hoạt động như máy chủ mặc dù chúng chỉ được sử dụng cục bộ. Điều này là do các chương trình khác sử dụng chúng như một máy chủ mà chúng kết nối. Vì vậy, cả hai câu trả lời đều đúng, vì bạn hỏi điều gì đó khác nhau.

Cổng 23 được sử dụng cho telnet. Bình thường không dùng nữa. Cố gắng làm nmap -sV 192.168.1.1để tìm ra chương trình nào mở cổng.

(192 ... là một IP mạng cục bộ, do đó, kết quả nmap <your outside world IP>cũng sẽ cho một kết quả khác, vì có thể cài đặt tường lửa, v.v.)


1

Nếu bạn có một dịch vụ đang chạy và nghe trên cổng 23, thì có thể ngăn chặn quá trình lắng nghe cổng 23 (có thể telnet) hơn là giữ cho nó chạy và đóng hoặc chặn cổng 23 bằng cách sử dụng iptables.

Khi không có quá trình lắng nghe trên một cổng, ngay cả khi không có khối tường lửa, mọi nỗ lực kết nối với cổng đó sẽ dẫn đến việc "kết nối bị từ chối" ngay lập tức ( ECONNREFUSEDđến connect(2))

Một cách để tìm quá trình (và pid của nó) lắng nghe trên cổng 23, nếu có quy trình như vậy, là:

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

Trong các -idanh sách trên, các cổng internet mở (cả UDP và TCP) và -P ngăn cản việc dịch các cổng thành tên dịch vụ (thông qua /etc/services)

Sau khi bạn tìm thấy quy trình đang nghe trên cổng 23, bạn có thể tìm hiểu làm thế nào nó bắt đầu bằng cách nhìn vào cây quy trình (với giả sử, pstree). Nếu cha mẹ của nó là init(rất có thể), bạn có thể tìm kiếm đệ quy tên của quy trình theo /etc. ví dụ:

sudo grep -r telnet /etc

Điều này sẽ dẫn bạn đến cách tốt nhất để vô hiệu hóa nó chạy ở vị trí số 1.


Không cần sử dụng grep (và nếu có, không cần báo giá). Bạn có thể sử dụng sudo lsof -Pi :23.
Théophile

Các trích dẫn là có lý do tốt. Để đảm bảo chỉ có cổng telnet ( 23) được khớp. Nếu bạn không bao gồm một khoảng :23:234:2345
trắng

Ah tôi thấy. Điều đó có ý nghĩa cho grep. Ngẫu nhiên, có vẻ như lệnh không có grep ( lsof -Pi :23) tìm kiếm một kết hợp chính xác.
Théophile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.