Networking

netstat 輸出中的 :::80 是否僅表示 ipv6 或 ipv6+ipv4?

  • January 23, 2019

如果我在聽:::80,是在聽所有 ipv6 還是所有 ipv6+ipv4?

這是我的netstat -tln

tcp        0      0 :::8080                     :::*

綁定到 的偵聽套接字::,即任何地址 IPv6 地址 ( INADDR6_ANY),可能也或可能不偵聽使用 IPv4 的連接。這取決於幾件事:

  • 一些作業系統是所謂的雙棧,在那些作業系統上,這取決於是否IPV6_V6ONLY在偵聽套接字上設置了套接字選項(由創建套接字的程序)。基於 Linux 的作業系統和 FreeBSD 就是此類作業系統的範例。如果程序未明確設置該選項,則預設行為取決於作業系統。例如,在基於 Linux 的作業系統上,您可以通過將 0 或 1 寫入/proc/sys/net/ipv6/bindv6only.
  • 其他一些作業系統不是雙棧的,在那些作業系統上,一個套接字永遠無法同時監聽 IPv6 和 IPv4。OpenBSD 就是這樣一種作業系統。

在某些作業系統上, 的輸出netstat會告訴您套接字是否是雙棧的。例如, FreeBSD 將netstat雙棧套接字報告為輸出tcp46udp46第一列。

感謝您的回答@Johan Myreen 我想通過範例改進這個答案。

我正在使用這兩個值測試 ipv6_only 行為。

1.

cat /proc/sys/net/ipv6/bindv6only
0
nc -6 -l 80
#server started
# netstat
tcp6       0      0 :::80                   :::*                    LISTEN     
# nc client
nc localhost 80
test
# server response 
nc -6 -l 80
test
# from ipv6 now
nc ::1 80
test ipv6
# server response
nc -6 -l 80
test ipv6

2.

cat /proc/sys/net/ipv6/bindv6only
1
# server started
nc -6 -l 80
# connect to ipv4
nc localhost 80
nc: connect to localhost port 80 (tcp) failed: Connection refused
# connect to ipv6 
nc ::1 80 
test ipv6 
# server respose
nc -6 -l 80
test ipv6 

從上面的結果我們可以看到 /proc/sys/net/ipv6/bindv6only 的值決定了 ipv6 only 或 ipv6+ipv4 的行為

引用自:https://unix.stackexchange.com/questions/496137