Cách kiểm tra các cổng đang mở hoặc lắng nghe trong Linux

Tác giả NetworkEngineer, T.Một 29, 2021, 11:11:55 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách kiểm tra các cổng đang mở hoặc lắng nghe trong Linux


Cho dù bạn đang khắc phục sự cố kết nối mạng hay ấu hình tường lửa, một trong những điều đầu tiên cần kiểm tra là cổng nào thực sự được mở trên hệ thống của bạn.

Bài viết này mô tả một số cách tiếp cận để tìm ra những cổng nào được mở ra bên ngoài trên hệ thống Linux của bạn.

1. Cổng mở hoặc đang lắng nghe là gì.

Cổng lắng nghe là một cổng mạng mà một ứng dụng sẽ lắng nghe. Bạn có thể lấy danh sách các cổng đang nghe trên hệ thống của mình bằng cách truy vấn với các lệnh như ss, netstat hoặc lsof. Mỗi cổng lắng nghe có thể được mở hoặc đóng (lọc) bằng cách sử dụng tường lửa.

Nói chung, một cổng mở là một cổng mạng chấp nhận các gói đến từ các vị trí từ xa.

Ví dụ: nếu bạn đang chạy một máy chủ web lắng nghe các cổng 80 và 443 các cổng đó đang mở trên tường lửa của bạn, thì bất kỳ ai (ngoại trừ các địa chỉ IP bị chặn) sẽ có thể truy cập các trang web được lưu trữ trên máy chủ web của bạn bằng trình duyệt của họ. Trong trường hợp này, cả hai 80 và 443 đều là cổng mở.

Các cổng mở có thể gây ra rủi ro bảo mật vì mỗi cổng mở có thể bị kẻ tấn công sử dụng để khai thác lỗ hổng hoặc thực hiện bất kỳ kiểu tấn công nào khác. Bạn chỉ nên để lộ các cổng cần thiết cho chức năng của ứng dụng và đóng tất cả các cổng khác.

2. Kiểm tra các cổng mở bằng nmap.

Nmap là một công cụ quét mạng mạnh mẽ có thể quét các máy chủ đơn và các mạng lớn. Nó chủ yếu được sử dụng để kiểm tra bảo mật và kiểm tra thâm nhập.

Nếu có sẵn, nmap nên là công cụ đầu tiên của bạn khi nói đến quét cổng. Bên cạnh việc quét cổng, nmap cũng có thể phát hiện địa chỉ Mac, loại hệ điều hành, phiên bản Kernel và nhiều hơn nữa.

Lệnh sau được đưa ra từ bảng điều khiển để xác định cổng nào đang lắng nghe kết nối TCP từ mạng.

Mã nguồn [Chọn]
# sudo nmap -sT -p- 10.10.8.8
Lệnh -sT yêu cầu nmap quét các cổng TCP và -p- quét tất cả 65535 cổng. Nếu -p không được sử dụng nmap sẽ chỉ quét 1000 cổng phổ biến nhất.

Mã nguồn [Chọn]
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-09 23:10 CEST
Nmap scan report for 10.10.8.8
Host is up (0.0012s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 08:00:27:05:49:23 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds

Kết quả trên cho thấy rằng chỉ có các cổng 22, 80 và 8069 được mở trên hệ thống đích. Để quét các cổng UDP, hãy sử dụng -sU thay vì -sT.

Mã nguồn [Chọn]
# sudo nmap -sU -p- 10.10.8.8
Để biết thêm thông tin, hãy truy cập trang chủ của nmap và đọc về tất cả các tùy chọn mạnh mẽ khác của công cụ này.

3. Kiểm tra các cổng mở bằng Netcat.

Netcat (hoặc nc) là một công cụ dòng lệnh có thể đọc và ghi dữ liệu qua các kết nối mạng, sử dụng giao thức TCP hoặc UDP.

Với Netcat bạn có thể quét một cổng hoặc một dãy cổng.

Ví dụ: để quét các cổng TCP đang mở trên một máy từ xa có địa chỉ IP 10.10.8.8 trong phạm vi, 20-80 bạn sẽ sử dụng lệnh sau:

Mã nguồn [Chọn]
# nc -z -v 10.10.8.8 20-80
Các -z tùy chọn bảo nc để quét chỉ cho cổng mở, mà không gửi bất kỳ dữ liệu và -v là để biết thêm thông tin tiết.

Đầu ra sẽ giống như sau:

Mã nguồn [Chọn]
nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused
nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
...
Connection to 10.10.8.8 80 port [tcp/http] succeeded!

Nếu bạn muốn chỉ các dòng có cổng mở được in trên màn hình, hãy lọc kết quả bằng grep.

Mã nguồn [Chọn]
# nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded
Mã nguồn [Chọn]
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
Connection to 10.10.8.8 80 port [tcp/http] succeeded!

Để quét các cổng UDP, hãy chuyển tùy chọn -u vào lệnh nc:

Mã nguồn [Chọn]
# nc -z -v -u 10.10.8.8 20-80 2>&1 | grep succeeded
Cấu trúc 2>&1 chuyển hướng lỗi tiêu chuẩn đến đầu ra tiêu chuẩn.

4. Kiểm tra các cổng đang mở bằng Bash Pseudo Device.

Một cách khác để kiểm tra xem một cổng nhất định đang mở hay đóng là sử dụng Bash Pseudo Device /dev/tcp/.. hoặc /dev/udp/..

Khi thực hiện một lệnh trên /dev/$PROTOCOL/$HOST/$IP, Bash sẽ mở kết nối TCP hoặc UDP đến máy chủ lưu trữ được chỉ định trên cổng được chỉ định.

Câu lệnh if..else sau sẽ kiểm tra xem cổng 443 trên kernel.org có đang mở hay không:

Mã nguồn [Chọn]
if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null'
then
  echo "Port is open"
else
  echo "Port is closed"
fi

Mã nguồn [Chọn]
Port is open
Đoạn mã trên hoạt động như thế nào?

Khi kết nối với một cổng bằng thiết bị Bash Pseudo, thời gian chờ mặc định là rất lớn, vì vậy chúng ta đang sử dụng timeout để tắt lệnh kiểm tra sau 5 giây. Nếu kết nối được thiết lập đến kernel.org trên cổng 443, lệnh kiểm tra sẽ trả về true.

Để kiểm tra một dải cổng, hãy sử dụng vòng lặp for:

Mã nguồn [Chọn]
for PORT in {20..80}; do
  timeout 1 bash -c "</dev/tcp/10.10.8.8/$PORT &>/dev/null" &&  echo "port $PORT is open"
done

Đầu ra sẽ giống như sau:

Mã nguồn [Chọn]
port 22 is open
port 80 is open

5. Phần kết luận.

Chúng ta đã chỉ cho bạn một số công cụ mà bạn có thể sử dụng để quét các cổng đang mở. Ngoài ra còn có các tiện ích và phương pháp khác để kiểm tra các cổng đang mở, ví dụ: bạn có thể sử dụng socket mô-đun Python curl, telnet hoặc wget.

Nếu bạn có bất kỳ câu hỏi hoặc nhận xét nào, vui lòng để lại bình luận bên dưới.