場景:
本地部署tomcat到8080端口,并期望本地訪問80端口來訪問本地tomcat。
結論:
使用linux下的iptables工具實現端口轉發功能。
具體為
- 現取得root權限
- 執行iptables -t nat -I OUTPUT -p tcp ?-d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
- 目前在重啟前均生效。要想永久生效,需要繼續執行(ubuntu環境):iptables-save > /etc/iptables.rules
-
新建一個bash腳本
#!/bin/bash iptables-restore < /etc/iptables.rules
- 保存到/etc/network/if-pre-up.d/目錄下
- 結束!
- BTW:如果是配置外部服務器,則把第2步換為執行iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
?
實驗過程:
實驗過程主要集中在上述第2步中該添加何種iptables規則。
取得root權限后,單獨執行各個操作:
?
-
iptables -t nat -I OUTPUT -p tcp ?--dport 80 -j REDIRECT --to-port 8080 ?
結果:訪問本地localhost正常轉發,訪問外部網絡全部被重定向到本地localhost:8080
原因: 本機訪問請求時,本地進程產生的報文將進入OUTPUT鏈,因為當前請求包的端口是80,于是重定向道8080,注意是所有數據包。
-
iptables -t nat -I OUTPUT -p tcp -s 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
結果:訪問本地localhost正常轉發,訪問外部網絡正常沒特殊處理
原因:類似上例,但多了一個規則:需匹配數據包源地址-s 127.0.0.1。但實際上,訪問外部網絡時實際數據包在經過這個鏈時的源地址是本機ip,而不是回路ip(127.0.0.1),所以相當于本規則對訪問外部網絡時無效。
-
iptables -t nat -I OUTPUT -p tcp -s 非回路網卡ip --dport 80 -j REDIRECT --to-port 8080
結果:訪問本地localhost無法轉發,訪問外部網絡全部被重定向到本地localhost:8080
原因:和上例類似,規則匹配了對外訪問的數據包,從而被重定向。
-
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080?
結果:訪問本地localhost正常轉發,訪問外部網絡正常沒特殊處理
原因:本地應用的ip被匹配上,所以訪問本地應用時,數據包將被重定向道8080
-
iptables -t nat -I OUTPUT -p tcp -s 127.0.0.1 -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
結果:訪問本地localhost正常轉發,訪問外部網絡正常沒特殊處理
原因:2,4操作的原因結合。
-
iptables -t nat -I PREROUTING?-p tcp -s 127.0.0.1 -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
結果:訪問本地localhost無法轉發,訪問外部網絡正常沒特殊處理
原因:本地連接指的是在本機上,用 127.0.0.1 或者本機 IP 來訪問本機的端口。本地連接的數據包不會通過網卡,而是由內核處理后直接發給本地進程。這種數據包在 iptables 中只經過 OUTPUT 鏈,而不會經過 PREROUTING 鏈(原文 點此 )。即: PREROUTING isn't used by the loopback interface( 討論貼 )。
?
知識點:
iptables基本介紹: http://wiki.centos.org/HowTos/Network/IPTables (是centos版)
iptables全面介紹:
http://lesca.me/archives/iptables-tutorial-structures-configuratios-examples.html
http://blog.chinaunix.net/uid-307943-id-3559357.html
iptables原理: http://my.oschina.net/javagg/blog/3239
iptables數據包流向 :
以本地為目的的包 數據包 ----> mangle prerouting -------> nat prerouting -------> mangle input -------> filter input
以本地為源的包 數據包 -------> mangle output -------> nat output -------> filter output -------> mangle postrouting -------> nat postrouting?
經過本地轉發的包 數據包 -------> mangle prerouting -------> nat prerouting -------> mangle forward -------> filter forward -------> mangle postrouting -------> nat postrouting
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
