1. 程式人生 > >防火墻的配置與備份----iptables的四條鏈

防火墻的配置與備份----iptables的四條鏈

防火墻 iptables nat filter input forward

一、基本知識

在現在的網絡環境當中,我們使用的主機或者服務器很容易受到攻擊,所以人們不斷的針對各種攻擊研究相應的對策,像殺毒軟件這些,但是這些都是治標不治本,只能在受到攻擊的之後再做出相應的處理,那麽為了能夠從根源上應對這種攻擊,人們開發出了防火墻,將不安全的因素擋在主機外部,這樣避免了主機和網絡的直接接觸就使主機的安全提升了很多。但是哪些才能算作不安全的因素呢?這就要考驗防火墻規則的編寫人員了。

在linux系統中使用的防火墻管理軟件叫做“iptables”,這個軟件僅僅是一款面向我們使用者的客戶端軟件,真正起作用的是一個叫做“netfilter”的軟件,這個軟件存在於內核當中,人們在“iptables”中編寫規則,然後這些規則被“netfilter”讀取,接下來“netfilter”就根據這些規則進行過濾,只有規則中允許的網絡訪問才放行。這樣就將一些未知的危險避免掉了。

在防火墻中定義了五條規則鏈(chain),分別是:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,但是這樣不好理解,所以人們又定義出了四張表來對五條規則鏈進行描述,四張表分別如下:

filter:進行過濾,防火墻

nat:用於修改報文的源地址或目的地址,以及端口號,負責地址轉換和地址偽裝

mangle:拆解報文並對封裝格式進行修改,然後再重新封裝報文,負責流量控制和數據標簽

raw:關閉nat表上啟用的連接追蹤的機制


這四張表的優先級是:raw --> mangle --> nat --> filter

,就是當防火墻進行過濾的時候按照這個順序來進行讀取。這四張表分別包含了以下鏈:

raw:PREROUTING,OUTPUT

mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat:PREROUTING,OUTPUT,POSTROUTING,INPUT

filter:INPUT,FORWARD,OUTPUT

註意:在CentOS 7中的nat表包含INPUT鏈,在此之前的其他發行版本的iptables中,nat表則不包含INPUT鏈

註意:每一個表中包含的鏈和其他表中的鏈是不同的,即在別的表中向鏈裏添加的規則在本表中的鏈是無法找到的

這樣劃分表的好處是將不同的功能進行區分,四個表分別對應不同的功能,而且有一個執行的先後順序,如果一個數據包僅僅需要轉發的功能,而不需要到本機來,那麽它就不需要去匹配到本機來的那些規則。這樣不僅提升了過濾的速度還省下了不少的資源。下面這張是網上找的圖片:

技術分享

根據上面定義的表,在匹配規則的時候就有了一定的順序:

流入本機訪問某進程的數據報文:

PREROUTING --> INPUT

由本機某進程發送出去的數據報文:

PREROUTING --> OUTPUT --> POSTROUTING

經由本機轉發的數據報文:

PREROUTING --> FORWARD --> POSTROUTING

netfilter的規則匹配順序:首項匹配,即如果匹配成功了第一條,那麽後頭的都不匹配

netfilter的規則一般是:匹配的條件 + 處理的動作,意思就是當匹配成功了這條規則,那麽就執行後面的指定的動作。匹配的條件分為兩種,一種是基本的匹配條件,這種匹配條件僅僅能夠簡單的檢測IP、TCP、UDP等報文的首部中某特定屬性並進行匹配的機制;第二種是擴展的匹配條件,這種匹配條件需要借助於擴展的功能模塊進行匹配的機制。處理的動作也是分為兩種,第一種是基本的處理,分成了三個,分別是:ACCEPT(接受),DROP(收到直接丟棄,無回復),REJECT(收到之後回復拒絕信息,帶有挑釁色彩,盡量不用);第二種是擴展動作,需要借助於擴展模塊才能進行的處理動作。

在添加規則之前我們要先考慮三件事,分別是:

1.報文的流經路徑,以判斷將規則添加至哪個鏈上

2.確定此次規則匹配實現的功能,以判斷將規則添加至哪個表

3.要確定匹配條件,以用於匹配數據報文

二、管理規則

iptables命令

規則的通用編寫格式

iptables [-t table] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-match-options]

-t table:指定選擇功能表,可以選擇的有raw,mangle,nat,filter,默認的是filter,默認的是filter表

