您好,登錄后才能下訂單哦!
最近在給客戶做解決方案的時候遇到這么一個場景也給自己埋了個坑這里記錄一下。
具體需求如下
現在客戶國內服務器和國外的防火墻已經內網打通
客戶在國內有臺WEB服務器要通過國外的一臺防火墻訪問外網
需要從國外防火墻上能夠回源到國內的WEB服務器即能夠通過防火墻訪問到WEB服務的80端口
國內WEB服務器有自己的公網地址需要能夠進行管理
因為一開始客戶沒有提出第3條要回源的需求當時給客戶設計的方案是
把客戶國內機器的默認路由扔給國外的防火墻
國外防火墻上做SNAT把來自內網網段的流量映射出去。
3. 在國內機器上添加靜態路由把客戶的管理網段扔給國內的網關。
大致拓撲圖如下
這里有一點因為無法確定客戶國內的管理地址網段所以在國內WEB服務器C上刷了一個全國路由表的靜態路由默認路由優先級低于靜態路由所以國內用戶訪問C的時候還是通過國內的網關出TCP連接能夠正常建立。
然而這時候客戶又提出需要從國外服務器上進行回源測試一下回源的質量也就是要通過防火墻訪問到WEB服務的80端口。我心想這個簡單呀在防火墻上做一個DNAT映射把訪問防火墻80端口的映射給WEB服務器的80端口上。于是說干就干.....做完配置之后進行測試瞬間懵逼了我在辦公網國內地址測試防火墻的80端口死活不通一直報錯"TIMEOUT"直接測試國內服務器的外網地址的80端口和內網地址的80端口是OK的也就是說web服務訪問正常但為什么我訪問防火墻的80端口不行呢
于是進行各種測試折騰半天發現一個現象能從國外正常訪問防火墻80端口而國內不可以。抓包的時候發現WEB服務器已經收到了我的http請求而且已經進行了回包但是服務器的回包并沒有和我正常建立連接。看現象應該是斷在了TCP的第二次和第三次握手中間。
這時候才恍然大悟為什么TCP連接沒有建立呢因為我是國內地址發起的防火墻80訪問通過防火墻請求到后端WEB服務器的時候因為服務器上有國內的路由回包的時候是從國內網關出的而不是從防火墻出了導致回包的源地址變成了國內網關地址所以TCP連接建立不起來了。通俗解釋就是A發出請求訪問B結果D給做出了回應A認為不是他想要的所以不認了TCP連接建立不起來。圖解如下
為了解決這個問題總結一句話就是需要解決源進源出的問題從哪個口進來的流量讓他從哪個口出去。因為WEB服務器C相當于有兩個網關出口就需要在C上控制流量的走向。于是這里想到了可以通過iproute2或iptables來實現我這里其實本質上還是路由的控制所以用iproute2來實現顯得更為合理而且性能效果上會更好。
簡單介紹下iproute2:
iproute2是linux下管理控制TCP/IP網絡和流量控制的新一代工具包旨在替代老派的工具鏈net-tools即大家比較熟悉的ifconfigarproutenetstat等命令。兩套工具本質的區別,是net-tools是通過procfs(/proc)和ioctl系統調用去訪問和改變內核網絡配置而iproute2則通過netlink套接字接口與內核通訊。
我這里的解決辦法如下:
假設我的國內WEB服務器的外網地址是192.168.1.254/30GW:192.168.1.253。
內網地址192.168.10.2 Default GW192.168.10.1
保持默認路由10.1不變還是通過國外防火墻出網。
在WEB服務器上新建路由表"china",添加策略如下
# echo "1 china" >> cat /etc/iproute2/rt_tables # ip route add 192.168.1.252/30 dev em1 src 192.168.1.254 table china # ip route add default via 192.168.1.253 dev em1 table china # ip rule add from 192.168.1.254 table china
3. 刪除之前添加的全國路由表。
4. 可以把路由策略寫進網卡或者rc.local配置文件里保證開機后依然生效。
最后:附一個iproute2的51cto上翻譯的參考鏈接地址:
http://os.51cto.com/art/201409/450886.htm
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。