配置iptables實(shí)現(xiàn)本地端口轉(zhuǎn)發(fā)的方法詳解
場(chǎng)景
假如你在用 resin 調(diào)試一個(gè) Web 程序,需要頻繁地重啟 resin。這個(gè) Web 程序需要開(kāi)在 80 端口上,而 Linux 限制 1024 以下的端口必須有 root 權(quán)限才能開(kāi)啟。但是你又不愿意在調(diào)程序的時(shí)候總是開(kāi)著一個(gè) root 終端。在這種情況下,你可以把 resin 開(kāi)在默認(rèn)的 8080 端口上,然后使用 iptables 來(lái)實(shí)現(xiàn)和真的把服務(wù)開(kāi)在 80 端口上一樣的效果。
方法
將與 80 端口的 TCP 連接轉(zhuǎn)接到本地的 8080 端口上。使用 DNAT (Destination Network Address Translation) 技術(shù)可以滿(mǎn)足這一要求。因?yàn)?iptables 在處理本地連接和遠(yuǎn)程連接的方法不同,所以需要分開(kāi)處理。下面假設(shè)本機(jī)的 IP 是 192.168.4.177。
遠(yuǎn)程連接
遠(yuǎn)程連接指的是由另外一臺(tái)機(jī)器連接到這臺(tái)機(jī)器上。這種連接的數(shù)據(jù)包在 iptables 會(huì)首先經(jīng)過(guò) PREROUTING 鏈,所以只需在 PREROUTING 鏈中作 DNAT。
# iptables -t nat -A PREROUTING -p tcp -i eth0 -d 192.168.4.177 --dport 80 -j DNAT --to 192.168.4.177:8080
本地連接
本地連接指的是在本機(jī)上,用 127.0.0.1 或者本機(jī) IP 來(lái)訪(fǎng)問(wèn)本機(jī)的端口。本地連接的數(shù)據(jù)包不會(huì)通過(guò)網(wǎng)卡,而是由內(nèi)核處理后直接發(fā)給本地進(jìn)程。這種數(shù)據(jù)包在 iptables 中只經(jīng)過(guò) OUTPUT 鏈,而不會(huì)經(jīng)過(guò) PREROUTING 鏈。所以需要在 OUTPUT 鏈中進(jìn)行 DNAT。除了對(duì) 127.0.0.1 之外,對(duì)本機(jī) IP (即 192.168.4.177) 的訪(fǎng)問(wèn)也屬于本地連接。
# iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j DNAT --to 127.0.0.1:8080
# iptables -t nat -A OUTPUT -p tcp -d 192.168.4.177 --dport 80 -j DNAT --to 127.0.0.1:8080
注意事項(xiàng)
你也許需要通過(guò)以下命令打開(kāi) IP 轉(zhuǎn)發(fā):
# echo 1 > /proc/sys/net/ipv4/ip_forward
在進(jìn)行試驗(yàn)時(shí),如果要重新設(shè)置 iptables,需要首先清空 nat 表:
# iptables -F -t nat
實(shí)例操作
這里將本地接口IP 61.144.a.b 的3389端口 轉(zhuǎn)發(fā)到 116.6.c.d的3389 (主要訪(fǎng)問(wèn)到61.144.a.b的3389端口,就會(huì)跳轉(zhuǎn)到116.6.c.d的3389)
1、 首先應(yīng)該做的是/etc/sysctl.conf配置文件的 net.ipv4.ip_forward = 1 默認(rèn)是0 這樣允許iptalbes FORWARD。
2、 service iptables stop 關(guān)閉防火墻
3、 重新配置規(guī)則
iptables -t nat -A PREROUTING --dst 61.144.a.b -p tcp --dport 3389 -j DNAT --to-destination 116.
6.c.d:3389
iptables -t nat -A POSTROUTING --dst 116.6.c.d -p tcp --dport 3389 -j SNAT --to-source 61.144.a.b
service iptables save
將當(dāng)前規(guī)則保存到 /etc/sysconfig/iptables
若你對(duì)這個(gè)文件很熟悉直接修改這里的內(nèi)容也等于命令行方式輸入規(guī)則。
5、 啟動(dòng)iptables 服務(wù), service iptables start
可以寫(xiě)進(jìn)腳本,設(shè)備啟動(dòng)自動(dòng)運(yùn)行;
# vi /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.</p> <p>touch /var/lock/subsys/local</p> <p>sh /root/myshipin.log
---------------------------------------------------------------------
vi myshipin.log
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.</p> <p>iptables -F -t nat
iptables -t nat -A PREROUTING --dst 61.144.a.b -p tcp --dport 3389 -j DNAT --to-destination 116.6.c.d:3389
iptables -t nat -A POSTROUTING --dst 116.6.a.b -p tcp --dport 3389 -j SNAT --to-source 61.144.c.d
~
----------------------------------------------------------------
TCP</p> <p>iptables -t nat -A PREROUTING --dst 61.144.a.b -p tcp --dport 9304 -j DNAT --to-destination 10.94.a.b:9304
iptables -t nat -A POSTROUTING --dst 10.94.a.b -p tcp --dport 9304 -j SNAT --to-source 61.144.a.b</p> <p>UDP
iptables -t nat -A PREROUTING --dst 61.144.a.b -p udp --dport 9305 -j DNAT --to-destination 10.94.a.b:9305
iptables -t nat -A POSTROUTING --dst 10.94.a.b -p udp --dport 9305 -j SNAT --to-source 61.144.a.b
另:
iptables配置文件的位置:/etc/sysconfig/iptables 外網(wǎng)地址發(fā)變化在配置文件里修改就可以了。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。