COMMAND:

鏈的操作命令:

-P:policy,策略,定義指定鏈的默認策略;一般有兩種選擇,即ACCEPT或DROP(當所有的規則都不能匹配的時候所采取的操作)

-N:new chain,新建一條自定義的規則鏈(默認是沒有意義的),只有被內建鏈上的規則調用才能使自定義規則鏈上的規則生效; -j chain_name

-X:drop chain,刪除被內建鏈引用次數為零的自定義鏈

-F:flush,清除指定鏈上的所有規則(裏邊的所有規則都會被廢棄),如果沒有指定鏈則清空整個表上的所有鏈的所有規則

-E:重命名被內建鏈引用次數為零的自定義鏈

規則的操作命令:

-A:append,追加,在指定的鏈的尾部追加一條規則

-I [#]:insert,插入成為第#條,如果省略了這個數字則表示插入到鏈的第一條

例如: -I 3:將此條規則插入鏈中成為第三條

-D [#]:delete,刪除,刪除指定的規則

-R:reolace,替換,用指定的規則去替換目標鏈中的原有規則;不能僅修改規則中的某一部分,而是整條規則完全替換

例如:要想替換其中的一部分,也要將其他部分原封不動的再寫一遍

查看規則的命令:

-L:list,列出指定表指定鏈上的所有規則

-n:numeric,將規則中的信息數字化顯示,主要指:主機名和端口號

-v:verbose,顯示詳細格式的信息,還有-vv,-vvv

-x:exactly,精確的顯示計數器的結果

--line-numbers:顯示規則鏈中的規則編號

每一條規則都有兩個計數器

1.匹配的報文的個數

2.匹配的報文的總的字節數

重置規則計數器(將計數器計數歸零)

-Z:zero,將指定表指定鏈上的規則的計數器置零

CHAIN:

這裏的鏈可以是內建的五條鏈:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,在寫命令的時候內建鏈必須全部大寫

還可以是自建鏈,名字大小寫均可以

匹配條件(大部分的命令內容都是匹配條件):

基本匹配條件

默認情況下多個條件之間是邏輯“與”的關系

!:指對匹配的條件取反;有除了...之意

[!] -s, --source address[/mask][,...]

檢查報文中的源IP地址是否符合此條件指定的地址或範圍

[!] -d, --destination address[/mask][,...]

檢查報文中的目標IP地址是否符合此條件指定的地址或範圍

[!] -p, --protocol protocol

檢查封裝報文的協議是否符合此條件指定的協議

protocol:tcp,udp,ip,icmp,arp,...

只要是TCP/IP協議棧中,傳輸層和網絡層的協議均可

[!] -i, --in-interface name

檢查數據報文入站的接口是否對應此條件中指定的接口

[!] -o, --out-interface name

檢查數據報文出站的接口是否對應此條件中指定的接口

註意:在INPUT鏈上指定出站接口沒有意義;在OUTPUT鏈上指定入站接口沒有意義

在規則定義的時候要註意以下事項:

1.規則的匹配按照順序由上至下,規則的編寫順序:

1)同一類規則,匹配範圍最小的放在最前面;

2)非同一類規則,匹配頻率越高的放在最前面;

3)設置最後一條規則或默認策略為拒絕所有主機訪問;

2.盡可能減少規則的數量,能不寫的就不寫,能合並的就合並;規則精簡;

3.定時對規則進行備份,避免失誤無法挽回的情況;


基本匹配條件示例:

允許來自IP:172.16.0.0/16訪問目標主機:172.16.72.1和172.16.72.101(可以是同一塊網卡上的兩個IP,也可以是一臺主機上的兩塊網卡分別的兩個IP)(如果沒指定表,默認是filter表,下同)

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.72.1,172.16.72.101 -j ACCEPT

將INPUT鏈的默認策略修改為“DROP”,即當所有匹配條件都沒匹配成功時執行“DROP”拒絕

iptables -P INPUT DROP (註意:最好是在鏈最後添加"拒絕所有主機訪問"的規則)

將允許來自172.16.0.0/16網段訪問172.16.72.101 IP的規則插入到INPUT鏈的第二條

iptables -I 2 INPUT -s 172.16.0.0/16 -d 172.16.72.101 -j ACCEPT

將允許172.16.0.1訪問172.16.72.1的TCP 22號端口規則插入到INPUT鏈第一條(在-I選項後如果沒表明數字,默認是插入到第一條,下同)

