場景:
本地部署tomcat到8080端口,并期望本地訪問80端口來訪問本地tomcat。
結(jié)論:
使用linux下的iptables工具實現(xiàn)端口轉(zhuǎn)發(fā)功能。
具體為
- 現(xiàn)取得root權(quán)限
- 執(zhí)行iptables -t nat -I OUTPUT -p tcp ?-d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
- 目前在重啟前均生效。要想永久生效,需要繼續(xù)執(zhí)行(ubuntu環(huán)境):iptables-save > /etc/iptables.rules
-
新建一個bash腳本
#!/bin/bash iptables-restore < /etc/iptables.rules
- 保存到/etc/network/if-pre-up.d/目錄下
- 結(jié)束!
- BTW:如果是配置外部服務器,則把第2步換為執(zhí)行iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
?
實驗過程:
實驗過程主要集中在上述第2步中該添加何種iptables規(guī)則。
取得root權(quán)限后,單獨執(zhí)行各個操作:
?
-
iptables -t nat -I OUTPUT -p tcp ?--dport 80 -j REDIRECT --to-port 8080 ?
結(jié)果:訪問本地localhost正常轉(zhuǎn)發(fā),訪問外部網(wǎng)絡全部被重定向到本地localhost:8080
原因: 本機訪問請求時,本地進程產(chǎn)生的報文將進入OUTPUT鏈,因為當前請求包的端口是80,于是重定向道8080,注意是所有數(shù)據(jù)包。
-
iptables -t nat -I OUTPUT -p tcp -s 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
結(jié)果:訪問本地localhost正常轉(zhuǎn)發(fā),訪問外部網(wǎng)絡正常沒特殊處理
原因:類似上例,但多了一個規(guī)則:需匹配數(shù)據(jù)包源地址-s 127.0.0.1。但實際上,訪問外部網(wǎng)絡時實際數(shù)據(jù)包在經(jīng)過這個鏈時的源地址是本機ip,而不是回路ip(127.0.0.1),所以相當于本規(guī)則對訪問外部網(wǎng)絡時無效。
-
iptables -t nat -I OUTPUT -p tcp -s 非回路網(wǎng)卡ip --dport 80 -j REDIRECT --to-port 8080
結(jié)果:訪問本地localhost無法轉(zhuǎn)發(fā),訪問外部網(wǎng)絡全部被重定向到本地localhost:8080
原因:和上例類似,規(guī)則匹配了對外訪問的數(shù)據(jù)包,從而被重定向。
-
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080?
結(jié)果:訪問本地localhost正常轉(zhuǎn)發(fā),訪問外部網(wǎng)絡正常沒特殊處理
原因:本地應用的ip被匹配上,所以訪問本地應用時,數(shù)據(jù)包將被重定向道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
結(jié)果:訪問本地localhost正常轉(zhuǎn)發(fā),訪問外部網(wǎng)絡正常沒特殊處理
原因:2,4操作的原因結(jié)合。
-
iptables -t nat -I PREROUTING?-p tcp -s 127.0.0.1 -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
結(jié)果:訪問本地localhost無法轉(zhuǎn)發(fā),訪問外部網(wǎng)絡正常沒特殊處理
原因:本地連接指的是在本機上,用 127.0.0.1 或者本機 IP 來訪問本機的端口。本地連接的數(shù)據(jù)包不會通過網(wǎng)卡,而是由內(nèi)核處理后直接發(fā)給本地進程。這種數(shù)據(jù)包在 iptables 中只經(jīng)過 OUTPUT 鏈,而不會經(jīng)過 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數(shù)據(jù)包流向 :
以本地為目的的包 數(shù)據(jù)包 ----> mangle prerouting -------> nat prerouting -------> mangle input -------> filter input
以本地為源的包 數(shù)據(jù)包 -------> mangle output -------> nat output -------> filter output -------> mangle postrouting -------> nat postrouting?
經(jīng)過本地轉(zhuǎn)發(fā)的包 數(shù)據(jù)包 -------> mangle prerouting -------> nat prerouting -------> mangle forward -------> filter forward -------> mangle postrouting -------> nat postrouting
?
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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