防火牆(Firewall),也稱防禦牆,是由Check Point創立者Gil Shwed於1993年發明並引入國際互聯網(US5606668(A)1993-12-15)。它是一種位於內部網絡與外部網絡之間的網絡安全系統。一項信息安全的防禦系統,依照特定的規則,容許或是限制傳輸的數據經過。php
防火牆就是一種過濾塞(你這麼理解不算錯),你可讓你喜歡的東西經過這個塞子,別的玩意都通通過濾掉。在網絡的世界裏,要由防火牆過濾的就是承載通訊數據的通訊包。html
在網絡中,所謂「防火牆」,是指一種將內部網和公衆訪問網(如Internet)分開的方法,它其實是一種隔離技術。防火牆是在兩個網絡通信時執行的一種訪問控制尺度,它能容許你「贊成」的人和數據進入你的網絡,同時將你「不一樣意」的人和數據拒之門外,最大限度地阻止網絡中的黑客來訪問你的網絡。換句話說,若是不經過防火牆,公司內部的人就沒法訪問Internet,Internet上的人也沒法和公司內部的人進行通訊。linux
防火牆從誕生開始,已經歷了四個發展階段:基於路由器的防火牆、用戶化的防火牆工具套、創建在通用操做系統上的防火牆、具備安全操做系統的防火牆。常見的防火牆屬於具備安全操做系統的防火牆,例如NETEYE、NETSCREEN、TALENTIT等。web
從結構上來分,防火牆有兩種:即代理主機結構和路由器+過濾器結構,後一種結構以下所示:內部網絡過濾器(Filter)路由器(Router)Internetsql
從原理上來分,防火牆則能夠分紅4種類型:特殊設計的硬件防火牆、數據包過濾型、電路層網關和應用級網關。安全性能高的防火牆系統都是組合運用多種類型防火牆,構築多道防火牆「防護工事」。shell
防火牆是依照特定的規則來控制進出它的網絡流量的網絡安全系統。一個典型的場景是在一個受信任的內網和不受信任的外網好比 Internet 之間創建一個屏障。防火牆能夠是電腦上運行的軟件,也能夠是獨立的硬件設備。數據庫
網絡層防火牆可視爲一種 IP 封包過濾器,運做在底層的TCP/IP協議堆棧上。能夠以枚舉的方式只容許符合特定規則的封包經過,其他的一律禁止穿越防火牆(病毒除外,防火牆不能防止病毒侵入)。這些規則一般能夠經由管理員定義或修改,不過某些防火牆設備可能只能套用內置的規則。vim
應用層防火牆是在 TCP/IP 堆棧的「應用層」上運做,您使用瀏覽器時所產生的數據流或是使用 FTP 時的數據流都是屬於這一層。應用層防火牆能夠攔截進出某應用程序的全部封包,而且封鎖其餘的封包(一般是直接將封包丟棄)。理論上,這一類的防火牆能夠徹底阻絕外部的數據流進到受保護的機器裏。瀏覽器
數據庫防火牆是一款基於數據庫協議分析與控制技術的數據庫安全防禦系統。基於主動防護機制,實現數據庫的訪問行爲控制、危險操做阻斷、可疑行爲審計。
數據庫防火牆經過SQL協議分析,根據預約義的禁止和許可策略讓合法的SQL操做經過,阻斷非法違規操做,造成數據庫的外圍防護圈,實現SQL危險操做的主動預防、實時審計。
數據庫防火牆面對來自於外部的入侵行爲,提供SQL注入禁止和數據庫虛擬補丁包功能。緩存
第一代防火牆技術幾乎與路由器同時出現,採用了包過濾(Packet filter)技術。它檢查每個經過的網絡包,或者丟棄,或者放行,取決於所創建的一套規則。這稱爲包過濾防火牆。
本質上,包過濾防火牆是多址的,代表它有兩個或兩個以上網絡適配器或接口。例如,做爲防火牆的設備可能有兩塊網卡(NIC),一塊連到內部網絡,一塊連到公共的Internet。防火牆的任務,就是做爲「通訊警察」,指引包和截住那些有危害的包。
包過濾型防火牆工做在OSI網絡參考模型的網絡層和傳輸層,它根據數據包頭源地址,目的地址、端口號和協議類型等標誌肯定是否容許經過。只有知足過濾條件的數據包才被轉發到相應的目的地,其他數據包則從數據流中被丟棄。包過濾防火牆檢查每個傳入包,查看包中可用的基本信息(源地址和目的地址、端口號、協議等)。而後,將這些信息與設立的規則相比較。若是已經設立了阻斷telnet鏈接,而包的目的端口是23的話,那麼該包就會被丟棄。若是容許傳入Web鏈接,而目的端口爲80,則包就會被放行。
多個複雜規則的組合也是可行的。若是容許Web鏈接,但只針對特定的服務器,目的端口和目的地址兩者必須與規則相匹配,纔可讓該包經過。
最後,能夠肯定當一個包到達時,若是對該包沒有規則被定義,接下來將會發生什麼事情了。一般,爲了安全起見,與傳入規則不匹配的包就被丟棄了。若是有理由讓該包經過,就要創建規則來處理它。
創建包過濾防火牆規則的例子以下:
對來自專用網絡的包,只容許來自內部地址的包經過,由於其餘包包含不正確的包頭部信息。這條規則能夠防止網絡內部的任何人經過欺騙性的源地址發起攻擊。並且,若是黑客對專用網絡內部的機器具備了不知從何得來的訪問權,這種過濾方式能夠阻止黑客從網絡內部發起攻擊。
在公共網絡,只容許目的地址爲80端口的包經過。這條規則只容許傳入的鏈接爲Web鏈接。這條規則也容許與Web鏈接使用相同端口的鏈接,因此它並非十分安全。
丟棄從公共網絡傳入的包,而這些包都有你的網絡內的源地址,從而減小IP欺騙性的攻擊。丟棄包含源路由信息的包,以減小源路由攻擊。要記住,在源路由攻擊中,傳入的包包含路由信息,它覆蓋了包經過網絡應採起得正常路由,可能會繞過已有的安全程序。經過忽略源路由信息,防火牆能夠減小這種方式的攻擊。
動態包過濾(Dynamic packet filter)技術的第四代防火牆,後來演變爲所說的狀態監視(Stateful inspection)技術。狀態/動態檢測防火牆,試圖跟蹤經過防火牆的網絡鏈接和包,這樣防火牆就可使用一組附加的標準,以肯定是否容許和拒絕通訊。它是在使用了基本包過濾防火牆的通訊上應用一些技術來作到這點的。檢測型防火牆技術與過濾型相相似,可謂是過濾型的增強版,又稱爲動態過濾型技術。
當包過濾防火牆見到一個網絡包,包是孤立存在的。它沒有防火牆所關心的歷史或將來。容許和拒絕包的決定徹底取決於包自身所包含的信息,如源地址、目的地址、端口號等。包中沒有包含任何描述它在信息流中的位置的信息,則該包被認爲是無狀態的;它僅是存在而已。
一個有狀態包檢查防火牆跟蹤的不只是包中包含的信息。爲了跟蹤包的狀態,防火牆還記錄有用的信息以幫助識別包,例如已有的網絡鏈接、數據的傳出請求等。
例如,若是傳入的包包含視頻數據流,而防火牆可能已經記錄了有關信息,是關於位於特定IP地址的應用程序最近向發出包的源地址請求視頻信號的信息。若是傳入的包是要傳給發出請求的相同系統,防火牆進行匹配,包就能夠被容許經過。
一個狀態/動態檢測防火牆可截斷全部傳入的通訊,而容許全部傳出的通訊。由於防火牆跟蹤內部出去的請求,全部按要求傳入的數據被容許經過,直到鏈接被關閉爲止。只有未被請求的傳入通訊被截斷。
若是在防火牆內正運行一臺服務器,配置就會變得稍微複雜一些,但狀態包檢查是頗有力和適應性的技術。例如,能夠將防火牆配置成只容許從特定端口進入的通訊,只可傳到特定服務器。若是正在運行Web服務器,防火牆只將80端口傳入的通訊發到指定的Web服務器。
狀態/動態檢測防火牆可提供的其餘一些額外的服務有:
將某些類型的鏈接重定向到審覈服務中去。例如,到專用Web服務器的鏈接,在Web服務器鏈接被容許以前,可能被髮到SecutID服務器(用一次性口令來使用)。
拒絕攜帶某些數據的網絡通訊,如帶有附加可執行程序的傳入電子消息,或包含ActiveX程序的Web頁面。
跟蹤鏈接狀態的方式取決於包經過防火牆的類型:
TCP包。當創建起一個TCP鏈接時,經過的第一個包被標有包的SYN標誌。一般狀況下,防火牆丟棄全部外部的鏈接企圖,除非已經創建起某條特定規則來處理它們。對內部的鏈接試圖連到外部主機,防火牆註明鏈接包,容許響應及隨後再兩個系統之間的包,直到鏈接結束爲止。在這種方式下,傳入的包只有在它是響應一個已創建的鏈接時,纔會被容許經過。
UDP包。UDP包比TCP包簡單,由於它們不包含任何鏈接或序列信息。它們只包含源地址、目的地址、校驗和攜帶的數據。這種信息的缺少使得防火牆肯定包的合法性很困難,由於沒有打開的鏈接可利用,以測試傳入的包是否應被容許經過。但是,若是防火牆跟蹤包的狀態,就能夠肯定。對傳入的包,若它所使用的地址和UDP包攜帶的協議與傳出的鏈接請求匹配,該包就被容許經過。和TCP包同樣,沒有傳入的UDP包會被容許經過,除非它是響應傳出的請求或已經創建了指定的規則來處理它。對其餘種類的包,狀況和UDP包相似。防火牆仔細地跟蹤傳出的請求,記錄下所使用的地址、協議和包的類型,而後對照保存過的信息覈對傳入的包,以確保這些包是被請求的。
應用代理型防火牆是工做在OSI的最高層,即應用層。其特色是徹底「阻隔」了網絡通訊流,經過對每種應用服務編制專門的代理程序,實現監視和控制應用層通訊流的做用。應用程序代理防火牆實際上並不容許在它鏈接的網絡之間直接通訊。相反,它是接受來自內部網絡特定用戶應用程序的通訊,而後創建於公共網絡服務器單獨的鏈接。網絡內部的用戶不直接與外部的服務器通訊,因此服務器不能直接訪問內部網的任何一部分。
另外,若是不爲特定的應用程序安裝代理程序代碼,這種服務是不會被支持的,不能創建任何鏈接。這種創建方式拒絕任何沒有明確配置的鏈接,從而提供了額外的安全性和控制性。
例如,一個用戶的Web瀏覽器可能在80端口,但也常常多是在1080端口,鏈接到了內部網絡的HTTP代理防火牆。防火牆而後會接受這個鏈接請求,並把它轉到所請求的Web服務器。
這種鏈接和轉移對該用戶來講是透明的,由於它徹底是由代理防火牆自動處理的。
代理防火牆一般支持的一些常見的應用程序有:
HTTP
HTTPS/SSL
SMTP
POP3
IMAP
NNTP
TELNET
FTP
IRC
應用程序代理防火牆能夠配置成容許來自內部網絡的任何鏈接,它也能夠配置成要求用戶認證後才創建鏈接。要求認證的方式由只爲已知的用戶創建鏈接的這種限制,爲安全性提供了額外的保證。若是網絡受到危害,這個特徵使得從內部發動攻擊的可能性大大減小。
討論到防火牆的主題,就必定要提到有一種路由器,儘管從技術上講它根本不是防火牆。網絡地址轉換(NAT)協議將內部網絡的多個IP地址轉換到一個公共地址發到Internet上。
NAT常常用於小型辦公室、家庭等網絡,多個用戶分享單一的IP地址,併爲Internet鏈接提供一些安全機制。
當內部用戶與一個公共主機通訊時,NAT追蹤是哪個用戶做的請求,修改傳出的包,這樣包就像是來自單一的公共IP地址,而後再打開鏈接。一旦創建了鏈接,在內部計算機和Web站點之間來回流動的通訊就都是透明的了。
當從公共網絡傳來一個未經請求的傳入鏈接時,NAT有一套規則來決定如何處理它。若是沒有事先定義好的規則,NAT只是簡單的丟棄全部未經請求的傳入鏈接,就像包過濾防火牆所作的那樣。
但是,就像對包過濾防火牆同樣,你能夠將NAT配置爲接受某些特定端口傳來的傳入鏈接,並將它們送到一個特定的主機地址。
如今網絡上流傳着不少的我的防火牆軟件,它是應用程序級的。我的防火牆是一種可以保護我的計算機系統安全的軟件,它能夠直接在用戶的計算機上運行,使用與狀態/動態檢測防火牆相同的方式,保護一臺計算機免受攻擊。一般,這些防火牆是安裝在計算機網絡接口的較低級別上,使得它們能夠監視傳入傳出網卡的全部網絡通訊。
一旦安裝上我的防火牆,就能夠把它設置成「學習模式」,這樣的話,對遇到的每一種新的網絡通訊,我的防火牆都會提示用戶一次,詢問如何處理那種通訊。而後我的防火牆便記住響應方式,並應用於之後遇到的相同那種網絡通訊。
例如,若是用戶已經安裝了一臺我的Web服務器,我的防火牆可能將第一個傳入的Web鏈接做上標誌,並詢問用戶是否容許它經過。用戶可能容許全部的Web鏈接、來自某些特定IP地址範圍的鏈接等,我的防火牆而後把這條規則應用於全部傳入的Web鏈接。
基本上,你能夠將我的防火牆想象成在用戶計算機上創建了一個虛擬網絡接口。再也不是計算機的操做系統直接經過網卡進行通訊,而是以操做系統經過和我的防火牆對話,仔細檢查網絡通訊,而後再經過網卡通訊。
Linux防火牆在企業應用中很是有用,舉例以下:
綜述,Iptables有兩種應用模式:主機防火牆,NAT路由器。
Netfilter是由Rusty Russell提出的Linux 2.4內核防火牆框架,該框架既簡潔又靈活,可實現安全策略應用中的許多功能,如數據包過濾、數據包處理、地址假裝、透明代理、動態網絡地址轉換(Network Address Translation,NAT),以及基於用戶及媒體訪問控制(Media Access Control,MAC)地址的過濾和基於狀態的過濾、包速率限制等。Iptables/Netfilter的這些規則能夠經過靈活組合,造成很是多的功能、涵蓋各個方面,這一切都得益於它的優秀設計思想。Netfilter/Iptables 數據包過濾系統能夠當成一個總體,netfilter是內核的模塊實現,iptables是對上層操做工具。
若是不嚴格的區分則在Linux中 netfilter 和 iptables 均可以認爲是指Linux防火牆。
實際 Iptables 是一個管理內核包過濾的工具,能夠用來配置核心包過濾表格中的規則。運行於用戶空間。
區別在於:netfilter 是 Linux的2.4版內核引入了一種全新的包過濾引擎,稱爲Netfilter。指的是Linux內核中實現包過濾防火牆的內部結構,不以程序或文件的形式存在,屬於「內核態」的防火牆功能體系。iptables指的是用來管理Linux防火牆的命令程序,一般位於/sbin/iptables,屬於「用戶態」的防火牆管理體系。iptables是控制Netfilter的工具,是Linux 2.2版內核中比較老的命令ipchains的兄弟。
Netfilter 所設置的規則是存放在內核內存中的,而 iptables 是一個應用層的應用程序,它經過 Netfilter 放出的接口來對存放在內核內存中的 XXtables(Netfilter的配置表)進行修改。這個XXtables由表tables、鏈chains、規則rules組成,iptables在應用層負責修改這個規則文件。相似的應用程序還有 firewalld 。
Centos7中默認將原來的防火牆iptables升級爲了firewalld,firewalld跟iptables比起來至少有兩大好處:
一、firewalld能夠動態修改單條規則,而不須要像iptables那樣,在修改了規則後必須得所有刷新才能夠生效;
二、firewalld在使用上要比iptables人性化不少,即便不明白「五張表五條鏈」並且對TCP/IP協議也不理解也能夠實現大部分功能。
iptables將寫好的規則保存在netfilter的某些表的某些鏈中,進而才起到防火牆的功能。
Netfilter是Linux核心中的一個通用架構,工做於內核空間。
Netfilter是Linux操做系統核心層內部的一個數據包處理模塊,它具備以下功能:
iptables 和 netfilter 的聯繫?
不少人一提到防火牆立馬就想到了是iptables,其實iptables並非防火牆,他只是一個軟件或者說是一個工具,這個軟件能夠編寫某些規則,將寫好的規則保存到netfilter的規則數據庫中。所以,真正起到"防火"的功能是netfilter,並非iptables。netfilter是內核中的一個框架,這個框架裏面包含了4個表和5個鏈,這些鏈又包含了不少的規則。而數據包要比對的規則就是這個鏈中所定義的規則。
在下述的內容中咱們就以iptables來稱呼Linux防火牆了。
chain的本質是Netfilter定義的不一樣過濾點。總共定義了5個過濾點。INPUT,FORWARDING,OUTPUT,PREROUTING,POSTROUTIONG。
Table的本質是Netfilter定義的不一樣功能的劃分。
filter用於執行基本過濾。
nat是對數據IP進行修改。
mangle是對數據包進行高級修改。
不一樣的Table只能用於特定的Chain。
Netfilter提供了一系列的表(tables),每一個表由若干個鏈(chains)組成,每條鏈能夠由一條或若干條規則(rules)組成,其規則由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。即 iptables把有次序的規則"鏈(chains)"應用到網絡包上。鏈的集合就構成了"表(tables)",用於處理特殊類型的流量。Netfilter支持一下方式對數據包進行分類:源IP地址、目標IP地址、使用接口、使用協議、端口號、鏈接狀態。
規則(rules)是管理員預約義的條件,規則通常的定義爲「若是數據包頭符合這樣的條件,就這樣處理這個數據包」。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工做就是添加、修改和刪除這些規則。
鏈(chains)是數據包傳播的路徑,每一條鏈其實就是衆多規則中的一個檢查清單,每一條鏈中能夠有一條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否知足規則所定義的條件。若是知足,系統就會根據該條規則所定義的方法處理該數據包;不然iptables將繼續檢查下一條規則,若是該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。
每一個鏈上都有默認的規則。
表(tables)提供特定的功能,iptables有4個表,即raw表、filter表、nat表和mangle表,分別用於實現包過濾,網絡地址轉換和包重構的功能。表中的規則寫在鏈上
iptables的表和鏈的結構
iptables的做用在於爲包過濾機制的實現提供規則,經過各類不一樣的規則,告訴netfilter對來自某些源,前往某些目的的或具備某些協議特徵的數據包應該如何處理。爲了更加方便地組織和管理防火牆規則,iptables採用了「 表」和「鏈」的分層結構。iptables的規則表和規則鏈的示意圖以下:
在iptables規則表中,filter表和nat表用的比較多,而其餘兩個表用的相對來講比較少。因此後面咱們大可能是以filter表和nat表中的規則鏈作策略。
在這些表當中,raw表的優先級最高,其次是mangle表,接着是nat表,最後纔是filter表
所以,他們的優先級順序應該是這樣的:raw---->mangle--->nat--->filter 。 即 raw > mangle > nat > filter
所以,當一個數據包進入到防火牆時,它會依次根據這些表中的相關鏈中的規則對數據包進行匹配,容許則經過,拒絕則丟棄。
出防火牆時,也是根據這個順序進行規則匹配的,容許則經過,拒絕則丟棄。
一、規則表
規則表中包含各類規則鏈,iptables管理着四個不一樣的規則表,其功能分別由獨立的內核模塊實現。各表解釋以下:
filter表:主要用來對數據包進行過濾,根據具體的規則要求決定如何處理一個數據包。包含INPUT、FORWAED、OUTPUT等三個規則鏈。 nat表:主要用修改數據包IP地址、端口號等信息,也稱網絡地址轉換。包含PREROUTING、POSTROUTING、OUTPUT等三個規則鏈。 mangle表:主要用來修改數據包的TOS,TTL值,或者爲數據包設置Mark標記,以實現流量整形,策略路由等高級應用。包含PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD等五個規則鏈。 raw表:主要用來決定是否對數據包進行狀態跟蹤。包含OUTPUT、PREROUTING兩個規則鏈。
filter表
主要用於對數據包進行過濾,根據具體的規則決定是否放行該數據包(如DROP、ACCEPT、REJECT、LOG)。filter 表對應的內核模塊爲iptable_filter,包含三個規則鏈:
INPUT
鏈:INPUT針對那些目的地是本地的包FORWARD
鏈:FORWARD過濾全部不是本地產生的而且目的地不是本地(即本機只是負責轉發)的包OUTPUT
鏈:OUTPUT是用來過濾全部本地生成的包nat表
主要用於修改數據包的IP地址、端口號等信息(網絡地址轉換,如SNAT、DNAT、MASQUERADE、REDIRECT)。屬於一個流的包(由於包 的大小限制致使數據可能會被分紅多個數據包)只會通過這個表一次。若是第一個包被容許作NAT或Masqueraded,那麼餘下的包都會自動地被作相同的操做,也就是說,餘下的包不會再經過這個表。表對應的內核模塊爲 iptable_nat,包含三個鏈:
PREROUTING
鏈:做用是在包剛剛到達防火牆時改變它的目的地址OUTPUT
鏈:改變本地產生的包的目的地址POSTROUTING
鏈:在包就要離開防火牆以前改變其源地址mangle表
主要用於修改數據包的TOS(Type Of Service,服務類型)、TTL(Time To Live,生存週期)指以及爲數據包設置Mark標記,以實現Qos(Quality Of Service,服務質量)調整以及策略路由等應用,因爲須要相應的路由設備支持,所以應用並不普遍。包含五個規則鏈——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。
raw表
是自1.2.9之後版本的iptables新增的表,主要用於決定數據包是否被狀態跟蹤機制處理。在匹配數據包時,raw表的規則要優先於其餘表。包含兩條規則鏈——OUTPUT、PREROUTING
iptables中數據包和4種被跟蹤鏈接的4種不一樣狀態:
NEW
:該包想要開始一個鏈接(從新鏈接或將鏈接重定向)RELATED
:該包是屬於某個已經創建的鏈接所創建的新鏈接。例如:FTP的數據傳輸鏈接就是控制鏈接所 RELATED出來的鏈接。--icmp-type 0
( ping 應答) 就是--icmp-type 8
(ping 請求)所RELATED出來的。ESTABLISHED
:只要發送並接到應答,一個數據鏈接從NEW變爲ESTABLISHED,並且該狀態會繼續匹配這個鏈接的後續數據包。INVALID
:數據包不能被識別屬於哪一個鏈接或沒有任何狀態好比內存溢出,收到不知屬於哪一個鏈接的ICMP錯誤信息,通常應該DROP這個狀態的任何數據。二、規則鏈
規則鏈的做用是容納各類防火牆規則,規則兩分爲五種,分別在不一樣的時機處理數據包。
INPUT鏈:處理入站數據包。
OUTOPUT鏈:處理出站數據包。
FORWARD鏈:處理轉發數據包。 POSTROUTING鏈:在進行路由選擇後處理數據包。 PREROUTING鏈:在進行路由選擇前處理數據包。 其中INPUT和OUTPUT鏈主要用在「主機型防火牆」中,而FORWARD、POSTROUTING和PREROUTING鏈主要用在「網關防火牆」中。
Linux防火牆的原理主要是對數據包的控制,看下圖(如下圖片均來自互聯網):netfilter五條鏈相互關係,即iptables數據包轉發流程圖。
詳細的數據包流程
(圖片引用 https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg)
(1)數據包進入網卡時,先進入PREROUTING(路由前)鏈,以後作路由判斷數據包應發往何處,本機或其餘機器。
(2)若數據包原目標地址是本機的,數據包會前往INPUT鏈。到達INPUT鏈後,任何進程都會收到它。
(3)本機程序發送出數據包,數據包會通過OUTPUT鏈,而後到達POSTROUTING鏈輸出。
(4)若數據包原目標地址非本機,則須要轉發出去的,且內核容許轉發,數據包前往 FORWARD鏈,而後到達POSTROUTING(路由後)鏈輸出。
Netfilter在五個鏈上,使用HOOK技術作規則檢查。
注意:熟知數據包過濾的匹配流程是學習iptables的重點,只有知道數據包通過防火牆的過程,咱們才知道在那個表的那個鏈裏面設置規則能夠對數據包進行如何操做。
當數據包抵達防火牆時,將依次應用raw,mangle,net和filter表中對應鏈內的規則(若是有的話)。
入站數據流向:來自外界的數據包到達防火牆後,首先被PREROUTING鏈處理,而後進行路由選擇,若是數據的目標地址時防火牆本機,那麼內核將其傳遞給INPUT鏈進行處理,經過處理後再交給上層應用程序。
轉發數據流向:來自外界的數據包到達防火牆,首先被PREROUTING鏈處理,而後再進行路由選擇,若是數據包的目標地址是其餘外部地址,則內核將其傳遞給FORWARD鏈處理,最後交給POSTROUTING鏈進行處理。
出站數據流向:防火牆向外部地址發送數據包,首相被OUTPUT鏈進行處理,而後進進行路由選擇,再交給POSTROUTING鏈進行處理。
當數據包通過規則鏈時,依次按照第一條規則,第二條規則......的順序進行匹配和處理,鏈內的過濾遵循「匹配即中止」的原則,一旦找到一條匹配的規則,則不在檢查本鏈中後續的規則。
規則執行流程梳理:
iptables執行規則時,是從規則表中從上至下順序執行的。
若沒遇到匹配的規則,就一條一條往下匹配;
若徹底沒有匹配的規則,則執行該鏈上的默認規則;
若遇到匹配的規則,則執行規則,執行後根據本規則的動做(accept,reject,log,drop等),決定下一步執行的狀況,後續執行通常有三種狀況:
透過這種機制能夠進行復雜、多重的封包過濾,簡單的說,iptables能夠進行縱橫交錯式的過濾(tables)而非鏈狀過濾(chains)。
http://blog.csdn.net/silent123go/article/details/52588518
已經知道了Netfilter和Iptables的架構和做用,而且學習了控制Netfilter行爲的Xtables表的結構,那麼這個Xtables表是怎麼在內核協議棧的數據包路由中起做用的呢?
網口數據包由底層的網卡NIC接收,經過數據鏈路層的解包以後(去除數據鏈路幀頭),就進入了TCP/IP協議棧(本質就是一個處理網絡數據包的內核驅動)和Netfilter混合的數據包處理流程中了。數據包的接收、處理、轉發流程構成一個有限狀態向量機,通過一些列的內核處理函數、以及Netfilter Hook點,最後被轉發、或者本次上層的應用程序消化掉。是時候看這張圖了:
從上圖中,咱們能夠總結出如下規律:
咱們在寫Iptables規則的時候,要時刻牢記這張路由次序圖,根據所在Hook點的不一樣,靈活配置規則。
命令格式:
基本語法、控制類型
使用iptables命令管理,編寫防火牆規則時,基本的命令的格式以下所示:
iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制類型]
-t:用來指定表名,默認是filter表。
表名,鏈名:用來指定iptables命令所操做的表和鏈。
管理選項:表示iptables規則的作方式,如:插入,增長,刪除,查看等。
匹配條件:用來指定要處理的處理數據包的特徵,不符合指定條件的將不會處理。
控制類型:指的是數據包的處理方式,如:容許,拒絕,丟棄等。
. [-t table] 指定規則表;
內建的規則表有三個,分別是:nat、mangle 和filter,
當未指定規則表時,則一概視爲是filter。
三個規則表的功能以下:
nat:此規則表擁有PREROUTING 和POSTROUTING 兩個規則鏈,
主要功能爲進行一對1、一對多、多對多等網址轉換工做(SNAT、DNAT),
這個規則表除了做網址轉換外,請不要作其它用途。
mangle:此規則表擁有PREROUTING、FORWARD 和POSTROUTING 三個規則鏈。
除了進行網址轉換工做會改寫封包外,在某些特殊應用可能也必須去改寫封包(TTL、TOS)
或者是設定MARK(將封包做記號,以進行後續的過濾),這時就必須將這些工做定義在mangle 規則表中;
因爲使用率不高,咱們不打算在這裏討論mangle 的用法。
filter: 這個規則表是默認規則表,擁有INPUT、FORWARD 和OUTPUT 三個規則鏈,
這個規則表顧名思義是用來進行封包過濾的處理動做(例如:DROP、LOG、ACCEPT 或REJECT),
咱們會將基本規則都創建在此規則表中。
命令: -A, --append 範例: iptables -A INPUT ... 說明: 新增規則到某個規則鏈中,該規則將會成爲規則鏈中的最後一條規則。 命令: -D, --delete 範例: iptables -D INPUT --dport 80 -j DROP iptables -D INPUT 1 說明: 從某個規則鏈中刪除一條規則,能夠輸入完整規則,或直接指定規則編號加以刪除。 命令: -R, --replace 範例: iptables -R INPUT 1 -s 192.168.0.1 -j DROP 說明: 取代現行規則,規則被取代後並不會改變順序。 命令: -I, --insert 範例: iptables -I INPUT 1 --dport 80 -j ACCEPT 說明: 插入一條規則,本來該位置上的規則將會日後移動一個順位。 命令: -L, --list 範例1: iptables -L INPUT 說明: 列出某規則鏈中的全部規則。 範例2: iptables -t nat -L 說明: 列出nat 表全部鏈中的全部規則。 命令: -F, --flush 範例: iptables -F INPUT 說明: 刪除filter 表中INPUT 鏈的全部規則。 命令: -Z, --zero 範例: iptables -Z INPUT 說明: 將封包計數器歸零。封包計數器是用來計算同一封包出現次數,是過濾阻斷式攻擊不可或缺的工具。 命令: -N, --new-chain 範例: iptables -N allowed 說明: 定義新的規則鏈。 命令: -X, --delete-chain 範例: iptables -X allowed 說明: 刪除某個規則鏈。 命令: -P, --policy 範例: iptables -P INPUT DROP 說明: 定義過濾政策。也就是未符合過濾條件之封包, 默認的處理方式。 命令: -E, --rename-chain 範例: iptables -E allowed disallowed 說明: 修改某自定義規則鏈的名稱。 3. [match] 經常使用封包匹配參數 參數: -p, --protocol 範例: iptables -A INPUT -p tcp 說明: 匹配通信協議類型是否相符,可使用! 運算符進行反向匹配,例如: -p !tcp 意思是指除tcp 之外的其它類型,如udp、icmp ...等。 若是要匹配全部類型,則可使用all 關鍵詞,例如: -p all 參數: -s, --src, --source 範例: iptables -A INPUT -s 192.168.1.1 說明: 用來匹配封包的來源IP,能夠匹配單機或網絡,匹配網絡時請用數字來表示子網掩碼, 例如: -s 192.168.0.0/24 匹配IP 時可使用! 運算符進行反向匹配,例如: -s! 192.168.0.0/24。 參數: -d, --dst, --destination 範例: iptables -A INPUT -d 192.168.1.1 說明: 用來匹配封包的目的地IP,設定方式同上。 參數: -i, --in-interface 範例: iptables -A INPUT -i eth0 說明: 用來匹配封包是從哪塊網卡進入,可使用通配字符+ 來作大範圍匹配,例如: -i eth+ 表示全部的ethernet 網卡 也可使用! 運算符進行反向匹配,例如: -i !eth0 參數: -o, --out-interface 範例: iptables -A FORWARD -o eth0 說明: 用來匹配封包要從哪塊網卡送出,設定方式同上。 參數: --sport, --source-port 範例: iptables -A INPUT -p tcp --sport 22 說明: 用來匹配封包的源端口,能夠匹配單一端口,或是一個範圍,例如: --sport 22:80 表示從22 到80 端口之間都算是符合條件,若是要匹配不連續的多個端口,則必須使用 --multiport 參數,詳見後文。匹配端口號時,可使用! 運算符進行反向匹配。 參數: --dport, --destination-port 範例: iptables -A INPUT -p tcp --dport 22 說明: 用來匹配封包的目的地端口號,設定方式同上 參數: --tcp-flags 範例: iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 說明: 匹配TCP 封包的狀態標誌; 參數分爲兩個部分, 第一個部分列舉出想匹配的標誌, 第二部分則列舉前述標誌中哪些有被設置,未被列舉的標誌必須是空的。 TCP 狀態標誌包括: SYN(同步)、ACK(應答)、FIN(結束)、RST(重設)、URG(緊急) 、PSH(強迫推送) 等都可使用於參數中, 除此以外還可使用關鍵詞ALL 和NONE 進行匹配。 匹配標誌時,可使用! 運算符行反向匹配。 參數: --syn 範例: iptables -p tcp --syn 說明: 用來表示TCP 通訊協議中,SYN 位被打開,而ACK 與FIN 位關閉的分組,即TCP 的初始鏈接, 與iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的做用徹底相同, 若是使用!運算符,可用來匹配非要求鏈接封包。 參數: -m multiport --source-port 範例: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 說明: 用來匹配不連續的多個源端口,一次最多能夠匹配15 個端口, 可使用! 運算符進行反向匹配。 參數: -m multiport --destination-port 範例: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110 說明: 用來匹配不連續的多個目的地端口號,設定方式同上 參數: -m multiport --port 範例: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 說明: 這個參數比較特殊,用來匹配源端口和目的端口號相同的封包,設定方式同上。 注意:在本範例中,若是來源端口號爲80目的地端口號爲110,這種封包並不算符合條件。 參數: --icmp-type 範例: iptables -A INPUT -p icmp --icmp-type 8 說明: 用來匹配ICMP 的類型編號,可使用代碼或數字編號來進行匹配。 請打iptables -p icmp--help 來查看有哪些代碼可用。 參數: -m limit --limit 範例: iptables -A INPUT -m limit --limit 3/hour 說明: 用來匹配某段時間內封包的平均流量, 上面的例子是用來匹配:每小時平均流量是否超過一次3 個封包。 除了每小時平均次外,也能夠每秒鐘、每分鐘或天天平均一次,默認值爲每小時平均一次,參數如後: /second、/minute、/day 除了進行封包數量的匹配外,設定這個參數也會在條件達成時,暫停封包的匹配動做, 以免因駭客使用洪水攻擊法,致使服務被阻斷。 參數: --limit-burst 範例: iptables -A INPUT -m limit --limit-burst 5 說明: 用來匹配瞬間大量封包的數量, 上面的例子是用來匹配一次同時涌入的封包是否超過5個(這是默認值),超過此上限的封包將被直接丟棄。 使用效果同上。 參數: -m mac --mac-source 範例: iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 說明: 用來匹配封包來源網絡接口的硬件地址, 這個參數不能用在OUTPUT 和POSTROUTING 規則鏈上, 這是由於封包要送到網卡後,才能由網卡驅動程序透過ARP 通信協議查出目的地的MAC 地址, 因此iptables 在進行封包匹配時,並不知道封包會送到哪一個網絡接口去。 參數: --mark 範例: iptables -t mangle -A INPUT -m mark --mark 1 說明: 用來匹配封包是否被表示某個號碼, 當封包被匹配成功時,咱們能夠透過MARK 處理動做,將該封包標示一個號碼,號碼最大不能夠超過4294967296。 參數: -m owner --uid-owner 範例: iptables -A OUTPUT -m owner --uid-owner 500 說明: 用來匹配來自本機的封包,是否爲某特定使用者所產生的, 這樣能夠避免服務器使用root或其它身分將敏感數據傳送出,能夠下降系統被駭的損失。 惋惜這個功能沒法匹配出來自其它主機的封包。 參數: -m owner --gid-owner 範例: iptables -A OUTPUT -m owner --gid-owner 0 說明: 用來匹配來自本機的封包,是否爲某特定使用者羣組所產生的,使用時機同上。 參數: -m owner --pid-owner 範例: iptables -A OUTPUT -m owner --pid-owner 78 說明: 用來匹配來自本機的封包,是否爲某特定進程所產生的,使用時機同上。 參數: -m owner --sid-owner 範例: iptables -A OUTPUT -m owner --sid-owner 100 說明: 用來匹配來自本機的封包,是否爲某特定鏈接(Session ID)的響應封包,使用時機同上。 參數: -m state --state 範例: iptables -A INPUT -m state --state RELATED,ESTABLISHED 說明: 用來匹配鏈接狀態, 鏈接狀態共有四種: INVALID、ESTABLISHED、NEW 和RELATED。 INVALID 表示該封包的鏈接編號(Session ID)沒法辨識或編號不正確。 ESTABLISHED 表示該封包屬於某個已經創建的鏈接。 NEW 表示該封包想要起始一個鏈接(重設鏈接或將鏈接重導向)。 RELATED 表示該封包是屬於某個已經創建的鏈接,所創建的新鏈接。 例如:FTP-DATA 鏈接一定是源自某個FTP 鏈接。 4. [-j target/jump] 經常使用的處理動做 -j 參數用來指定要進行的處理動做,經常使用的處理動做包括: ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK, 分別說明以下: 動做: ACCEPT 說明: 將封包放行, 進行完此處理動做後,將再也不匹配其它規則,直接跳往下一個規則鏈(natostrouting)。 動做: REJECT 說明: 攔阻該封包,並傳送封包通知對方, 能夠傳送的封包有幾個選擇: ICMP port-unreachable、 ICMP echo-reply 或是 tcp-reset(這個封包會要求對方關閉鏈接), 進行完此處理動做後,將再也不匹配其它規則,直接中斷過濾程序。 範例: iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset 動做: DROP 說明: 丟棄封包不予處理,進行完此處理動做後,將再也不匹配其它規則,直接中斷過濾程序。 動做: REDIRECT 說明: 將封包從新導向到另外一個端口(PNAT),進行完此處理動做後,將會繼續匹配其它規則。 這個功能能夠用來實現透明代理或用來保護web 服務器。 範例: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 動做: MASQUERADE 說明: 改寫封包來源IP 爲防火牆NIC IP,能夠指定port 對應的範圍, 進行完此處理動做後,直接跳往下一個規則鏈(manglepostrouting)。 這個功能與SNAT 略有不一樣,當進行IP 假裝時,不需指定要假裝成哪一個IP,IP 會從網卡直接讀取, 當使用撥號接連時,IP一般是由ISP 公司的DHCP 服務器指派的,這個時候MASQUERADE 特別有用。 範例: iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000 動做: LOG 說明: 將封包相關訊息紀錄在/var/log 中,詳細位置請查閱/etc/syslog.conf 配置文件, 進行完此處理動做後,將會繼續匹配其規則。 範例: iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets" 動做: SNAT 說明: 改寫封包來源IP 爲某特定IP 或IP 範圍,能夠指定port 對應的範圍, 進行完此處理動做後,將直接跳往下一個規則(mangleostrouting)。 範例: iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source?194.236.50.155-194.236.50.160:1024-32000 動做: DNAT 說明: 改寫封包目的地IP 爲某特定IP 或IP 範圍,能夠指定port 對應的範圍, 進行完此處理動做後,將會直接跳往下一個規則鏈(filter:input 或filter:forward)。 範例: iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100 動做: MIRROR 說明: 鏡射封包,也就是未來源IP 與目的地IP 對調後,將封包送回, 進行完此處理動做後,將會中斷過濾程序。 動做: QUEUE 說明: 中斷過濾程序,將封包放入隊列,交給其它程序處理。 經過自行開發的處理程序,能夠進行其它應用,例如:計算鏈接費用等。 動做: RETURN 說明: 結束在目前規則鏈中的過濾程序,返回主規則鏈繼續過濾, 若是把自定義規則鏈當作是一個子程序,那麼這個動做,就至關於提早結束子程序並返回到主程序中。 動做: MARK 說明: 將封包標上某個代號,以便提供做爲後續過濾的條件判斷依據, 進行完此處理動做後,將會繼續匹配其它規則。 範例: iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
ACCEPT:容許數據包經過。
DROP:直接丟棄數據包,不給出任何迴應信息。
REJECT:DROP和REJECT都會把它們的包丟棄。DROP是默默地丟棄,而REJECT若是必要時會返回一則ICMP錯誤消息。
LOG:在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則。
REDIRECT:把包分流到一個代理,而不是直接讓它們經過。您可能會用這個功能來迫使站點上的全部Web流量都經過一個Web高速緩存,好比Squid。
RETURN:終結用戶定義的鏈,相似於子例程調用中的return語句。
MIRROR:目標在發送包以前交換IP源和目的地址。
QUEUE:經過一個內核模塊把包交給本地用戶程序。
Linux防火牆一般是由rc啓動腳本中的一系列iptables命令來實現的。
各個iptables命令一般採起下列形式之一:
iptables -F chain-name
iptables -P chain-name target
iptables -A chain-name -i interface -j target
. 第一種形式(-F)把以前全部的規則都從鏈中清除掉。
. 第二種形式(-P)給鏈設置一條默認策略(也就是target)。咱們建議您使用DROP做爲鏈默認的目標(target)。
. 第三種形式(-A)把當前的說明追加到鏈上。
除非使用-t參數指定了表(table)名,不然命令被默認應用到filter表上。
-i參數將規則應用到有名字的接口上,-j則標識出目標(target)。
通用匹配也稱常規匹配,這種匹配方式能夠獨立使用,不依賴其餘條件或擴展模塊,常見的通用匹配包括協議匹配,地址匹配,網絡接口匹配。
1)協議pipe
編寫iptables規則時使用「-p 協議名」的形式指定,用來檢查數據包所使用的網絡協議,如:tcp、udp、icmp等。
列如:編寫iptables拒絕經過icmp的數據包。
[root@localhost /]#iptables -A INPUT -p icmp -j DROP
2)地址匹配
編寫iptables規則時使用「-s源地址」或「-d目標地址」的形式指定,用來檢查數據包的源地址或目標地址。
列如:編寫iptables拒絕轉發192.168.1.0/24到202.106.123.0/24的數據包。
[root@localhost /]#iptables -A FORWARD -s 192.168.1.0/24 -d 202.106.123.0/24 -j DROP
3)網絡接口匹配
編寫iptables規則時使用「-i 接口名」和「-o 接口名」的形式,用於檢查數據包從防火牆的哪個接口進入或發出,分別對應入站網卡(--in-interface),出站網卡(--out-interface)。
列如:拒絕從防火牆的eth1網卡接口ping防火牆主機。
[root@localhost /]#iptables -A INPUT -i eth1 -p icmp -j DROP
這種匹配方式要求以指定的協議匹配做爲前提條件,至關於子條件,所以沒法獨立使用,其對應的功能由iptables在須要時自動隱含載入內核。常見的隱含匹配包括端口匹配,TCP標記匹配,ICMP類型匹配。
1)端口匹配
編寫iptable規則時使用「--sport 源端口」或「--dport」的形式,針對的協議爲TCP或UDP,用來檢查數據包的源端口或目標端口。單個端口或者以「:」分隔的端口範圍都是能夠接受的,但不支持多個不連續的端口號。
列如:編寫iptables規則容許FTP數據包經過,則須要容許20,21和用於被動模式的24500-24600的端口範圍。
[root@localhost /]#iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
[root@localhost /]#iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
2)TCP標記匹配
編寫iptables規則時使用「--tcp-flags 檢查範圍 被設置的標記」的形式,針對的協議爲TCP,用來檢查數據包的標記位。其中「檢查範圍」指出須要檢查數據包的那幾個標記位,「被設置的標記」則明確匹配對應值爲1的標記,多個標記之間以逗號進行分隔。
列如:若要拒絕外網卡接口(eth1)直接訪問防火牆本機的TCP請求,但其餘主機發給防火牆的TCP響應等數據包應容許,可執行以下操做。
[root@localhost /]#iptables -A INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
3)ICMP類型匹配
編寫iptables規則時使用「--icmp-type ICMP類型」的形式,針對的協議爲ICMP,用來檢查ICMP數據包的類型。ICMP類型使用字符串或數字代碼表示,如「Echo-quest」(代碼爲8),「Echo-Reply」(代碼爲0),「Destination-Unreachable」(代碼爲3),分別對應ICMP協議的請求,回顯,目標不可達。
列如:若要禁止從其餘主機ping防火牆本機,但容許防火牆本機ping其餘主機,可執行如下操做。
[root@localhost /]#iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost /]#iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@localhost /]#iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
這種匹配方式要求有額外的內核模塊提供支持,必須手動以「-m 模塊名稱」的形式調用相應的模塊。而後方可設置匹配條件。常見的顯示匹配包括多端口匹配,IP範圍匹配,MAC地址匹配,狀態匹配。
1)多端口匹配
編寫iptables規則時使用「-m multiport --dport 端口列表」或「-m multiport --sport 端口列表」的形式,用來檢查數據包的源端口,目標端口,多端口之間以逗號進行分隔。
列如:若容許本機開放25,80,110,143等端口,以便提供電子郵件服務,可執行以下操做。
[root@localhost /]#iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
2)IP地址範圍匹配
編寫iptables規則時使用「-m iprange --src-range IP範圍」,「-m -iprange --dst-range IP地址範圍」的形式,用來檢查數據包的源地址,目標地址,其中IP範圍採用「起始地址-結束地址」的形式表示。
列如:若要容許轉發源地址IP位於192.168.4.21與192.168.4.28之間的TCP數據包,可執行以下操做。
[root@localhost /]#iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
3)MAC地址匹配
編寫iptables規則時使用「-m mac --mac-source MAC地址」的形式,用來檢查數據包的源MAC地址。因爲MAC地址自己的侷限性,此類匹配條件通常只適用於內部網絡。
列如:若要根據MAC地址封鎖主機,禁止其訪問本機的任何應用,能夠執行以下操做。
[root@localhost /]#iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
編寫iptables規則時使用「-m state --state 鏈接狀態」的形式,基於iptables的狀態跟蹤機制用來檢查數據包的鏈接狀態。常見的鏈接狀態包括NEW(如任何鏈接無關的),ESTABLISHED(相應請求或者一創建鏈接的),RELATED(與已有鏈接有相關性的,如FTP數據鏈接)。
列如:編寫iptables規則,只開放本機的80端口服務,對於發送給本機的TCP應答數據包給予放行,其餘入站數據包均拒絕,可執行以下操做。
[root@localhost /]#iptables -A INPUT -p tcp -m multiport --dport 80 -j ACCEPT
[root@localhost /]#iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
經過上面知道了 Linux防火牆的表、鏈機構,並學會了編寫簡單的防火牆規則。Linux防火牆在不少時候承擔着鏈接企業內、外網的重任,除了提供數據包過濾功能之外,有時還須要提供一些基本的網關應用。在配置SNAT和DNAT以前,須要開啓Linux系統中的地址轉發功能,不然數據沒法經過防火牆轉發出去。
修改/etc/sysctl.conf配置文件件,將ip_forward的值設置爲1便可。 [root@localhost /]#vim /etc/sysctl.conf ......//省略部份內容 net.ipv4.ip_forwaed=1 //將此行中的0改成1 [root@localhost /]#sysctl -p //從新讀取修改後的配置 也能夠開啓臨時的路由轉發,能夠執行如下操做。 [root@localhost /]#echo 1> /proc/sys/net/ipv4/ip_forward 或者 [root@localhost /]#sysctl -w net.ipv4.ip_forward=1
SNAT:源地址轉換,是Linux防火牆的一種地址轉換操做,也是iptables命令中的一種數據包控制類型,其做用是根據指定條件修改數據包的源IP地址。
SNAT策略只能用在nat表的POSTROUTING鏈中,使用iptables命令編寫SNAT策略時,須要結合「--to-source IP地址」選項來指定修改後的源IP地址。
列如:Linux網關服務器經過eth0和eth1分別鏈接Internet和局域網,其中eth0的IP地址爲218.29.30.31,eth1的IP地址爲192.168.1.1。如今要求在Linux網關服務器上配置規則,使用局域網內的全部用戶能夠經過共享的方式訪問互聯網。可執行如下操做。
1)開啓路由轉發,上面已經講過,這裏不在詳述了。
2)在iptables的POSTROUTING中編寫SNAT規則。
[root@localhost /]#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
3)在某些狀況下,網關的外網IP地址可能不是固定的,列如使用ADSL寬帶接入時,針對這這種需求,iptables提供了一個名爲MASQUERASE(假裝)的數據包控制類型,MASQUERADE至關於SNAT的一個特列,一樣同來修改數據包的源IP地址只過過它能過自動獲取外網接口的IP地址。
參照上一個SNAT案例,若要使用MASQUERADE假裝策略,只須要去掉SNAT策略中的「--to-source IP地址」。然而改成「-j MASQUERADE」指定數據包的控制類型。對於ADSL寬帶鏈接來講,鏈接名稱一般爲ppp0,ppp1等。操做以下
[root@localhost /]#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
4)測試SNAT共享接入的結果
同過上面的配置,這時內部局域網訪問互聯網所使用的IP地址是網關服務器的外網接口地址了。咱們能夠在往外客戶端執行「tcpdump -i eth0」監聽訪問本機的數據流,而後在內網ping外網客戶端,而後查看外網客戶端監聽的狀態,會發現,訪問外網客戶機的IP地址是網關服務器的外網接口地址,而不是內部局域網的地址。
DNAT:目標地址轉換,是Linux防火牆的另外一種地址轉換操做,一樣也是iptables命令中的一種數據包控制類型,其做用是根據指定條件修改數據包的目標IP地址,目標端口。
DNAT策略與SNAT策略很是類似,只不過應用方向反過來了。
SNAT用來修改源地址IP,而DNAT用來修改目標IP地址,目標端口;
SNAT只能用在nat表的POSTROUTING鏈,而DNAT只能用在nat表的PREROUTING鏈和OUTPUT鏈中。
列如:藉助上述網絡環境,公司內部局域網內搭建了一臺web服務器,IP地址爲192.168.1.7,如今須要將其發佈到互聯網上,但願經過互聯網訪問web服務器。那麼咱們能夠執行以下操做。
1)在iptables的PREROUTING中編寫DNAT規則。
[root@localhost /]#iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.7:80
2)再列如:公司的web服務器192.168.1.7須要經過互聯網遠程管理,因爲考慮到安全問題,管理員不但願使用默認端口進行訪問,這時咱們可使用DNAT修改服務的默認端口。操做以下:
[root@localhost /]#iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.1.7:22
3)在外網客戶端瀏覽器中訪問網關服務器的外網接口,能夠發現訪問的竟然是內網192.168.1.7的web服務器的網頁。而在使用sshd鏈接2346端口時,竟然能夠遠程鏈接到192.168.1.7服務器上。
前面學習瞭如何編寫一些簡單的防火牆規則了,可是這些規則只是臨時生效的,當防火牆關閉或者服務器關機,重啓以後全部的規則將會清空。所以我須要將編寫好的防火牆規則保存下來,以便在防火牆關閉或從新啓動系統後,防火牆規則還可使用,而不須要再次編寫。
iptables規則的導出、導人
防火牆規則的批量備份,還原須要用到兩個命令iptables-save、iptables-restore,分別用來保存和恢復。
一、備份保存iptables規則
iptables-save命令用來批量導出iptables防火牆規則,直接執行iptables-save時,將顯示出當前啓用的全部規則,按照raw、mangle、nat、filter表的順序依次列出;若只但願顯示出某一個表,應添加「-t表名」做爲命令選項,而後結合重定向輸入「>」將輸出內容重定向到某個文件中。
列如:備份全部表的規則,操做以下:
[root@localhost /]#iptables-save > /opt/iprules_all.txt
或者
[root@localhost /]#service iptables save
後者默認將全部規則保存到「/etc/sysconfig/iptables」文件中。
二、恢復iptables規則
iptables-retore命令用來批量導入Linux防火牆規則,若是已經有使用iptable-save命令導出的備份文件,則恢復規則的過程也就是一瞬間的事。與iptables-save命令相對的,iptables-restore命令應結合重定向輸入來指定備份文件的位置。
列如:將上所備份的規則恢復到iptables中,操做以下:
[root@localhost /]#iptables-restore < /opt/iprules_all.txt
或者
[root@localhost /]#service iptables start
後者默認將「/etc/sysconfig/iptables」文件中的內容加載到iptables中,也就是說,若是備份使用的是「service iptables save」那麼恢復的時候就應該使用「service iptables start」。
使用iptables服務
開啓或關閉iptables服務使用如下命令
[root@localhost /]#service iptables start //開啓iptables服務
[root@localhost /]#service iptables stop //關閉iptables服務
前者開啓iptables服務,默認加載「/etc/sysconfig/iptables」中的規則,後者關閉iptables服務,默認將會清空全部的iptables規則。
編寫防火牆腳本
在生產環境中,我不多會一條一條的去編寫iptables規則,最廣泛的作法就是,將其寫到shell腳本,進行一次性處理。常見的防火牆腳本中,一般包括變量定義、模塊加載、/proc調整、規則設置等多個部分,某些簡單的防火牆腳本可能只包括規則設置部分。下面咱們經過一個「網絡型」防火牆腳本實例來了解如何編寫防火牆腳本。
[root@loaclhost /]#vim /opt/myipfw.sh
#!/bin/bash # 1.定義基本變量 INET_IF="eth0" //外網接口 INET_IP="218.29.30.31" //外網接口地址 LAN_IF="eth1" //內網接口 LAN_IP="192.168.1.1" //內網接口地址 LAN_NET="192.168.1.0/24" //內網網段 LAN_WWW_IP="192.168.1.7" //網站服務器的內部地址 IPT="/sbin/iptables" //iptables命令的路徑 MOD="/sbin/modprobe" //modprode命令的路徑 CTL="/sbin/sysctl" //sysctl命令的路徑 # 2.加載內核模塊 $MOD ip_tables //iptables基本模塊 $MOD ip_conntrack //鏈接跟蹤模塊 $MOD ipt_REJECT //拒絕操做模塊 $MOD ipt_LOG //日誌記錄模塊 $MOD ipt_iprange //支持IP範圍匹配 $MOD xt_tcpudp //支持tcp、udp協議 $MOD xt_state //支持狀態匹配 $MOD xt_multiport //支持多端口匹配 $MOD xt_mac //支持MAC地址匹配 $MOD ip_nat_ftp //支持TFP地址轉換 $MOD ip_conntrack_ftp //支持TFP鏈接跟蹤 # 3.調整/porc參數 $CTL -w net.ipv4.ip_forward=1 //打開路由轉發功能 $CTL -w net.ipv4.ip_default_ttl=128 //修改ICMP響應超時 $CTL -w net.ipv4.icmp_echo_ignore_all=1 //拒絕響應ICMP請求 $CTL -w net.ipv4.icmp_echo_ignore_broadcasts //拒絕響應ICMP廣播 $CTL -w net.ipv4.tcp_syncookies=1 //啓用SYN Cookie機制 $CTL -w net.ipv4.tcp_syn_retries=3 //最大SYN請求重試次數 $CTL -w net.ipv4.tcp_synack_retries=3 //最大ACK確認重試次數 $CTL -w net.ipv4.tcp_fin_timeout=60 //TCP鏈接等待超時 $CTL -w net.ipv4.tcp_max_syn_backlog=3200 //SYN請求的隊列長度 # 4.設置具體的防火牆規則 # 4.1刪除自定義鏈、清空已有規則 $IPT -t filter -X //清空各表中定義的鏈 $IPT -t nat -X $IPT -t mangel -X $IPT -t raw -X $IPT -t filter -F //清空各表中已有的規則 $IPT -t nat -F $IPT -t mangel -F $IPT -t raw -F # 4.2定義默認規則 $IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT ACCETP # 4.3設置nat表中的各類策略 $IPT -t nat -A POSTROUTING -s $LAN_NAT -o $INET_IF -j SNAT --to-source $INET_IP $IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP # 4.4設置filter表中的各類規則 $IPT -A INPUT -m state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT $IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp -m multiport --dport 20,21,25,80,110,143,443 -j ACCEPT $IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -d $LAN_WWW_IP -p tcp --dport 80 -j ACCEPT $IPT -A FORWARD -d $LAN_WWW_IP -p tcp --sport 80 -j ACCEPT
上述防火牆腳本實例中,僅列出其中最基礎的一些規則。更多具體的規則設置取決於實際的應用需求,還有待你們在生產環境中慢慢去體會,逐漸融會貫通。
3. iptables服務操做
檢查:# service --status-all
啓動:# service iptables start
中止:# service iptables stop
重啓:# service iptables restart
4. 完全清空規則
# iptables -F
# iptables-save > /etc/sysconfig/iptables
1 查看防火牆狀態
[root@lvxinghao ~]# systemctl status firewalld
2 查看開機是否啓動防火牆服務
[root@lvxinghao ~]# systemctl is-enabled firewalld
3 關閉防火牆
[root@lvxinghao ~]# systemctl stop firewalld
[root@lvxinghao ~]# systemctl status firewalld
4 禁用防火牆(系統啓動時不啓動防火牆服務)
[root@lvxinghao ~]# systemctl disable firewalld
[root@lvxinghao ~]# systemctl is-enabled firewalld
http://www.cnblogs.com/ld1977/articles/6144297.html
啓動一個服務:systemctl start firewalld.service
關閉一個服務:systemctl stop firewalld.service
重啓一個服務:systemctl restart firewalld.service
顯示一個服務的狀態:systemctl status firewalld.service
在開機時啓用一個服務:systemctl enable firewalld.service
在開機時禁用一個服務:systemctl disable firewalld.service
查看服務是否開機啓動:systemctl is-enabled firewalld.service
查看已啓動的服務列表:systemctl list-unit-files|grep enabled
查看啓動失敗的服務列表:systemctl --failed
3.配置firewalld-cmd
咱們假定接口ppp0通往Internet,接口eth0通往內部網絡。
ppp0的IP地址是128.138.101.4,eth0的IP地址是10.1.1.1,兩個接口的子網掩碼都是255.255.255.0。
這個例子使用無狀態包過濾機制來保護IP地址爲10.1.1.2的Web服務器,這是保護Internet服務器的標準方法。
在這個例子的後面部分,咱們將展現如何使用有狀態的過濾機制來保護桌面用戶。
在您使用iptables以前,必須啓用IP forwarding(IP轉發)功能,而且確保內核裏已經加載了各個iptables模塊。
要了解啓用IP forwarding功能的更多知識,參見28.4節或者12.11.8節。
帶有iptables的全部發行版本也都有可以完成啓用和加載的啓動腳本。
1. 第一組規則是對filter表進行初始化。
首先,沖洗掉表中全部的鏈,
而後將INPUT和FORWARD鏈的默認目標設爲DROP。
和其餘任何網絡防火牆同樣,最安全的策略就是丟棄您沒有明確容許的任何包。
# iptables -F
# iptables -P INPUT DROP // 若是是用SSH鏈接進行設置,不要用這條命令,會致使SSH斷開;
# iptables -P FORWARD DROP
2. 規則是按照它們出如今鏈中的順序來進行匹配的,因此咱們將用得最多的規則放在最前面 。
FORWARD鏈中的前3條規則讓去往10.1.1.2上網絡服務的鏈接經過防火牆。
確切地說,咱們容許SSH(端口22)、HTTP(端口80)和HTTPS(端口443)可以連到咱們的Web服務器。
第一條規則容許來自可信網絡的全部鏈接經過防火牆。
# iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 22 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 443 -j ACCEPT
3. 咱們容許流到防火牆主機(10.1.1.1)的惟一TCP流量是SSH,它用於管理防火牆。
下面列出的第二條規則容許環回(loopback)流量,它留在防火牆主機的本地。
咱們的系統管理員在他們不能ping到默認路由時會感到緊張,
因此這裏的第三條規則容許從內部IP地址來的ICMP ECHO_REQUEST包。
# iptables -A INPUT -i eth0 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -i lo -d 127.0.0.1 -p ANY -j ACCEPT
# iptables -A INPUT -i eth0 -d 10.1.1.1 -p icmp --icmp-type 8 -j ACCEPT
4. 爲了能讓任何TCP/IP主機在Internet正常工做,必須容許某些類型的ICMP包經過防火牆。
下面的8條規則就是讓ICMP包既能送到防火牆主機,也能送到在它以後的網絡的最小集合。
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 5 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 0 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 3 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 5 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 11 -j ACCEPT
5. 接下來向NAT表的PREROUTING鏈加入規則。雖然NAT表的目的並非作包過濾,
可是它的PREROUTING鏈對於反IP欺騙的過濾來講特別有用。
若是咱們在PREROUTING鏈中加入DROP項,它們就不須要出如今INPUT和FORWARD鏈裏了,
由於PREROUTING鏈會應用到全部進入防火牆主機的包上。
將控制項放到一個地方比重複放置它們的作法條理性要好得多。
# iptables -t nat -A PREROUTING -i ppp0 -s 10.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 172.16.0.0/12 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 192.168.0.0/16 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 127.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 224.0.0.0/8 -j DROP
6. 最後,咱們用一條禁止全部沒有獲得明確許可的包的規則來結束INPUT和FORWARD鏈。
雖然咱們在前面已經用iptables -P命令實施過這個作法,可是LOG目標(target)能讓咱們看到誰正在從Internet上敲咱們的大門。
# iptables -A INPUT -i ppp0 -j LOG
# iptables -A FORWARD -i ppp0 -j LOG
7. 咱們還能夠設置IP NAT來假裝在內部網絡裏使用的私用地址空間。
參見12.12節瞭解更多有關NAT的知識。
8. Netfilter帶給Linux防火牆最強大的功能之一就是有狀態包過濾機制。
針對連到Internet的客戶機的防火牆不是容許特定的傳入服務,而是容許根據客戶機的請求而傳入的響應。
下面這條簡單的有狀態FORWARD鏈容許離開咱們網絡的全部流量經過,但只容許和咱們的主機發起的鏈接有關的入流量經過。
# iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
要跟蹤複雜的網絡會話,好比FTP和IRC,必須加載某些內核模塊來啓動iptables。
若是沒有加載這些模塊,iptables就會簡單地禁止那些鏈接。雖然有狀態包過濾器可以提升站點的安全性,
可是它們也增長了網絡的複雜性。因此在防火牆上實現它以前,要確信您的確須要有狀態功能。
5、調試iptables規則集
調試iptables規則集最好的辦法或許就是用命令:
iptables -L -v
這些選項會告訴您鏈裏面的每條規則匹配了多少個包。
咱們常常在想了解有關匹配包的更多信息時,增長帶有LOG目標(target)的臨時iptables規則。
您能夠常常經過使用像tcpdump這樣的包探測器解決更棘手的問題。
6、應用實例
1. 禁止端口的實例
1). 禁止ssh 端口
只容許在192.168.62.1上使用ssh 遠程登陸,從其它計算機上禁止使用ssh
# iptables -A INPUT -s 192.168.62.1 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP
2). 禁止代理端口
# iptables -A INPUT -p tcp --dport 3128 -j REJECT
3). 禁止icmp 端口
除192.168.62.1外,禁止其它人ping 個人主機
# iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type echo-request -j ACCEPT
# iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request –j DROP
或
# iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP
注:能夠用iptables --protocol icmp --help 查看ICMP 類型
4). 禁止QQ 端口
# iptables -D FORWARD -p udp --dport 8000 -j REJECT
2. 強制訪問指定的站點
要使192.168.52.0/24網絡內的計算機(這此計算機的網關應設爲192.168.52.10)強制訪問指定的站點,
在作爲防火牆的計算機(192.168.52.10)上應添加如下規則:
1). 打開ip 包轉發功能
# echo 1 > /proc/sys/net/ipv4/ip_forward
2). 在NAT/防火牆計算機上的NAT 表中添加目的地址轉換規則:
# iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 202.96.134.130:80
# iptables -t nat -I PREROUTING -i eth0 -p udp --dport 80 -j DNAT --to-destination 202.96.134.130:80
3). 在NAT/防火牆計算機上的NAT 表中添加源地址轉換規則:
# iptables -t nat -I POSTROUTING -o eth1 -p tcp --dport 80 -s 192.168.52.0/24 -j SNAT --to-source 202.96.134.10:20000-30000
# iptables -t nat -I POSTROUTING -o eth1 -p udp --dport 80 -s 192.168.52.0/24 -j SNAT --to-source 202.96.134.10:20000-30000
4). 測試:在內部網的任一臺計算機上打開瀏覽器,輸入任一非本網絡的IP,都將指向IP 爲202.96.134.130的網站.
3. 發佈內部網絡服務器
圖4
要使因特網上的計算機訪問到內部網的FTP 服務器、WEB 服務器,在作爲防火牆的計算機上應
添加如下規則:
1).
# echo 1 > /proc/sys/net/ipv4/ip_forward
2). 發佈內部網web 服務器
# iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 --dport 80 -j DNAT --to-destination 192.168.52.15:80
# iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.15 --sport 80 -j SNAT --to-source 202.96.134.10:20000-30000
3). 發佈內部網ftp 服務器
# iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 --dport 21 -j DNAT --to-destination 192.168.52.14:21
# iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.14 --sport 21 -j SNAT --to-source 202.96.134.10:40000-50000
4). 注意:內部網的計算機網關要設置爲防火牆的ip(192.168.52.1)
5). 測試:
用一臺IP 地址爲202.96.134.0段的計算機虛擬因特網訪問,
當在其瀏覽器中訪問http://202.96.134.10時, 實際應看到的是192.168.52.15的的web 服務;
當訪問ftp://202.96.134.10時,實際應看到的是192.168.52.14上的的ftp 服務
4. 智能DNS
圖5
1).
# echo 1 > /proc/sys/net/ipv4/ip_forward
2). 在NAT 服務器上添加如下規則:
在PREROUTING 鏈中添加目的地址轉換規則:
# iptables -t nat -I PREROUTING -i eth0 -p tcp --dpor 53 -j DNAT --to-destination 202.96.134.130
# iptables -t nat -I PREROUTING -i eth0 -p udp --dpor 53 -j DNAT --to-destination 202.96.134.130
在POSTROUTING 鏈中添加源地址轉換規則:
# iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p tcp --dpor 53 -j SNAT --to-source 202.96.134.10:40000-50000
# iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p udp --dpor 53 -j SNAT --to-source 202.96.134.10:40000-50000
3). 測試
在內部網任一臺計算機上,將DNS 設置爲任意的外網IP,就可使用DNS
測試工具如nslookup來解析DNS 服務器202.96.134.130上的名稱.
5. 端口映射
見上節透明代理設置
# iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.62.0/24 --dport 80 -j REDIRECT --to-ports 3128
6. 典型NAT 上網
通常作爲NAT 的計算機同時也是局域網的網關,
假定該機有兩塊網卡eth0、eth1,
eth0鏈接外網, IP 爲202.96.134.134;
eth1鏈接局域網,IP 爲192.168.62.10
1). 先在內核裏打開ip 轉發功能
# echo 1 > /proc/sys/net/ipv4/ip_forward
2). 使局域網用戶能訪問internet 所要作的nat
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to?202.96.134.134
若是上網的IP 是動態IP,則使用如下規則:
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.62.0/24 -j MASQUERADE
若是是經過ADSL 上網,且公網IP 是動態IP,則使用如下規則:
# iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.62.0/24 -j MASQUERADE
3). 使internet 用戶能夠訪問局域網內web 主機所要作的nat
# iptables -t nat -A PREROUTING -p tcp -d 202.96.134.134 --dport 80 -j DNAT --to-destination 192.168.62.10
注:局域網內的客戶端需將默認網關、DNS 設爲防火牆的IP
7. 在咱們的網絡機房實現NAT 共享上網
工做環境:上層代理192.168.60.6(4480),只授予教師機(192.168.62.111)使用該代理的權限
目標:不使用squid 代理上網,而是使用NAT 的方式上網
方法:
1). 確保中止教師機(192.168.62.111)的squid 或其它代理服務
2). 客戶端網關、DNS 均指向192.168.62.111,瀏覽器代理設置爲192.168.60.6(4480)。
測試在當前狀況下可否上網
3). 在教師機(192.168.62.111)上添加以下iptables 規則:
# iptables -t nat -A POSTROUTING -p tcp -d 192.168.60.6/32 --dport 4480 -j SNAT --to-source 192.168.62.111:10000-30000
解釋:對於目的地爲192.168.60.六、目的端口爲4480的TCP 包,
在通過防火牆路由後,將其源地址轉換爲192.168.62.111,端口轉換爲10000-30000間的某個端口。
4). 客戶端測試可否上網
8. 對流媒體服務器的服務作IP 限制
1). 清空規則並放開SSH
# iptables -F
# iptables -A INPUT -s 10.1.1.11 -p tcp --dport 22 -j ACCEPT
2). 對指定IP放開,能夠推送流到這臺服務器, 其他的IP都禁止
A. 只對單個IP放開
# iptables -A INPUT -s 10.2.1.54 -j ACCEPT
# iptables -A INPUT -s! 10.2.1.54 -j REJECT
或
# iptables -A INPUT -s 10.2.1.54 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
B. 對多個IP放開,即將要放開的IP插入到最後一條拒絕的規則以前
# iptables -A INPUT -s 10.2.1.54 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
# iptables -I INPUT 2 -s 10.2.1.13 -j ACCEPT
3). 對指定IP段 放開,能夠推送流到這臺服務器,其他的IP都禁止
A. 對單個IP段放開
# iptables -I INPUT 2 -s 10.2.1.0/24 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
B. 對多個IP段放開
# iptables -I INPUT 2 -s 10.2.1.0/24 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
# iptables -I INPUT 2 -s 10.2.2.0/24 -j ACCEPT
其中:
10.2.1.0/24 表示: A類地址主機爲8位,表示10.2.1固定,後面是可變
前面是IP地址10.2.1.0,是表示局域網地址。
後而的24是指掩碼,由於IP地址和掩碼用二進制表示的話都是32位的。
因此掩碼的24表示那掩碼前24位是1,後8位是0,轉換成10進制就是表示掩碼是255.255.255.0
即, 255.255.255.0=11111111.11111111.11111111.0=24個1
192.168.0.0/16 表明B類地址 主機爲16,表示192.168固定,後面是可用.
4). 對指定IP拒絕,
A. 對單個IP拒絕
# iptables -A INPUT -s 10.2.1.11 -p tcp --dport 1935 -j REJECT