iptables -I INPUT -s 172.16.0.1 -d 172.16.72.1 -p tcp --dport 22 -j ACCEPT

拒絕別的主機ping本機(0類型叫做回顯應答(ping應答),8類型叫做回顯請求(ping請求))

iptables -I INPUT 2 -s 172.16.69.1 -p icmp --icmp-type 8 -j ACCEPT

阻止本機ping別的主機(一般將此條放到OUTPUT鏈上,icmp-type改為8,實現的功能類似(如果沒改,那麽功能是阻止別的主機ping本機)(規律就是在INPUT鏈上8進,0出;在OUTPUT鏈上反過來))

iptables -I INPUT 3 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT
iptables -I OUTPUT 3 -d 172.16.0.0/16 -p icmp --icmp-type 8 -j ACCEPT

擴展匹配條件:

隱式擴展

-p {tcp|udp|icmp|ip...} [-m tcp|udp|icmp](可寫可不寫,稱為隱式擴展)

tcp:--sport,--dport,--tcp-flags,--syn(相當於--tcp-flags SYN,RST,ACK,FIN SYN 這樣寫的意思是前半部分為必檢查部分,後頭為必為1的部分,即除了後頭這個標誌之外,其他都要為0。例如上面的--tcp-flags SYN,RST,ACK,FIN SYN,SYN必為1,RST,ACK,FIN必為0)

udp:--sport,--dport

icmp:--icmp-type {8|0}

顯示擴展:


1.multiport擴展(多端口擴展);

以離散或連續的方式定義多個端口匹配條件:

[!] --source-ports,--sports port[,port|,port:port]...(多個源端口)

[!] --destination-ports,--dports port[,port|,port:port]...(多個目的端口)

[!] --ports port[,port|,port:port]...(多個源或目的端口,源、目的端口同時匹配)

例如:21,22,23,80,1000:2000

示例:

~]# iptables -I INPUT -d 172.16.72.1 -s 172.16.0.0/16 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT


2.iprange擴展:

以連續的IP地址範圍指明連續的多個地址的匹配條件:

[!] --src-range from[-to]

[!] --dst-range from[-to]

例如:172.16.50.1-172.16.72.254

示例:

~]# iptables -I INPUT 4 -m iprange --src-range 172.16.0.1-172.16.72.254 -p tcp -m multiport --dports 21,22,80 -j ACCEPT


3.string擴展:

對報文中的應用層數據做字符串匹配檢測;

--algo {bm|kmp}:選擇處理字符串的算法;

[!] --string pattern:指明要檢查匹配的字符串;

示例:

~]# iptables -A OUTPUT -s 172.16.72.1 -d 172.16.0.0/16 -m string --string "admin" --algo kmp -j DROP


4.time擴展:

根據報文到達的時間與指定的時間範圍進行匹配度檢測

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]


--timestart hh:mm[:ss]

--timestop hh:mm[:ss]


[!] --monthdays day[,day...]

[!] --weekdays day[,day...]

示例:

~]# iptables -I INPUT -d 172.16.72.1 -p tcp -m multiport --dports 21,23,80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Sat,Sun --kerneltz -j ACCEPT


5.connlimit擴展:

根據每個客戶端IP做並發連接數的匹配

--connlimit-upto n:連接數數量小於等於n,此時規則應設置為允許

--connlimit-above n:連接數數量大於n,此時規則應設置為拒絕

示例:

~]# iptables -I INPUT -d 172.16.72.1 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT


6.limit擴展:

基於收發報文的速率進行匹配

--limit rate[/second|/minute|/hour|/day]

--limit-burst number

示例:

~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 8 -j ACCEPT


7.states擴展:

狀態檢測:基於連接追蹤機制實現:conntrack

狀態:

INVALID:無法識別的狀態;無效狀態

ESTABLISHED:已建立連接的狀態;連接態

NEW:尚未建立連接的狀態,新連接態

RELATED:與其他已建立的連接相關聯的狀態;關聯態或衍生態(如果允許了一個,那麽它所衍生的均放行)

UNTRACKED:未追蹤的連接

追蹤到的連接所保存的位置

/proc/net/nf_conntrack

能夠被追蹤的最大連接數的定義:

/proc/sys/net/nf_conntrack_max

(lsmod:查看模塊(卸載模塊))

(modprobe nf_conntrack_ftp:加載模塊)

