it-swarm-vi.tech

Kiểm tra xem cổng được mở hay đóng trên máy chủ Linux?

Làm cách nào để kiểm tra xem một cổng có đang lắng nghe trên máy chủ Linux không?

228
James Anderson

Bạn có thể kiểm tra xem một quy trình có lắng nghe trên một TCP hoặc cổng UDP với netstat -tuplen.

Để kiểm tra xem một số cổng có thể truy cập được từ bên ngoài hay không (đây có thể là những gì bạn muốn), bạn có thể sử dụng trình quét cổng như Nmap from other system. Chạy Nmap trên cùng một Máy chủ bạn muốn kiểm tra là khá vô dụng cho mục đích của bạn.

195
joschi

Cách nhanh nhất để kiểm tra xem a TCP có mở không (bao gồm mọi tường lửa phần cứng bạn có thể có), là nhập từ máy tính từ xa (ví dụ: máy tính để bàn của bạn):

telnet myserver.com 80

Mà sẽ cố gắng mở một kết nối đến cổng 80 trên máy chủ đó. Nếu bạn hết thời gian hoặc từ chối, cổng không mở :)

108
Adrian Macneil

OK, tóm lại, bạn có một máy chủ mà bạn có thể đăng nhập. Bạn muốn xem nếu một cái gì đó đang lắng nghe trên một số cổng. Là root, chạy:

netstat -nlp

điều này sẽ hiển thị danh sách các quy trình đang nghe trên TCP và các cổng UDP. Bạn có thể quét (hoặc grep) nó cho quá trình bạn quan tâm và/hoặc số cổng bạn muốn thấy .

Nếu quy trình bạn mong đợi không có ở đó, bạn nên bắt đầu quy trình đó và kiểm tra lại netstat. Nếu quá trình ở đó, nhưng nó đang lắng nghe trên một giao diện và cổng mà bạn không mong đợi, thì có vấn đề về cấu hình (ví dụ: nó có thể đang nghe, nhưng chỉ trên giao diện loopback, vì vậy bạn sẽ thấy 127.0.0.1:3306 và không có dòng nào khác cho cổng 3306, trong trường hợp cấu hình mặc định cho MySQL).

Nếu quá trình kết thúc và nó đang lắng nghe cổng bạn mong đợi, bạn có thể thử chạy "telnet" tới cổng đó từ Macbook trong văn phòng/nhà của bạn, ví dụ:

 telnet xxxxxxxxxxxx.co.uk 443

Điều đó sẽ kiểm tra xem (giả sử các cổng tiêu chuẩn) có máy chủ web được cấu hình cho SSL hay không. Lưu ý rằng thử nghiệm sử dụng telnet này sẽ chỉ hoạt động nếu quá trình đang lắng nghe trên một cổng TCP. Nếu đó là cổng UDP, bạn cũng có thể thử với bất kỳ ứng dụng khách nào bạn sẽ sử dụng kết nối với nó. (Tôi thấy rằng bạn đã sử dụng cổng 224. Đây là masqdialer và tôi không biết đó là gì).

Nếu dịch vụ ở đó, nhưng bạn không thể truy cập bên ngoài, thì sẽ có tường lửa chặn bạn. Trong trường hợp đó, hãy chạy:

 iptables -L -n

Điều này sẽ hiển thị tất cả các quy tắc tường lửa như được xác định trên hệ thống của bạn. Bạn có thể đăng bài đó, nhưng, nói chung, nếu bạn không cho phép mọi thứ trên chuỗi INPUT, có lẽ bạn sẽ cần phải cho phép rõ ràng lưu lượng truy cập trên cổng được đề cập:

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

hoặc một cái gì đó dọc theo các đường dây. Đừng chạy các lệnh tường lửa của bạn một cách mù quáng dựa trên những gì một người lạ đã nói với bạn trên Internet. Hãy xem xét những gì bạn đang làm.

Nếu tường lửa của bạn trên hộp cho phép lưu lượng truy cập bạn muốn, thì công ty lưu trữ của bạn có thể đang chạy tường lửa (ví dụ: họ chỉ cho phép SSH (22/tcp), HTTP (80/tcp) và HTTPS (443/tcp) và từ chối tất cả lưu lượng truy cập đến khác). Trong trường hợp này, bạn sẽ cần mở một vé trợ giúp với họ để giải quyết vấn đề này, mặc dù tôi cho rằng có thể có một cái gì đó trong cPanel của bạn có thể cho phép điều đó.

32
cjc

Tôi sử dụng kết hợp của netstatlsof:

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

Để xem cổng đang được sử dụng, và những gì đang sử dụng nó.

12
warren

Nếu bạn được kết nối với hệ thống và có thể chạy lệnh dưới quyền root thì bạn có thể kiểm tra đầu ra của iptables

iptables -L -vn

điều này sẽ liệt kê các quy tắc tường lửa và cổng nào là mục tiêu mở ACCEPT và bất kỳ mục tiêu cổng nào được đóng rõ ràng REJECT.

8
user9517

lsof -i :ssh sẽ liệt kê tất cả các quy trình với cổng ssh mở, cả kết nối nghe và hoạt động.

6
pgs

Nếu bạn cần kịch bản một bài kiểm tra như vậy, giải pháp của Serhii Popov (xem bình luận cho câu hỏi) có lẽ là tốt nhất vì nc có khả năng tìm kiếm ngăn xếp TCP để mở cổng thay vì cố gắng kết nối thực tế.

Hình thức đơn giản nhất là:

nc -z <ip> <port>

Lệnh trả về true nếu tìm thấy kết hợp <ip>:<port> Đã chỉ định khi được mở (nghĩa là một trong các dịch vụ của bạn đang lắng nghe).

Vì vậy, bây giờ bạn có thể viết một tập lệnh để đợi cho đến khi cổng được mở:

while ! nc -z <ip> <port>
do
    sleep 1
done

Lưu ý 1: Tôi đã thử tùy chọn dòng lệnh -w Và điều đó dường như không làm gì cả. Dù bằng cách nào, lệnh trả về ngay lập tức. Tôi nghĩ rằng -w Không hữu ích với -z.

Lưu ý 2: để giúp gỡ lỗi, hãy thử với tùy chọn dòng lệnh -v.

0
Alexis Wilke