上圖是使用者ecs的網絡示意圖:
ecs處于vpc網絡下
ecs加入了一個安全組,該安全組出入方向均開放8080端口
ecs有兩個網卡,一個私網主網卡(有虛線的網卡),一個私網normal網卡
ecs綁定了一個eip(彈性公網ip)實作與公網互通
8080端口無法連接配接
首先确認安全組規則中,的确開放了入和出的8080端口,說明安全組配置沒有問題:
安全組設定沒有問題,那重點懷疑使用者的8080監聽服務沒有啟動,使用者回報說本地curl 8080服務能夠正确傳回,說明服務已經啟動. 要求使用者回報8080在監聽的截圖如下:
從上圖能夠看出使用者的web服務被綁定在127.0.0.1的8080端口上了,而這會導緻公網無法通路該web服務,解釋如下:
127.0.0.1是一個回送(loopback)位址,指本地機,一般用來測試使用
127.0.0.1是通過網卡傳輸,依賴網卡,并受到網絡防火牆和網卡相關的限制,這也是跟localhost重要差別之一,localhost是不走網卡的,是以防火牆設定對localhost是無效的。
正常的網絡包都是從ip層進傳入連結路層,然後發送到網絡上,而發向127.0.0.1的包,直接在ip層短路了,也就是發到ip層的包直接被ip層接收了,不再向下發送。這也就決定了web應用綁定在127.0.0.1上是不可能被公網通路到的。
為了印證發向127.0.0.1無法被傳輸到網絡上,可以使用netstat -r指令來看一下本機路由表的設定:
稍微解釋一下上面的表格:
從截圖可以看出,目标是127的資料包,網關位址仍然是127,這就印證了127是回送(loopback)位址。
解決方案:
修改web容器配置,把web應用綁定在ecs主網卡上。ecs bind eip,實際上相當于eip與ecs私有主網卡建立了映射關系,是以通過eip:8080來通路web服務,最終就會*請求到私網主網卡:8080上。
更好的做法是把web服務綁定在0.0.0.0這個特殊ip上,關于0.0.0.0,這個ip并不是真實存在的,我們ping不通它,它隻是一個符号,代表目前裝置的ip。綁定在0.0.0.0上後無論是通過127.0.0.1還是本機ip去通路web服務,都是可以的。
127.0.0.1是一個回送(loopback)位址,隻能用于本機測試,web應用綁定在127.0.0.1上是不可能被公網通路到的。
把web應用綁定在ecs私網主網卡上就可以實作用eip從公網來通路web服務,因為eip與ecs私有主網卡建立了映射關系。
0.0.0.0是個特殊的ip,綁定在0.0.0.0上後無論是通過127.0.0.1還是本機ip去通路web服務,都是可以的。