(modprobe -r:移除模塊)

註意:此最大連接數的數值,建議必要時可以調整到足夠大

不同協議的連接追蹤的超時時間:

/proc/sys/net/netfilter/*timeout

示例:

~]# iptables -I INPUT -d 172.16.72.1 -m state --state ESTABLISHED,RELATED -j ACCEPT
`]# iptables -I INPUT 2 -d 172.16.72.1 -p tcp -m multiport --dports 21,22,23,80,3306 -m state --state NEW -j ACCEPT
~]# iptables -A INPUT -j DROP

註意:默認的規則或最後一條規則拒絕所有主機訪問;

~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -j DROP

FORWARD鏈:

以上的操作如果沒有指明特定的表的話,都是在filter表中進行的修改,那麽我們如果有一個數據包不需要進入本主機,而是直接轉發出去,就可以使用nat表的FORWARD鏈進行設置,但是在進行設置之前,如果我們是在一臺主機上進行實驗,那麽就要先將這臺主機的轉發功能開啟,開啟轉發的三種方法:

1.echo 1 > /proc/sys/net/ipv4/ip_forward
2.sysctl -w net.ipv4.ip_forward=1
3.echo "net.ipv4.ip_forward = 1" >> vim /etc/sysctl.conf
  sysctl -p

以上這三種方法實現的功能都是一樣的。接下來就開始做轉發的實驗,首先我們要準備至少兩臺主機,現在我準備了三臺主機,IP分別是:172.16.7.100/16、(172.16.6.3、172.61.6.3)、172.61.7.1,在括號中的兩個IP是同一臺主機上的兩個不同IP:

技術分享

技術分享

此時,只有同網段的IP可以互相ping通,例如,172.16.7.100可以ping通172.16.6.3,但是不能ping通172.61.6.3,在IP為172.16.6.3的主機上可以通過IP172.61.6.3 ping通172.61.7.1,172.16.7.100 ping 172.61.6.3不通的原因是因為我們沒有進行默認網關指定:

技術分享

技術分享

技術分享

所以我們需要在IP為172.16.7.100的主機上設置默認網關,使用命令:

~]# route add default gw 172.16.6.3

技術分享

但是還是不能ping 172.61.7.1,這是因為沒有在IP為172.16.6.3的主機上設置轉發,在我準備的這三臺主機中,IP為172.16.6.3的這臺主機相當於一臺防火墻,172.61/16網段相當於內網,而172.16/16網段相當於外網。使用下面這條命令(上面提到的三種方法都可以)開啟相當於防火墻的這臺主機的轉發功能:

~]# sysctl -w net.ipv4.ip_forward=1

然後將作為內部IP為172.61.7.1的主機的默認網關也設置為172.61.6.3這臺主機:

~]# route add default gw 172.61.6.3

上面的操作可以用下面這張圖來概括(箭頭代表數據流向,比如ping主機3,則是數據包先到主機2,然後再到主機3):

技術分享

此時,主機1就可以ping通主機3了:

技術分享

此時我們就可以在主機2上添加一條規則來檢驗FORWARD鏈是否有效:

~]# iptables -I FORWARD -s 172.16.7.100 -d 172.61.7.1 -j ACCEPT

還可以使用“watch”命令動態查看規則匹配到的數量:

~]# watch iptables -vnL

然後在主機1上ping主機3,“ping 172.61.7.1”就可以在watch命令中看到不斷增長的匹配到的數目:

技術分享

這樣,就說明FORWARD鏈已經工作起來了,然後我們就可以寫自己的規則:

~]# iptables -A FORWARD -j DROP 
    拒絕所有的轉發,這一條寫在最後,就可以避免一些未知的訪問
~]# iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    這一條是允許狀態為ESTABLISHED或者RELATED的數據包通過
~]# iptables -I FORWARD 2 -d 172.61.7.1 -p tcp -m multiport --dports 21:23,80,3306 -m state --state NEW -j ACCEPT
    這一條是允許訪問目標IP為172.61.7.1且端口為21到23,和80、3306的狀態為新建立連接的TCP數據包通過
~]# iptables -I FORWARD 3 -d 172.61.7.1 -p udp --dport 53 -m state --state NEW -j ACCEPT
    這一條是允許目標IP為172.61.7.1端口為UDP的53號,狀態為新建的數據包通過
~]# iptables -I FORWARD 4 -s 172.61.7.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
    這一條是允許外部主機ping內部網段為172.61.7.0/24的主機

建立自定義鏈:

在一臺配置了很多的規則的主機上想要對規則進行管理是一件很麻煩的事情,所以我們可以通過自定義鏈的方式來對規則進行更好的管理。

自定義鏈的配置方法:

~]# iptables -N udp_match
    首先要建立一條自定義鏈,並為其命名
~]# iptables -A udp_match -j RETURN
    然後在自定義鏈中最好添加一條這個規則,目的是當執行完自定義鏈之後返回調用此鏈的主鏈(後頭會再說)
~]# iptables -I udp_match -d 172.61.7.1 -p udp --dport 53 -j ACCEPT
    最後就可以在自定義鏈中添加規則了

但是定義好的自定義鏈是無法使用的,因為防火墻是不管這種自定義鏈的,所以我們要將自定義鏈掛到五條主鏈上,使用命令:

~]# iptables -I FORWARD 4 -p udp -j udp_match
    這條規則的作用是當在FORWARD鏈中匹配到udp協議的數據包時就跳轉到自定義鏈中

由此我們可以發現自定義鏈的優點是不僅能夠對規則進行分類,更好的作用是對匹配的內容進行分類,例如上面這個例子,如果一個數據包不是udp協議,那麽就可以直接跳過很多的規則,這樣大大的增快了匹配的速度。

有的時候我們需要更改自定義鏈的名稱:

註意:要改名的自定義鏈不能被其他鏈引用

~]# iptables -E old_chain_name(原來的名字) new_chain_name(新的名字)

示例:

~]# iptables -E udp_match udp


還有可能需要刪除自定義鏈:

~]# iptables -X udp

註意:

1.要刪除的自定義鏈必須是引用計數為0的鏈;即不能被任何其他鏈引用鏈接;

2.要刪除的自定義鏈上必須為空,即沒有任何規則;



NAT表:

NAT英文全稱是“Network Address Translation”

從網絡上查到的一句話很簡單的概括了這個表的作用:顧名思義,它是一種把內部私有網絡地址(IP地址)翻譯成合法網絡IP地址的技術。因此我們可以認為,NAT在一定程度上,能夠有效的解決公網地址不足的問題,想知道更多,可以到這個網址看看:http://blog.jobbole.com/90005/

和http://blog.csdn.net/jk110333/article/details/8229828

NAT的主要功能有兩個,分別是:

1.NAT,網絡地址轉換

1) SNAT:讓內部網絡中的主機訪問外部網絡;在路由之後完成地址轉換,將此類規則配置在POSTROUTING鏈上

a.靜態地址轉換

b.地址偽裝(動態地址轉換)

2) DNAT:讓外部網絡中的主機訪問內部網絡中的服務器上的各服務;在路由之前完成地址轉換,將此類規則配置在PREROUTING鏈上

地址轉換+端口映射

2.NAPT,端口轉換或端口映射


SNAT的靜態地址轉換幫助我們將內網的IP轉化為外網的IP:

--to-source [ipaddr[-ipaddr]][:port[-port]]

註意:在REHL系或CentOS系操作系統上,SNAT中指定ipaddr必須為當前主機已經配置的IP地址;

示例:

~]# iptables -t nat -R POSTROUTING 1 -s 172.16.0.0/16 -j SNAT --to-source 172.61.100.100

接下來我們開始做網絡地址轉換的實驗,首先還是上面的那三臺主機,分別如圖所示:

技術分享

此時我們將主機1當作內部網絡,主機2當作防火墻,主機3當作外部網絡,因為是外部網絡,所以不可能有指向防火墻的默認網關,所以我們僅僅在主機3上設置默認網關:

~]# route add default gw 172.16.6.3

因為沒有默認網關,所以172.16.7.100到172.61.7.1的數據包是可以到達的,但是卻不能返回,所以表現出來的結果就是無法ping通:

技術分享

在主機3上可以使用下面這個命令查看到本機網絡接口的數據包(要保持ping不中斷)(使用CTRL+C終止):

 ~]# tcpdump -i eth0 icmp

技術分享

此時我們可以使用下面這條命令來轉化源IP地址:

~]# iptables -t nat -I POSTROUTING -s 172.16.7.100 -j SNAT --to-source 172.61.6.3

註意:轉化後的目標地址必須是在當前主機上存在的地址,比如說我現在是在主機2上寫的這條規則,那麽主機2上就必須有172.61.6.3這個IP。

在寫入這條規則之後,再重新進行ping操作,即可發現可以ping通了:

技術分享


MASQUERADE:這個也屬於SNAT地址轉換,但是不同於上頭的在於它不用指定轉換的目標IP,它會根據當前的網卡信息自動選擇IP,格式為:

--to-ports port[-port]

示例:

~]# iptables -t nat -I POSTROUTING 1 -s 172.16.0.0/16 -j MASQUERADE

以上就是類似於從局域網內穿透出去訪問外網的防火墻設置方法,那麽接下來就來說一說從外部訪問內部的配置方法:DNAT

格式為:--to-destination [ipaddr[-ipaddr]][:port[-port]]

它的作用在於隱藏內部主機的IP,而當外部主機有需要訪問內部主機的時候,只能訪問防火墻,在通過防火墻來將IP轉換為內部主機,避免了外部主機和內部主機的直接接觸。

例如,我們還是在剛才的三個主機中當作防火墻的主機2中寫入如下規則:

~]# iptables -t nat -A PREROUTING -d 172.61.6.5 -j DNAT --to-destination 172.61.7.1

這樣就將指向防火墻的IP指向了內部的主機,我們可以通過ssh命令連接172..61.6.5,發現登陸上去的IP是172.61.7.1:

技術分享

這樣就實現了隱藏內部主機IP或者說從外網訪問內網的功能,除此之外,我們還可以專門針對某一個服務來做端口的轉換,這樣我們就可以將不同的服務部署在不同的主機上。實驗使用到的環境還可以是上面的三個主機,不過,我們要將剛才的那條規則刪掉,使用下面這條命令:

~]# iptables -t nat -F PREROUTING

然後,我們在主機3上使用下面這條命令建立一個網頁(首先要確保httpd已經安裝並開啟,安裝方法參考之前的博文):

~]# echo "Hello, This 172.61.7.1" > /var/www/html/index.html

同時修改主機3上監聽的端口號(默認是80),改為8090(通過配置文件修改,找到Listen 80這一行,在後邊加上90):

~]# vim /etc/httpd/conf/httpd.conf
    或者sed命令:
~]# sed -in /^Lis*/c"Listen 8090" ~]# systemctl restart httpd.service

