ECS 8080端口連接拒絕問題排查
用戶ECS網絡設置
- 上圖是用戶ECS的網絡示意圖:
- ecs處於vpc網絡下
- ecs加入了一個安全組,該安全組出入方向均開放8080端口
- ecs有兩個網卡,一個私網主網卡(有虛線的網卡),一個私網normal網卡
- ecs綁定了一個EIP(彈性公網IP)實現與公網互通
問題現象
- 8080端口無法連接
排查過程
-
首先確認安全組規則中,的確開放了入和出的8080端口,說明安全組配置沒有問題:
注意:經典網絡不允許在安全組規則中設置 0.0.0.0/0 的地址段,vpc網絡由於網絡之間是隔離的,所以這樣設置問題不大。
安全組設置沒有問題,那重點懷疑用戶的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命令來看一下本機路由表的設置:
稍微解釋一下上麵的表格:
- 第一列:Destination,目標網段或者主機
- 第二列:Gateway,網關地址,”*” 表示目標是本主機所屬的網絡,不需要路由
- 第三列:Flags,標記。一些可能的標記如下:
- U :路由是活動的
- H : 目標是一個主機
- G :路由指向網關
- R :恢複動態路由產生的表項
- D :由路由的後台程序動態地安裝
- M :由路由的後台程序修改
- ! :拒絕路由
- 第四列:Ref,路由項引用次數
- 第五列:Use,此路由項被路由軟件查找的次數
- 第六列:Iface,該路由表項對應的輸出接口
從截圖可以看出,目標是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服務,都是可以的。
最後更新:2017-05-31 16:01:33