ILB後端server去telnet ILB 80測試,發現有時鏈接成功,有時超時失敗,經過子網中別的server去 telnet ILB 80 沒有問題,HTTPserver1和HTTPserver2的本地telnet localhost 80也沒問題。後端
1.這個問題能夠總結爲當ILB後端server 1 Telnet ILB 80時,若是ILB把流量轉發到server2 ,則會Telnet成功,若是ILB把流量轉發到server1自身,則會失敗。ide
2.根據咱們的測試和後臺的確認,Azure ILB會對進入的流量作DNAT,對於內部server出去的流量,會作SNAToop
情景1:當server1 去telnet ILB 80時,ILB將流量轉發到server2時會出現Telnet成功,這時ILB會對目的地址作一個轉換,轉換成server2的ip。此時這個請求的格式會變成測試
目的MAC:server2的MACspa |
源MAC:ILB的MAC設計 |
目IP:server2 的IP10.0.1.6server |
源 ip:server1的IP10.0.1.5blog |
當Server2回覆這個包的時候,因爲ILB充當的是網關的做用,因此這個包會回給ILB,ILB收到以後,會對這個包作一個SNAT,將原地址轉換成ILB的地址。因此咱們在server1上抓包的結果是Server1在和ILB 通訊,可是在server2上抓包時,會看到server2在和server 1通訊。ip
情景2:當server1去telnet ILB 80時,ILB將流量轉發到server1自身時會出現Telnet失敗。這是由於ILB會對流量作一個DNAT。格式是虛擬機
目的MAC:server1 MAC |
源MAC:ILB MAC |
目的IP:Server 1 的IP 10.0.1.5 |
源ip:server1的IP,10.0.1.5 |
當server1收到上述包以後,就會開始構建回包,此時他查到目的IP是自身,這樣的包屬於loopback環回包。會直接在虛擬機裏丟棄。
目的IP:Server 1 的IP 10.0.1.5 |
源ip: server 1ip 10.0.1.5 |
在虛擬機裏抓包會看到虛擬機會每隔3s從新發出 SYN包。但沒有收到ILB回覆的ACK包,因而Telnet顯示結果就會出現timeout
工程師建議:
===========
這是平臺ILB的設計和TCP/IP 協議原理決定的。後端server不做爲Client便可避免這個問題。