溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

為什么netstat對(duì)某些服務(wù)只顯示了tcp6監(jiān)聽端口

發(fā)布時(shí)間:2021-10-20 16:41:43 來(lái)源:億速云 閱讀:705 作者:柒染 欄目:大數(shù)據(jù)

為什么netstat對(duì)某些服務(wù)只顯示了tcp6監(jiān)聽端口,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

最近偶爾發(fā)現(xiàn)一個(gè)比較奇怪的現(xiàn)象,netstat 查看監(jiān)聽的服務(wù)端口時(shí),卻只顯示了 tcp6 的監(jiān)控, 但是服務(wù)明明是可以通過(guò) tcp4 的 ipv4 地址訪問(wèn)的,那為什么沒(méi)有顯示 tcp4 的監(jiān)聽呢?

以 sshd 監(jiān)聽的 22 端口為例:

# netstat -tlnp | grep :22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1444/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1444/sshd

可以看到,netstat 顯示表示 sshd 既監(jiān)聽在 ipv4 的地址,又監(jiān)聽在 ipv6 的地址。

而再看看 httpd 進(jìn)程:

# netstat -tlnp | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN      19837/httpd

卻發(fā)現(xiàn)只顯示了監(jiān)聽在 ipv6 的地址上 ,但是,通過(guò) ipv4 的地址明明是可以訪問(wèn)訪問(wèn)的。

下面來(lái)看下怎樣解釋這個(gè)現(xiàn)象。

首先,關(guān)閉 ipv6 并且重啟 httpd:

# sysctl net.ipv6.conf.all.disable_ipv6=1
# systemctl restart httpd

現(xiàn)在,看下 httpd 監(jiān)聽的地址:

# netstat -tlnp | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      33697/httpd

可以看到,已經(jīng)只監(jiān)聽到 ipv4 地址了。

那為什么在 ipv6 開啟的時(shí)候,netstat 只顯示了 tcp6 的監(jiān)聽而非像 sshd 那樣既顯示 tcp 又顯示 tcp6 的監(jiān)聽呢?

我們下載 httpd 的源碼看一看,在代碼 server/listen.c 的 open_listeners() 函數(shù)中, 有相關(guān)注釋:

/* If we have the unspecified IPv4 address (0.0.0.0) and
 * the unspecified IPv6 address (::) is next, we need to
 * swap the order of these in the list. We always try to
 * bind to IPv6 first, then IPv4, since an IPv6 socket
 * might be able to receive IPv4 packets if V6ONLY is not
 * enabled, but never the other way around.
 * ... 省略 ...
 */

上面提到,ipv6 實(shí)際上是可以處理 ipv4 的請(qǐng)求的當(dāng) V6ONLY 沒(méi)有開啟的時(shí)候,反之不然; 那么 V6ONLY 是在什么時(shí)候開啟呢?

繼續(xù) follow 代碼到 make_sock() 函數(shù),可以發(fā)現(xiàn)如下代碼:

#if APR_HAVE_IPV6
#ifdef AP_ENABLE_V4_MAPPED
    int v6only_setting = 0;
#else
    int v6only_setting = 1;
#endif
#endif

在這個(gè)函數(shù)中,可以看到如果監(jiān)聽的地址是 ipv6,那么會(huì)去設(shè)置 IPV6_V6ONLY 這個(gè) socket 選項(xiàng), 現(xiàn)在,關(guān)鍵是看 AP_ENABLE_V4_MAPPED 是怎么定義的。

在 configure(注意,如果是直接通過(guò)代碼數(shù)獲取的,可能沒(méi)有這個(gè)文件,而只有 configure.ac/in 文件)文件中, 可以找到:

# Check whether --enable-v4-mapped was given.
if test "${enable_v4_mapped+set}" = set; then :
  enableval=$enable_v4_mapped;
  v4mapped=$enableval

else

    case $host in
    *freebsd5*|*netbsd*|*openbsd*)
        v4mapped=no
        ;;
    *)
        v4mapped=yes
        ;;
    esac
    if ap_mpm_is_enabled winnt; then
                v4mapped=no
    fi

fi


if test $v4mapped = "yes" -a $ac_cv_define_APR_HAVE_IPV6 = "yes"; then

$as_echo "#define AP_ENABLE_V4_MAPPED 1" >>confdefs.h

所以,在 Linux 中,默認(rèn)情況下,AP_ENABLE_V4_MAPPED 是 1,那么 httpd 就會(huì)直接監(jiān)聽 ipv6, 因?yàn)榇藭r(shí) ipv6 的 socket 能夠處理 ipv4 的請(qǐng)求;另外,bind() 系統(tǒng)調(diào)用會(huì)對(duì)用戶空間的進(jìn)程透明處理 ipv6 沒(méi)有開啟的情況,此時(shí)會(huì)監(jiān)聽到 ipv4。

而如果我們?cè)诰幾g httpd 的時(shí)候使用 --disable-v4-mapped 參數(shù)禁止 ipv4 mapped,那么默認(rèn)情況下, httpd 會(huì)分別監(jiān)聽在 ipv4 和 ipv6,而非只監(jiān)聽 ipv6,如下所示:

# netstat -tlnp | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      40576/httpd
tcp6       0      0 :::80                   :::*                    LISTEN      40576/httpd

而,如果在 /etc/httpd/conf/httpd.conf 中將 Listen 設(shè)置為只監(jiān)聽 ipv6 地址,如下:

Listen :::80

那么,將可以看到 netstat 只顯示 tcp6 的監(jiān)聽:

# systemctl restart httpd
# netstat -tlnp | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN      40980/httpd

并且,你會(huì)發(fā)現(xiàn)現(xiàn)在不能通過(guò) ipv4 地址訪問(wèn) httpd 了。

# telnet 192.168.1.100 80
Trying 192.168.1.100...
telnet: Unable to connect to remote host: Connection refused

所以,netstat 只是很真實(shí)的顯示監(jiān)聽的端口而已,但是需要注意 ipv6 實(shí)際上在 Linux 上也支持 ipv4。

看完上述內(nèi)容,你們掌握為什么netstat對(duì)某些服務(wù)只顯示了tcp6監(jiān)聽端口的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI