終於搞定iptables了,,開頭就對著人家配對了的配置對抄,但怎也不對,在網上搜了N多文章也不對,終於找到了一篇比較詳細的,看了二次,終於配置成功,現在可以用端口映射訪問內網的SSH和VNC等等的了
iptables是一個Linux下優秀的nat+防火牆工具,我使用該工具以較低配置的傳統pc配置了一個靈活強勁的防火牆+nat系統,小有心得,看了網上也有很多這方面的文章,但是似乎要麼說的比較少,要麼就是比較偏,內容不全,容易誤導,我研究了一段時間的iptables同時也用了很久,有點滴經驗,寫來供大家參考,同時也備日後自己翻閱。
首先要說明的是,iptables操作的是2.4以上內核的netfilter.所以需要linux的內核在2.4以上。其功能與安全性遠遠比其前輩 ipfwadm,ipchains強大,iptables大致是工作在OSI七層的二、三、四層,其前輩ipchains不能單獨實現對tcp/udp port以及對mac地址的的定義與操作,所以我想ipchains應該是僅僅工作在三層上的。
我們先簡單介紹一下netfilter的大致工作流程,也就是一個數據包(或者叫分組、packet,我個人習慣叫包)在到達linux的網絡接口的時候(網卡)如何處理這個包,然後再介紹一下如何用iptables改變或者說控制對這個數據包進行操作。netfilter內部分為三個表,分別是 filter,nat,mangle,每個表又有不同的操作鏈(Chains)。在filter(過濾)表中,也就是他的防火牆功能的這個表,定義了三個 Chain。分別是INPUT,FORWARD,OUTPUT。也就是對包的入、轉發、出進行定義的三個過濾鏈。對於這個filter表的操作和控制也是我們實現防火牆功能的一個重要手段;在nat(Network Address Translation、網絡地址翻譯)表中,也就是我們用以實現地址轉換和端口轉發功能的這個表,定義了PREROUTING, POSTROUTING,OUTPUT三個鏈,下面我們會對這三個鏈作詳細的說明;而netfilter的mangle表則是一個自定義表,裡面包括上面的filter以及nat表中的各種chains,它可以讓我們進行一些自定義的操作,同時這個mangle表中的chains在netfilter對包的處理流程中處在一個比較優先的位置,下面有一張圖清晰的描繪了netfilter對包的處理流程(該圖摘自網上,不知作者是誰,在此深表敬意!),一般情況下,我們用不到這個mangle表,在這裡我們就不做介紹了。
大家可以看到,PREROUTING這個chain在最前面,當一個包來到linux的網絡接口的時候先過mangle的PREROUTING,然後是 nat的PREROUTING,從這個chain的名字我們可以看出,這個chain是在路由之前(pre-routing)要過的。為什麼要在路由之前過呢?大家可以看到這個圖上,上面有一個菱形的部分叫ROUTING,這個ROUTING部分就是Linux的route box,也就是路由系統,它同樣有很高深的功能,可以實現策略路由等等一些高級特性,此處我們不做詳細解釋。單說這個PREROUTING鏈,因為在這個鏈裡面我們對包的操作是DNAT,也就是改變目的地址和(或端口),通常用在端口轉發,或者nat到內網的DMZ區,也就是說當一個包過來的時候我們要改變它的目的地址,大家可以想想,如果一個包在改變目的地址之前就被扔進了route box,讓系統選好路之後再改變目的地址,那麼選路就可能是錯的,或者說毫無意義了,所以,PREROUTING這個Chain一定要在進Routing 之前做。比如說,我們的公網ip是60.1.1.1/24,位於linux中的eth0,內網ip是10.1.1.1/24位於linux中的eth1, 我們的內網有一台web服務器,地址是10.1.1.2/24,我們怎麼樣能讓internet用戶通過這個公網ip訪問我們內部的這個web服務器呢?我們就可以在這個PREROUTING鏈上面定義一個規則,把訪問60.1.1.1:80的用戶的目的地址改變一下,改變為10.1.1.2:80,這樣就實現了internet用戶對內網服務器的訪問了,當然了,這個端口是比較靈活的,我們可以定義任何一個端口的轉發,不一定是80-->80,具體的命令我們在下面的例子中介紹,這裡我們只談流程與概念上的實現方法。
好了,我們接著往下走,這個包已經過了兩個PREROUTING鏈了,這個時候,出現了一個分支轉折的地方,也就是圖中下方的那個菱形(FORWARD),轉發!這裡有一個對目的地址的判斷(這裡同樣說明了PREROUTING一定要在最先,不僅要在route box之前,甚至是這個對目的地址的判斷之前,因為我們可能做一個去某某某ip的地方轉到自己的ip的規則,所以PREROUTING是最先處理這個包的 Chain)!如果包的目的地是本機ip,那麼包向上走,走入INPUT鏈處理,然後進入LOCAL PROCESS,如果非本地,那麼就進入FORWARD鏈進行過濾,我們在這裡就不介紹INPUT,OUTPUT的處理了,因為那主要是對於本機安全的一種處理,我們這裡主要說對轉發的過濾和nat的實現。