再在主機2上同樣也建立一個網頁(這個網頁沒有用處,只是為了驗證訪問的不是這個網址):

]# echo "Hello, This 172.61.7.1" > /var/www/html/index.html

最後,我們在作為防火墻的主機2上編寫下面這條規則:

~]# iptables -t nat -A PREROUTING -d 172.16.6.6 -p tcp --dport 80 -j DNAT --to-destination 172.61.7.1:8090

此時就可以使用下面這個命令來獲取網頁了(發現,雖然訪問的是172.61.6.6,但是返回的是172.61.7.1的網頁):

~]# curl http://172.61.6.6

或者我們還可以再添加一條命令:

~]# iptables -t nat -A PREROUTING -d 172.16.6.3 -p tcp --dport 80 -j DNAT --to-destination 172.61.7.1:8090

這樣將172.16.6.3的80端口也轉移到172.61.7.1的8090端口上:

技術分享

REDIRECT:當然,還可以在主機3上直接進行端口重定向

格式:--to-ports port[-port]

首先先將剛才的地址轉換刪除:

~]# iptables -t nat -F PREROUTING

這樣雖然不能地址轉換了,但是因為POSTROUTING鏈的規則還在,所以我們可以直接訪問172.61.7.1的8090端口,但是不接端口還是不行,因為默認的是80端口:

~]# curl http://172.61.7.1:8090

技術分享

接下來在主機3上使用下面這個命令,即可發現此時再執行剛才的命令,就可以發現通了:

~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8090

技術分享

三、規則的備份和恢復

上面就是配置規則的方法了,但是有的時候不可避免的會出現規則丟失,所以我們要對防火墻的規則定時的備份。使用命令:

iptables-save > /PATH/TO/SOME_RULE_FILE(保存到一個不會丟失的路徑下) -- 備份
iptables-restore < /PATH/FROM/SOME_RULE_FILE    -- 恢復
    也可以直接使用命令:
        service iptables save (CentOS 6 中)
            默認會將當前生效的所有規則直接送往/etc/sysconfig/iptables文件中保存;



防火墻的配置與備份----iptables的四條鏈