netstat?為什么只顯示 tcp6 監(jiān)聽端口

轉(zhuǎn)自 https://www.cnblogs.com/wlzjdm/p/8684202.html

最近偶爾發(fā)現(xiàn)一個比較奇怪的現(xiàn)象,netstat 查看監(jiān)聽的服務(wù)端口時泉坐,卻只顯示了 tcp6 的監(jiān)控刚夺, 但是服務(wù)明明是可以通過 tcp4 的 ipv4 地址訪問的,那為什么沒有顯示 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 的地址上 ,但是青抛,通過 ipv4 的地址明明是可以訪問訪問的。

下面來看下怎樣解釋這個現(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 開啟的時候捣辆,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 實際上是可以處理 ipv4 的請求的當(dāng) V6ONLY 沒有開啟的時候耸序,反之不然忍些; 那么 V6ONLY 是在什么時候開啟呢?

繼續(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

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

在 configure(注意男应,如果是直接通過代碼數(shù)獲取的闹司,可能沒有這個文件,而只有 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 就會直接監(jiān)聽 ipv6, 因為此時 ipv6 的 socket 能夠處理 ipv4 的請求隔箍;另外谓娃,bind() 系統(tǒng)調(diào)用會對用戶空間的進(jìn)程透明處理 ipv6 沒有開啟的情況,此時會監(jiān)聽到 ipv4蜒滩。

而如果我們在編譯 httpd 的時候使用 --disable-v4-mapped 參數(shù)禁止 ipv4 mapped滨达,那么默認(rèn)情況下, httpd 會分別監(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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末续挟,一起剝皮案震驚了整個濱河市紧卒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诗祸,老刑警劉巖跑芳,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異直颅,居然都是意外死亡博个,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門际乘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坡倔,“玉大人,你說我怎么就攤上這事脖含∽锼” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵养葵,是天一觀的道長征堪。 經(jīng)常有香客問我,道長关拒,這世上最難降的妖魔是什么佃蚜? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮着绊,結(jié)果婚禮上谐算,老公的妹妹穿的比我還像新娘。我一直安慰自己归露,他們只是感情好洲脂,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剧包,像睡著了一般恐锦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疆液,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天一铅,我揣著相機(jī)與錄音,去河邊找鬼堕油。 笑死潘飘,一個胖子當(dāng)著我的面吹牛肮之,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卜录,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼局骤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暴凑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赘来,失蹤者是張志新(化名)和其女友劉穎现喳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犬辰,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡嗦篱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幌缝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸促。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涵卵,靈堂內(nèi)的尸體忽然破棺而出浴栽,到底是詐尸還是另有隱情,我是刑警寧澤轿偎,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布典鸡,位于F島的核電站,受9級特大地震影響坏晦,放射性物質(zhì)發(fā)生泄漏萝玷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一昆婿、第九天 我趴在偏房一處隱蔽的房頂上張望球碉。 院中可真熱鬧,春花似錦仓蛆、人聲如沸睁冬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痴突。三九已至,卻和暖如春狼荞,著一層夾襖步出監(jiān)牢的瞬間辽装,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工相味, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拾积,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像拓巧,于是被迫代替她去往敵國和親斯碌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 列出所有連接 第一個要介紹的肛度,是最簡單的命令:列出所有當(dāng)前的連接傻唾。使用 -a 選項即可。 $ netstat...
    一天的閱讀 3,735評論 0 0
  • docker服務(wù)器上經(jīng)常有程序綁定到tcp6端口監(jiān)聽承耿,即ipv6地址冠骄。 導(dǎo)致curl -v url 無法訪問服務(wù)。...
    五大RobertWu伍洋閱讀 6,702評論 0 0
  • netstat 查看鏈接和端口監(jiān)聽等信息 參數(shù)介紹: -n :不顯示別名(主機(jī)名/域名以 數(shù)字或IP顯示) -e ...
    程序緣天地閱讀 1,368評論 0 0
  • 本文主要說明的是TCP連接過程中加袋,各個階段對套接字的操作凛辣,希望能對沒有網(wǎng)絡(luò)編程基礎(chǔ)的人理解套接字是什么、扮演的角色...
    洛的俠閱讀 233評論 0 0
  • Netstat 簡介 Netstat 是一款命令行工具职烧,可用于列出系統(tǒng)上所有的網(wǎng)絡(luò)套接字連接情況扁誓,包括 tcp, ...
    Ddaidai閱讀 1,160評論 0 0