Cara men-debug jaringan linux: Alamat sudah digunakan

10

Saya memiliki kotak linux Slackware di mana saya tidak dapat memulai layanan apa pun yang mendengarkan pada satu port tertentu di localhost. Dengan menggunakan strace saya menemukan bahwa kesalahan terjadi pada bind()panggilan, dan kesalahannya adalah 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)

Ini terjadi pada setiap proses yang saya coba untuk mulai mendengarkan pada port itu, jadi itu tidak terkait dengan proses itu sendiri. Output strace di atas berasal dari perintah strace -ff nc -l -p 874 -s 127.0.0.1.

Jadi, ini menunjukkan ada proses yang sudah mendengarkan di localhost port 874. Namun, sepertinya saya tidak dapat menemukannya. Semua perintah berikut tidak menghasilkan apa-apa:

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

Jika saya mencoba mendengarkannya 0.0.0.0:874gagal dengan kesalahan yang sama. Mendengarkan salah satu alamat IP yang dikonfigurasi pada nic berfungsi dengan baik, dan mendengarkan 127.0.0.2:874juga berfungsi dengan baik. Mendengarkan pada port yang berbeda berfungsi dengan baik, juga pada 127.0.0.1atau 0.0.0.0.

Jadi, sekarang saya penasaran. Bagaimana saya bisa mengetahui mengapa tumpukan jaringan mengembalikan EADDRINUSE di sini? Apa hal lain yang bisa saya lihat, atau perintah apa yang bisa saya jalankan untuk mendapatkan informasi lebih lanjut?

Informasi tambahan:

  • Kernel 4.1.31.
  • Selinux tidak digunakan di sini.
  • Mencoba terhubung ke 127.0.0.1 dengan pengembalian telnet "Sambungan ditolak"
  • Saya menjalankan perintah sebagai root
roelvanmeer
sumber
1
Apakah port disebutkan di mana saja di iptables -Soutput?
hertitu
1
Bisakah Anda juga mencetak output dari strace -ff nc -l 874 juga, Yang Anda gunakan sedang mencoba untuk membuat koneksi dengan 874 sebagai port sumber. Terima kasih!
Anirudh Malhotra
2
AFAIK Linux membutuhkan hak akses root saat mendengarkan port <1000. Mungkin itulah masalahnya di sini.
Koraktor
2
Apakah ini host klien NFS? Mungkin menggunakan port sumber 874 untuk mount NFS. Pokoknya saya akan mencoba netstat -na | grep 874jika netstatbendera Anda saat ini terlalu ketat.
Tom Shaw
1
@ Tomshaw Anda baru saja membuat hari saya! Itu NFS benar semua. Saya tidak yakin bagaimana sebenarnya ini terjadi, tetapi setelah melepas semua mount NFS dan memulai kembali layanan RPC dan NFS masalahnya hilang. Dengan tcpdump saya juga melihat beberapa traffic dari port 874 ke port 111 (kenapa saya tidak memikirkan itu sebelumnya) yang menegaskannya. Bisakah Anda memposting ini sebagai jawaban?
roelvanmeer

Jawaban:

4

Jika host Anda adalah klien NFS, itu mungkin menggunakan port sumber 874 untuk mount NFS. Saya menduga bahwa karena koneksi tidak berasal dari userspace mungkin tidak terlihat oleh alat yang telah Anda gunakan sejauh ini.

Pertimbangkan salah satu dari yang berikut:

  • Sesuaikan sysctls sunrpc.min_resvportdan sunrpc.max_resvport(default 665 dan 1023) untuk mengubah kisaran port sumber yang digunakan klien NFS
  • Gunakan port mendengarkan di luar kisaran ini
  • Gunakan noresvportopsi pada mount NFS untuk menggunakan rentang non-privilege (mungkin memiliki implikasi keamanan)
Tom Shaw
sumber