場景:
本地部署tomcat到8080端口,并期望本地訪問80端口來訪問本地tomcat。
結(jié)論:
使用linux下的iptables工具實(shí)現(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
-
新建一個(gè)bash腳本
#!/bin/bash iptables-restore < /etc/iptables.rules
- 保存到/etc/network/if-pre-up.d/目錄下
- 結(jié)束!
- BTW:如果是配置外部服務(wù)器,則把第2步換為執(zhí)行iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
?
實(shí)驗(yàn)過程:
實(shí)驗(yàn)過程主要集中在上述第2步中該添加何種iptables規(guī)則。
取得root權(quán)限后,單獨(dú)執(zhí)行各個(gè)操作:
?
-
iptables -t nat -I OUTPUT -p tcp ?--dport 80 -j REDIRECT --to-port 8080 ?
結(jié)果:訪問本地localhost正常轉(zhuǎn)發(fā),訪問外部網(wǎng)絡(luò)全部被重定向到本地localhost:8080
原因: 本機(jī)訪問請(qǐng)求時(shí),本地進(jìn)程產(chǎn)生的報(bào)文將進(jìn)入OUTPUT鏈,因?yàn)楫?dāng)前請(qǐng)求包的端口是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)絡(luò)正常沒特殊處理
原因:類似上例,但多了一個(gè)規(guī)則:需匹配數(shù)據(jù)包源地址-s 127.0.0.1。但實(shí)際上,訪問外部網(wǎng)絡(luò)時(shí)實(shí)際數(shù)據(jù)包在經(jīng)過這個(gè)鏈時(shí)的源地址是本機(jī)ip,而不是回路ip(127.0.0.1),所以相當(dāng)于本規(guī)則對(duì)訪問外部網(wǎng)絡(luò)時(shí)無效。
-
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)絡(luò)全部被重定向到本地localhost:8080
原因:和上例類似,規(guī)則匹配了對(duì)外訪問的數(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)絡(luò)正常沒特殊處理
原因:本地應(yīng)用的ip被匹配上,所以訪問本地應(yīng)用時(shí),數(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)絡(luò)正常沒特殊處理
原因: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)絡(luò)正常沒特殊處理
原因:本地連接指的是在本機(jī)上,用 127.0.0.1 或者本機(jī) IP 來訪問本機(jī)的端口。本地連接的數(shù)據(jù)包不會(huì)通過網(wǎng)卡,而是由內(nèi)核處理后直接發(fā)給本地進(jìn)程。這種數(shù)據(jù)包在 iptables 中只經(jīng)過 OUTPUT 鏈,而不會(huì)經(jīng)過 PREROUTING 鏈(原文 點(diǎn)此 )。即: PREROUTING isn't used by the loopback interface( 討論貼 )。
?
知識(shí)點(diǎn):
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ù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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