Câu trả lời:
Sử dụng "netstat" để kiểm tra các cổng hiện tại.
netstat -antp Proto Recv-Q Send-Q Địa chỉ địa phương Trạng thái địa chỉ nước ngoài PID / Tên chương trình tcp 0 0 xxx.xxx.xxx.xxx 0.0.0.0:* NGHE 16297 / được đặt tên tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* NGHE 16297 / được đặt tên tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* NGHE 16297 / được đặt tên tcp 0 0 127.0.0.1:53 0.0.0.0:* NGHE 16297 / được đặt tên
Đây (netstat) là giải pháp nhanh nhất ...
netstat -lnt
... nhưng điều này cho phép bạn kiểm soát nhiều hơn (với chi phí tốc độ (đôi khi rất nhiều tốc độ)) ...
lsof -n -i -a -u www-data
Ví dụ trên ví dụ cho bạn thấy tất cả các cổng TCP mở và ở LISTEN
trạng thái, AND ( -a
) thuộc về người dùng Apache ( www-data
).
Thử
lsof -i :<port number>
Nếu bạn nhận được bất kỳ kết quả nào, một cái gì đó đang lắng nghe và ràng buộc, ví dụ
# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1833 nobody 3u IPv4 51091229 0t0 TCP odessa.cheney.net:http->79.173.188.214:52918 (ESTABLISHED)
nginx 1833 nobody 5u IPv4 46221856 0t0 TCP odessa.cheney.net:http->66.36.243.182:37876 (CLOSE_WAIT)
nginx 1833 nobody 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN)
nginx 1833 nobody 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN)
nginx 1833 nobody 14u IPv4 46221857 0t0 TCP odessa.cheney.net:http->66.36.243.182:37880 (CLOSE_WAIT)
nginx 1833 nobody 15u IPv4 51091030 0t0 TCP odessa.cheney.net:http->msnbot-65-55-106-132.search.msn.com:51708 (ESTABLISHED)
nginx 11832 root 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN)
nginx 11832 root 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN)
netstat -tlnp
Hiển thị t
các cổng cp đang l
hoạt động, chỉ hiển thị các n
ô (không giải quyết tên - làm cho nó nhanh hơn) và hiển thị chế p
độ nghe đang thực hiện ( p
chỉ hoạt động nếu bạn đã root)
netstat -ulnp
Hiển thị u
các cổng dp đang l
hoạt động, chỉ hiển thị các n
ô (không giải quyết tên - làm cho nó nhanh hơn) và hiển thị chế p
độ nghe đang thực hiện ( p
chỉ hoạt động nếu bạn đã root)
netstat -unp
Hiển thị u
các cổng dp đang mở nhưng không nghe, chỉ hiển thị các n
ô (không giải quyết tên - làm cho nó nhanh hơn) và hiển thị chế p
độ nghe đang thực hiện ( p
chỉ hoạt động nếu bạn đã root)
netstat -an
Hiển thị a
các cổng đang sử dụng, chỉ hiển thị các n
ô - không giải quyết tên
lsof -i <proto>@<host>:<port>
ví dụ
lsof -i tcp@localhost:25
để xem có gì đang lắng nghe trên cổng localhost 25 / TCP hay không
lsof -i tcp@0.0.0.0:636
để xem liệu có bất kỳ ổ cắm nào cục bộ hoặc từ xa hoặc nghe (cục bộ) hoặc được kết nối với (cục bộ hoặc từ xa) cho bất kỳ máy chủ / giao diện nào
Bạn không đề cập đến giao thức nào bạn muốn sử dụng, tức là TCP hoặc UDP - và điều quan trọng là phải nhận ra rằng "cổng" không hoàn toàn giống như hệ thống hỗ trợ để phân tán các ổ cắm. Ví dụ: nếu hệ thống của bạn có nhiều địa chỉ IP thì cổng 80 có thể được sử dụng trên tất cả các địa chỉ IP (ứng dụng đã liên kết với "0.0.0.0" hoặc "::" hoặc với từng địa chỉ IP liên tiếp) hoặc có thể nằm trong địa chỉ IP chỉ sử dụng trên một tập hợp con của các địa chỉ IP đó.
Cách tốt nhất và chắc chắn nhất để xác định xem một cổng / địa chỉ là miễn phí và có sẵn là cố gắng liên kết với nó. Netcat là tiện dụng cho việc này.
nc -l [-s abcd] -p NN
sẽ cố gắng liên kết với cổng TCP NN trên (tùy chọn, mặc định sẽ là tất cả các địa chỉ) abcd Thêm tùy chọn -u để làm tương tự trong UDP.
Tiếp theo, để biết cổng có thực sự "mở" như bạn yêu cầu hay không - bạn cần bắt đầu xem xét các quy tắc tường lửa tiềm năng. Một lần nữa, điều dễ nhất là cố gắng kết nối với cổng. Sử dụng netcat như trên, trên máy chủ và từ máy khách sử dụng netcat để cố gắng kết nối với cổng bạn đã mở.
nc [-u] abcd NN
sẽ kết nối với cổng NN trên abcd, sử dụng UDP nếu cờ -u được chỉ định. Sau đó, bạn có thể nhập dữ liệu vào cuối máy khách và nó sẽ hiển thị trên máy chủ. Nếu không, bạn cần xem xét các công cụ cụ thể của hệ thống và mạng.
Điều này sẽ giúp bạn có một danh sách tất cả các cổng TCP đang sử dụng. Nó hoạt động trong bash trên Ubuntu và OS X.
netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq
Danh sách sẽ có một cổng trên mỗi dòng mà không có thêm thông tin.
for port in $(netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq); do echo EXECUTE COMMAND FOR PORT $port; done
Rất nhiều cách thực hiện đã mang lại cho tôi các vấn đề vì chúng không hoạt động trên linux và osx và / hoặc vì chúng không hiển thị các cổng được sử dụng bởi docker hoặc các quy trình thuộc sở hữu của root. Bây giờ tôi chỉ sử dụng chương trình javascript này:
(đảm bảo rằng bạn đã cài đặt nút và nó hoạt động node
không chỉ nodejs
hoặc thay đổi chương trình phù hợp)
lưu các mục sau vào một tệp được gọi check-port
trong đường dẫn của bạn hoặc trong dự án của bạn
#!/usr/bin/env node
var http = require('http');
var app = new http.Server();
app.listen(process.argv[2], () => {
process.exit(0)
});
đặt quyền
chmod +x path/to/check-port
chạy từ con đường của bạn
check-port 8080
hoặc chạy từ cùng một thư mục
./check-port 8080
Cho đến nay nó đang hoạt động khá tốt.