Cách gỡ lỗi mạng linux: Địa chỉ đã được sử dụng


10

Tôi có một hộp linux Slackware nơi tôi không thể bắt đầu bất kỳ dịch vụ nào nghe trên một cổng cụ thể trên localhost. Bằng cách sử dụng strace tôi phát hiện ra rằng lỗi xảy ra trong bind()cuộc gọi và lỗi là EADDRINUSE (Address already in use):

bind(3, {sa_family=AF_INET, sin_port=htons(874), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EADDRINUSE (Address already in use)

Điều này xảy ra với bất kỳ quá trình nào tôi cố gắng bắt đầu nghe trên cổng đó, vì vậy nó không liên quan đến chính quá trình đó. Đầu ra strace ở trên đến từ lệnh strace -ff nc -l -p 874 -s 127.0.0.1.

Vì vậy, điều này cho thấy có một quá trình đã lắng nghe trên cổng localhost 874. Tuy nhiên, tôi dường như không thể tìm thấy nó. Tất cả các lệnh sau đây không trả về gì cả:

netstat -aplunt | grep :874
netstat -na | grep :874
lsof -i :874
lsof -i tcp | grep 874
fuser 874/tcp
socklist | grep 874
iptables -t filter -S | grep 874
iptables -t nat -S | grep 874
iptables -t mangle -S | grep 874
conntrack -L | grep 874

Nếu tôi cố nghe trên 0.0.0.0:874đó thì thất bại với cùng một lỗi. Nghe trên một trong những địa chỉ IP được cấu hình trên nic hoạt động tốt và nghe 127.0.0.2:874cũng hoạt động tốt. Nghe trên một cổng khác hoạt động tốt, cũng trên 127.0.0.1hoặc 0.0.0.0.

Vì vậy, bây giờ tôi tò mò. Làm cách nào tôi có thể tìm hiểu lý do tại sao ngăn xếp mạng trả về EADDRINUSE tại đây? Những thứ khác tôi có thể xem, hoặc những lệnh khác tôi có thể chạy để có thêm thông tin?

Thông tin bổ sung:

  • Hạt nhân 4.1.31.
  • Selinux không được sử dụng ở đây.
  • Đang cố gắng kết nối với 127.0.0.1 bằng telnet trả về "Kết nối bị từ chối"
  • Tôi đang chạy các lệnh với quyền root

1
Là cổng được đề cập bất cứ nơi nào trong iptables -Sđầu ra?
hertitu

1
Bạn có thể vui lòng in đầu ra của strace -ff nc -l 874 không , Cái bạn đã sử dụng đang cố gắng tạo kết nối với 874 làm cổng nguồn. Cảm ơn!
Anirudh Malhotra

2
AFAIK Linux yêu cầu quyền root khi nghe một cổng <1000. Có lẽ đó là vấn đề ở đây.
Koraktor

2
Đây có phải là máy chủ NFS không? Nó có thể đang sử dụng cổng nguồn 874 cho ngàm NFS. Dù sao, tôi sẽ thử netstat -na | grep 874trong trường hợp netstatcờ hiện tại của bạn quá hạn chế.
Tom Shaw

1
@TomShaw Bạn vừa làm cho ngày của tôi! Đó là NFS đúng. Tôi không chắc chính xác điều này xảy ra như thế nào, nhưng sau khi ngắt kết nối tất cả các mount NFS và khởi động lại các dịch vụ RPC và NFS thì vấn đề đã biến mất. Với tcpdump tôi cũng thấy một số lưu lượng truy cập từ cổng 874 đến cổng 111 (tại sao tôi không nghĩ về điều đó trước đây) xác nhận điều đó. Bạn có thể gửi bài này như một câu trả lời xin vui lòng?
roelvanmeer

Câu trả lời:


4

Nếu máy chủ của bạn là máy khách NFS, nó có thể đang sử dụng cổng nguồn 874 cho ngàm NFS. Tôi nghi ngờ rằng vì kết nối không bắt nguồn từ không gian người dùng nên nó có thể không hiển thị với các công cụ bạn đã sử dụng cho đến nay.

Hãy xem xét một trong những điều sau đây:

  • Điều chỉnh sysctls sunrpc.min_resvportsunrpc.max_resvport(mặc định 665 và 1023) để thay đổi phạm vi cổng nguồn mà máy khách NFS sử dụng
  • Sử dụng cổng nghe ngoài phạm vi này
  • Sử dụng noresvporttùy chọn trên ngàm NFS để sử dụng phạm vi không có đặc quyền (có thể có ý nghĩa bảo mật)
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.