轉(zhuǎn)自:ZONG_XP
0 背景
考慮一種網(wǎng)絡(luò)拓?fù)鋺?yīng)用情景,一個(gè)內(nèi)部局域網(wǎng)中有多臺(tái)服務(wù)器提供不同的服務(wù),如web服務(wù)、FTP服務(wù)、ssh、telnet等,通過服務(wù)器(或網(wǎng)關(guān)、防火墻)連接外部網(wǎng)絡(luò),如果外部網(wǎng)絡(luò)上的主機(jī)需要訪問這些服務(wù)器,則需要在網(wǎng)關(guān)上實(shí)現(xiàn)轉(zhuǎn)發(fā)。
再轉(zhuǎn)述成另一種應(yīng)用場(chǎng)合,多臺(tái)設(shè)備連接到一臺(tái)服務(wù)器,服務(wù)器有2個(gè)網(wǎng)卡,分別連接內(nèi)外網(wǎng)。外網(wǎng)無法直接訪問設(shè)備上的數(shù)據(jù)、服務(wù)。在服務(wù)器上實(shí)現(xiàn)轉(zhuǎn)發(fā)后,則可達(dá)到目的。
網(wǎng)絡(luò)拓?fù)淙缦拢?/p>
比如,可以通過服務(wù)器的8081端口訪問1號(hào)設(shè)備的web服務(wù),8082端口訪問2號(hào)設(shè)備web,這樣可以在外部網(wǎng)絡(luò)對(duì)內(nèi)網(wǎng)設(shè)備進(jìn)行參數(shù)配置、調(diào)整。類似地,通過2321訪問1號(hào)設(shè)備的telnet服務(wù),2322訪問2號(hào)設(shè)備telnet,以方便登陸設(shè)備系統(tǒng),進(jìn)行設(shè)備狀態(tài)監(jiān)控,日志處理,等等。
本文將直接引用此網(wǎng)絡(luò)拓?fù)鋱D中的名稱及IP地址。實(shí)際使用配置根據(jù)實(shí)際情況修改。另外說明一下,不必拘泥于本文給出的名稱。像拓?fù)鋱D中的“設(shè)備”,可以使用一臺(tái)安裝linux的服務(wù)器替換。其它的類似。
一、原理
在Linux系統(tǒng)使用iptables實(shí)現(xiàn)防火墻、數(shù)據(jù)轉(zhuǎn)發(fā)等功能。iptables有不同的表(tables),每個(gè)tables有不同的鏈(chain),每條chain有一個(gè)或多個(gè)規(guī)則(rule)。本文利用NAT(network address translation,網(wǎng)絡(luò)地址轉(zhuǎn)換)表來實(shí)現(xiàn)數(shù)據(jù)包的轉(zhuǎn)發(fā)。iptables命令要用-t來指定表,如果沒有指明,則使用系統(tǒng)缺省的表“filter”。所以使用NAT的時(shí)候,就要用“-t nat”選項(xiàng)了。
NAT表有三條缺省的鏈,它們分別是PREROUTING、POSTROUTING和OUTPUT。
先給出NAT結(jié)構(gòu),如下圖:
PREROUTING:在數(shù)據(jù)包傳入時(shí),就進(jìn)到PREROUTIING鏈。該鏈執(zhí)行的是修改數(shù)據(jù)包內(nèi)的目的IP地址,即DNAT(變更目的IP地址)。PREROUTING只能進(jìn)行DNAT。因?yàn)檫M(jìn)行了DNAT,才能在路由表中做判斷,決定送到本地或其它網(wǎng)口。
POSTROUTING:相對(duì)的,在POSTROUTING鏈后,就傳出數(shù)據(jù)包,該鏈?zhǔn)钦麄€(gè)NAT結(jié)構(gòu)的最末端。執(zhí)行的是修改數(shù)據(jù)包的源IP地址,即SNAT。POSTROUTING只能進(jìn)行SNAT。
OUTPUT:定義對(duì)本地產(chǎn)生的數(shù)據(jù)包的目的NAT規(guī)則。
每個(gè)數(shù)據(jù)包都會(huì)依次經(jīng)過三個(gè)不同的機(jī)制,首先是PREROUTING(DNAT),再到路由表,最后到POSTROUTING(SNAT)。下面給出數(shù)據(jù)包流方向:
文中的網(wǎng)絡(luò)拓?fù)鋱D所示的數(shù)據(jù)包,是從eth0入,eth1出。但是,無論從eth0到eth1,還是從eth1到eth0,均遵守上述的原理。就是說,SNAT和DNAT并沒有規(guī)定只能在某一個(gè)網(wǎng)口(某一側(cè))。
順便給出netfilter的完整結(jié)構(gòu)圖:
二、實(shí)現(xiàn)
出于安全考慮,Linux系統(tǒng)默認(rèn)是禁止數(shù)據(jù)包轉(zhuǎn)發(fā)的。所謂轉(zhuǎn)發(fā)即當(dāng)主機(jī)擁有多于一塊的網(wǎng)卡時(shí),其中一塊收到數(shù)據(jù)包,根據(jù)數(shù)據(jù)包的目的ip地址將包發(fā)往本機(jī)另一網(wǎng)卡,該網(wǎng)卡根據(jù)路由表繼續(xù)發(fā)送數(shù)據(jù)包。這通常就是路由器所要實(shí)現(xiàn)的功能。
配置Linux系統(tǒng)的ip轉(zhuǎn)發(fā)功能,首先保證硬件連通,然后打開系統(tǒng)的轉(zhuǎn)發(fā)功能
cat /proc/sys/net/ipv4/ip_forward,該文件內(nèi)容為0,表示禁止數(shù)據(jù)包轉(zhuǎn)發(fā),1表示允許,將其修改為1。可使用命令echo "1" > /proc/sys/net/ipv4/ip_forward修改文件內(nèi)容,重啟網(wǎng)絡(luò)服務(wù)或主機(jī)后效果不再。若要其自動(dòng)執(zhí)行,可將命令echo "1" > /proc/sys/net/ipv4/ip_forward 寫入腳本/etc/rc.d/rc.local 或者在/etc/sysconfig/network腳本中添加 FORWARD_IPV4="YES"
但在我的系統(tǒng)中沒有這兩個(gè)文件,因此可以修改/etc/sysctl.conf文件,將net.ipv4.ip_forward=1的注釋取消即可
根據(jù)拓?fù)鋱D,一一實(shí)現(xiàn)不同IP、不同端口的映射,如下命令為一種示例形式:
# 第一臺(tái)設(shè)備的telnet服務(wù)iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 23 -j SNAT --to 100.100.100.44# 第二臺(tái)設(shè)備的telnet服務(wù)iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 23 -j SNAT --to 100.100.100.44 # 第一臺(tái)設(shè)備的web服務(wù)iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 80 -j SNAT --to 100.100.100.44# 第二臺(tái)設(shè)備的web服務(wù)iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 80 -j SNAT --to 100.100.100.44
以第一臺(tái)設(shè)備轉(zhuǎn)發(fā)命令為例,用白話解釋一下。
第一條是PREROUTING鏈,只能進(jìn)行DNAT,該命令對(duì)從eth0進(jìn)入且目的IP為172.18.44.44(注:可以用-s指明數(shù)據(jù)包來源地址,但這時(shí)無法知道來源IP是多少,雖然可以用網(wǎng)段的做法,但用-d則指定必須一定唯一的是本機(jī)的eth0地址,相對(duì)好一點(diǎn)),端口號(hào)為2321的數(shù)據(jù)包進(jìn)行目的地址更改,更改為100.100.100.101,端口為23,亦即此包的目的地為第一臺(tái)設(shè)備的telnet服務(wù)。
第二條是POSTROUTING鏈,只能進(jìn)行SNAT,即對(duì)先前已經(jīng)DNAT過的數(shù)據(jù)包修改源IP地址。這樣,這個(gè)數(shù)據(jù)包達(dá)到第一臺(tái)設(shè)備時(shí),源IP地址、目的IP地址,均為100.100.100.0/24網(wǎng)段了。
上述命令的SNAT有些冗余,可以做簡(jiǎn)化,命令如下:
# 第一臺(tái)設(shè)備的telnet、web服務(wù)iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80# 第二臺(tái)設(shè)備的telnet、web服務(wù)iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80# 源IP地址SNATiptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.0/24 -j SNAT --to 100.100.100.44
實(shí)際中使用的命令可能還有變化(簡(jiǎn)化),本文不再展示。
三、測(cè)試
為了保證文中所述的正確性,本節(jié)列出操作結(jié)果,以及實(shí)驗(yàn)過程的信息。服務(wù)器(網(wǎng)關(guān))上的路由表如下:
root@latelee:test# routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface100.100.100.0 * 255.255.255.0 U 0 0 0 eth1172.18.0.0*255.255.0.0U000eth0
可以看到服務(wù)器上有2個(gè)網(wǎng)卡,網(wǎng)段都不相同。iptables的NAT表如下:
root@latelee:~# iptables -L -t natChain PREROUTING (policy ACCEPT)target prot opt source destination DNAT tcp -- anywhere 172.18.44.44 tcp dpt:2324 to23Chain INPUT (policy ACCEPT)target prot opt source destination Chain OUTPUT (policy ACCEPT)target prot opt source destination Chain POSTROUTING (policy ACCEPT)target prot opt source destination SNAT all -- anywhere 100.100.100.0/24 to:100.100.100.44
可以看到,PREROUTING和POSTROUTING各有一條規(guī)則,這些規(guī)則由上文命令所產(chǎn)生。對(duì)應(yīng)的,在第一號(hào)設(shè)備上查看路由信息,如下:
root@latelee:~# routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface100.100.100.0 * 255.255.255.0 U 0 0 0 eth0172.18.0.0 * 255.255.0.0 U 0 0 0 eth1default 100.100.100.44 0.0.0.0 UG 0 0 0 eth0
可以看到這臺(tái)設(shè)備有2個(gè)網(wǎng)卡,默認(rèn)網(wǎng)關(guān)為服務(wù)器的IP地址。但是,其中一個(gè)網(wǎng)卡eth1竟然和PC所在網(wǎng)段相同!如果沒有進(jìn)行源IP地址修改(偽裝),會(huì)匹配到eth1這個(gè)網(wǎng)口,無法匹配eth0。
在外網(wǎng)的PC上對(duì)設(shè)備進(jìn)行telnet,設(shè)備抓包信息如下:
IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 1:4, ack 16, win 256, length 3IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 4:25, ack 19, win 256, length 21IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 19:34, ack 25, win 2190, length 15
可見,所有包的IP段都相同。在服務(wù)器上對(duì)內(nèi)網(wǎng)eth1進(jìn)行抓包,由于進(jìn)行了DNAT和SNAT,此網(wǎng)卡數(shù)據(jù)包IP地址還是100.100.100.0/24網(wǎng)段,如下:
IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [.], ack 1, win 256, length 0IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 1:16, ack 1, win 2190, length 15IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [P.], seq 1:4, ack 16, win 256, length 3IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3
但是,在服務(wù)器eth0抓包,將會(huì)是172.18.0.0/16的網(wǎng)段數(shù)據(jù)包:
IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [P.], seq 18:20, ack 154, win 255, length 2IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [P.], seq 154:156, ack 20, win 2190, length 2IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [F.], seq 156, ack 20, win 2190, length 0IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [.], ack 157, win 255, length 0IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [F.], seq 20, ack 157, win 255, length 0IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [.], ack 21, win 2190, length 0
從抓包分析,本文所用命令已經(jīng)能正確進(jìn)行DNAT和SNAT了。
四、其它
建議在使用iptabls指令時(shí),使用root用戶進(jìn)行操作,否則容易失敗
保存iptables配置方法:
iptables-save > /etc/iptables.up.rules
配置iptables開機(jī)加載
iptables-save>/etc/iptables.up.rulesecho -e '#!/bin/bash /sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptableschmod +x /etc/network/if-pre-up.d/iptables
本地測(cè)試指令
iptables -t nat -A PREROUTING -i wlan0 -d 192.168.11.100 -p tcp --dport 8081 -j DNAT --to 192.168.10.101:80iptables -t nat -A POSTROUTING -o eth0 -d 192.168.10.101 -p tcp --dport 80 -j SNAT --to 192.168.10.52
原文標(biāo)題:Linux之iptables端口轉(zhuǎn)發(fā):外網(wǎng)訪問內(nèi)網(wǎng)
文章出處:【微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
Linux
+關(guān)注
關(guān)注
87文章
11320瀏覽量
209840 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9233瀏覽量
85636 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7580瀏覽量
88939
原文標(biāo)題:Linux之iptables端口轉(zhuǎn)發(fā):外網(wǎng)訪問內(nèi)網(wǎng)
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論