Linux防火墻實(shí)際指的是Linux下的Netfilter/Iptables。Netfilter/Iptables是2.4.x/2.6.x版本Linux內(nèi)核集成的IP信息包過濾系統(tǒng)。
晉中網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
查看Linux內(nèi)核版本
Netfilter/Iptables 信息包過濾系統(tǒng)可以當(dāng)成一個整體,netfilter是內(nèi)核的模塊實(shí)現(xiàn),iptables是對上層操作工具。
Netfilter是Linux核心中的一個通用架構(gòu),工作于內(nèi)核空間。
Netfilter支持一下方式對數(shù)據(jù)包進(jìn)行分類:
其提供了一系列的表(tables),每個表由若干個鏈(chains)組成,每條鏈可以由一條或若干條規(guī)則(rules)組成,其規(guī)則由一些信息包過濾表組成,這些表包含內(nèi)核用來控制信息包過濾處理的規(guī)則集。
chain的本質(zhì)是Netfilter定義的不同過濾點(diǎn)??偣捕x了5個過濾點(diǎn)。INPUT,F(xiàn)ORWARDING,OUTPUT,PREROUTING,POSTROUTIONG。
Table的本質(zhì)是Netfilter定義的不同功能的劃分。
filter用于執(zhí)行基本過濾。
nat是對數(shù)據(jù)IP進(jìn)行修改。
mangle是對數(shù)據(jù)包進(jìn)行高級修改。
不同的Table只能用于特定的Chain。
Iptables 是一個管理內(nèi)核包過濾的工具,可以用來配置核心包過濾表格中的規(guī)則。運(yùn)行于用戶空間。
Linux防火墻在企業(yè)應(yīng)用中非常有用,舉例如下:
綜述,Iptables有兩種應(yīng)用模式:主機(jī)防火墻,NAT路由器。
規(guī)則(rules)是管理員預(yù)定義的條件,規(guī)則一般的定義為“如果數(shù)據(jù)包頭符合這樣的條件,就這樣處理這個數(shù)據(jù)包”。規(guī)則存儲在內(nèi)核空間的信息包過濾表中,這些規(guī)則分別指定了源地址、目的地址、傳輸協(xié)議(如TCP、UDP、ICMP)和服務(wù)類型(如HTTP、FTP和SMTP)等。當(dāng)數(shù)據(jù)包與規(guī)則匹配時,iptables就根據(jù)規(guī)則所定義的方法來處理這些數(shù)據(jù)包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的主要工作就是添加、修改和刪除這些規(guī)則。
鏈(chains)是數(shù)據(jù)包傳播的路徑,每一條鏈其實(shí)就是眾多規(guī)則中的一個檢查清單,每一條鏈中可以有一條或數(shù)條規(guī)則。當(dāng)一個數(shù)據(jù)包到達(dá)一個鏈時,iptables就會從鏈中第一條規(guī)則開始檢查,看該數(shù)據(jù)包是否滿足規(guī)則所定義的條件。如果滿足,系統(tǒng)就會根據(jù)該條規(guī)則所定義的方法處理該數(shù)據(jù)包;否則iptables將繼續(xù)檢查下一條規(guī)則,如果該數(shù)據(jù)包不符合鏈中任一條規(guī)則,iptables就會根據(jù)該鏈預(yù)先定義的默認(rèn)策略來處理數(shù)據(jù)包。
每個鏈上都有默認(rèn)的規(guī)則。
表(tables)提供特定的功能,iptables有4個表,即raw表、filter表、nat表和mangle表,分別用于實(shí)現(xiàn)包過濾,網(wǎng)絡(luò)地址轉(zhuǎn)換和包重構(gòu)的功能。表中的規(guī)則寫在鏈上。
filter表
主要用于數(shù)據(jù)報文過濾。該表根據(jù)系統(tǒng)管理員預(yù)定義的一組規(guī)則過濾符合條件的數(shù)據(jù)包。對于防火墻而言,主要利用在filter表中指定的規(guī)則來實(shí)現(xiàn)對數(shù)據(jù)包的過濾。filter表是默認(rèn)的表,如果沒有指定哪個表,iptables 就默認(rèn)使用filter表來執(zhí)行所有命令,filter表包含了INPUT鏈,RORWARD鏈,OUTPUT鏈。在filter表中只能允許對數(shù)據(jù)包進(jìn)行接受,丟棄的操作,而無法對數(shù)據(jù)包進(jìn)行更改。
nat表
主要用于網(wǎng)絡(luò)地址轉(zhuǎn)換NAT,該表可以實(shí)現(xiàn)一對一,一對多,多對多等NAT工作(SNAT,DNAT,PNAT),iptables就是使用該表實(shí)現(xiàn)共享上網(wǎng)的,NAT表包含了PREROUTING鏈,POSTROUTING鏈,OUTPUT鏈。
nat規(guī)則表擁有 prerouting 和 postrouting 兩個規(guī)則鏈,主要功能為進(jìn)行一對一、一對多、多對多等網(wǎng)址轉(zhuǎn)換工作(SNAT,DNAT),由于轉(zhuǎn)換的特性,需進(jìn)行目的地網(wǎng)址轉(zhuǎn)換的數(shù)據(jù)包,就不需要進(jìn)行來源網(wǎng)址轉(zhuǎn)換,反之亦然,因此為了提升改寫封包的效率,在防火墻運(yùn)作時,每個封包只會經(jīng)過這個規(guī)則表一次。如果我們把數(shù)據(jù)包過濾的規(guī)則定義在這個數(shù)據(jù)表里,將會造成無法對同一包進(jìn)行多次比對,因此這個規(guī)則表除了作網(wǎng)址轉(zhuǎn)換外,請不要做其它用途。
mangle表
主要用作功能修改數(shù)據(jù)報文的屬性。比如TCP報文的6個標(biāo)志位。在內(nèi)核版本2.4.18 后的linux版本中該表包含的鏈為:INPUT鏈(處理進(jìn)入的數(shù)據(jù)包),RORWARD鏈(處理轉(zhuǎn)發(fā)的數(shù)據(jù)包),OUTPUT鏈(處理本地生成的數(shù)據(jù)包)POSTROUTING鏈(修改即將出去的數(shù)據(jù)包),PREROUTING鏈(修改即將到來的數(shù)據(jù)包)
mangle表主要用于對指定數(shù)據(jù)包進(jìn)行更改,在內(nèi)核版本2.4.18 后的linux版本中該表包含的鏈為:INPUT鏈(處理進(jìn)入的數(shù)據(jù)包),RORWARD鏈(處理轉(zhuǎn)發(fā)的數(shù)據(jù)包),OUTPUT鏈(處理本地生成的數(shù)據(jù)包)POSTROUTING鏈(修改即將出去的數(shù)據(jù)包),PREROUTING鏈(修改即將到來的數(shù)據(jù)包)。
raw表
只使用在PREROUTING鏈和OUTPUT鏈上,優(yōu)先級最高,可以對收到的數(shù)據(jù)包在連接跟蹤前進(jìn)行處理。一但用戶使用了RAW表,在某個鏈上RAW表處理完后,將跳過NAT表和 ip_conntrack處理,即不再做地址轉(zhuǎn)換和數(shù)據(jù)包的鏈接跟蹤處理了。
規(guī)則表之間的優(yōu)先順序:
raw > mangle > nat > filter
Linux防火墻的原理主要是對數(shù)據(jù)包的控制,看下圖(以下圖片均來自互聯(lián)網(wǎng)):netfilter五條鏈相互關(guān)系,即iptables數(shù)據(jù)包轉(zhuǎn)發(fā)流程圖。
(1)數(shù)據(jù)包進(jìn)入網(wǎng)卡時,先進(jìn)入PREROUTING(路由前)鏈,之后做路由判斷數(shù)據(jù)包應(yīng)發(fā)往何處,本機(jī)或其他機(jī)器。
(2)若數(shù)據(jù)包原目標(biāo)地址是本機(jī)的,數(shù)據(jù)包會前往INPUT鏈。到達(dá)INPUT鏈后,任何進(jìn)程都會收到它。
(3)本機(jī)程序發(fā)送出數(shù)據(jù)包,數(shù)據(jù)包會經(jīng)過OUTPUT鏈,然后到達(dá)POSTROUTING鏈輸出。
(4)若數(shù)據(jù)包原目標(biāo)地址非本機(jī),則需要轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包前往 FORWARD鏈,然后到達(dá)POSTROUTING(路由后)鏈輸出。
Netfilter在五個鏈上,使用HOOK技術(shù)做規(guī)則檢查。
iptables執(zhí)行規(guī)則時,是從規(guī)則表中從上至下順序執(zhí)行的。
若沒遇到匹配的規(guī)則,就一條一條往下匹配;
若完全沒有匹配的規(guī)則,則執(zhí)行該鏈上的默認(rèn)規(guī)則;
若遇到匹配的規(guī)則,則執(zhí)行規(guī)則,執(zhí)行后根據(jù)本規(guī)則的動作(accept,reject,log,drop等),決定下一步執(zhí)行的情況,后續(xù)執(zhí)行一般有三種情況:
透過這種機(jī)制所帶來的好處是,可以進(jìn)行復(fù)雜、多重的封包過濾,簡單的說,iptables可以進(jìn)行縱橫交錯式的過濾(tables)而非鏈狀過濾(chains)。
包的狀態(tài)依據(jù)IP所包含的協(xié)議不同而不同,但在內(nèi)核外部,也就是用戶空間里,只有4種 狀態(tài):NEW,ESTABLISHED,RELATED 和INVALID。它們主要是和狀態(tài)匹配一起使用。
數(shù)據(jù)包在用戶空間的狀態(tài):
這些狀態(tài)可以一起使用,以便匹配數(shù)據(jù)包。這可以使防火墻非常強(qiáng)壯和有效。
iptables的實(shí)驗(yàn)請盡量在虛擬機(jī)或非遠(yuǎn)程的系統(tǒng)中操作,避免不小心的誤操作可能導(dǎo)致ssh無法使用。
一般來講,iptables防火墻已經(jīng)內(nèi)置于CentOS 6及其他Linux版本中,而且iptables服務(wù)默認(rèn)都是啟動的。 iptables應(yīng)用于IPv4, 如果要用IPv6,需要使用ip6tables。
iptables和ip6_tables、arp_tables一同都是建構(gòu)在Xtables的架構(gòu)下,這個方案讓系統(tǒng)管理員定義“表(tables)”、“鏈(chain)”、“規(guī)則(rules)”三個數(shù)據(jù)來處理數(shù)據(jù)包的運(yùn)送。每一個“表”都和不同的數(shù)據(jù)包處理有關(guān)、決定數(shù)據(jù)包是否可以穿越的是“鏈”、而一條“規(guī)則”在鍵里面則可以決定是否送往下一條鏈(或其它的動作),這個處理可以在嵌套的結(jié)構(gòu)里面重復(fù)使用。每一個網(wǎng)絡(luò)數(shù)據(jù)包從抵達(dá)到離開該計算機(jī)至少會經(jīng)過一個鏈(亦即轉(zhuǎn)送或本機(jī)路由)。
查看有沒有安裝iptables:rpm -qa | grep iptables
若機(jī)器上安裝了man命令。則使用man iptables查看iptables的幫助文檔。
service iptables start #或 /etc/init.d/iptables start
service iptables stop #或 /etc/init.d/iptables stop
#啟動時開啟 chkconfig iptables on #啟動時關(guān)閉 chkconfig iptables off
在終端運(yùn)行 setup,選擇 firewall 回車。
按Tab鍵切換到Enablede項,然后按空格鍵選擇。然后再按Tab鍵切換到OK,按空格鍵或回車鍵選擇。按Tab鍵切換到quit,退出setup。
iptables [-t table] command [match] [target/jump]
-t table
用來指明使用的表,有三種選項: filter,nat,mangle。若未指定,則默認(rèn)使用filter表。
command
指定iptables 對我們提交的規(guī)則要做什么樣的操作。命令都都需要以chain作為參數(shù)。
command 選項
-v, --verbose(詳細(xì)的)
可用此選項的命令:--list, --append, --insert, --delete, --replace
說明:該選項使輸出更詳細(xì),常與--list 連用。與--list連用時,輸出中包括網(wǎng)絡(luò)接口的地址、規(guī)則的選項、TOS掩碼、 字節(jié)和包計數(shù)器,其中計數(shù)器是以K、M、G(這里用的是10的冪而不是2的冪)為單位的。若-v 和--append、--insert、--delete 或--replace連用,iptables會輸出詳細(xì)的信息告訴你規(guī)則是如何被解釋的、是否正確地插入等等。
-x, --exact(精確的)
可用此選項的命令:--list
說明:使--list輸出中的計數(shù)器顯示準(zhǔn)確的數(shù)值,而不用K、M、G等估值。
-n, --numeric(數(shù)值)
可用此選項的命令:--list
說明:使輸出中的IP地址和端口以數(shù)值的形式顯示,而不是默認(rèn)的名字,比如主機(jī)名、網(wǎng)絡(luò)名、程序名等。
--line-numbers
可用此選項的命令:--list
說明:該選項的作用是顯示出每條規(guī)則在相應(yīng)鏈中的序號。對插入新規(guī)則很有用。
-c, --set-counters
可用此選項的命令:--insert, --append, --replace
說明:在創(chuàng)建或更改規(guī)則時設(shè)置計數(shù)器,語法如下:--set-counters 20 4000,意思是讓內(nèi)核把包計數(shù)器設(shè)為20,把字節(jié)計數(shù)器設(shè)為4000。
--modprobe
可用此選項的命令:All
說明:此選項告訴iptables探測并裝載要使用的模塊。這是非常有用的一個選項,若modprobe命令不在搜索路徑中,就要用到了。有了這個選項, 在裝載模塊時,即使有一個需要用到的模塊沒裝載上,iptables也知道要去搜索。
matches 匹配
匹配選項指定數(shù)據(jù)包與規(guī)則匹配所具有的特征,包括源地址,目的地址,傳輸協(xié)議和端口號,如下所示:
[-i|o 網(wǎng)卡名稱]
說明:
-i --in-interface 網(wǎng)絡(luò)接口名 指定數(shù)據(jù)包從哪個網(wǎng)絡(luò)接口進(jìn)入。
-o --out-interface 網(wǎng)絡(luò)接口名 指定數(shù)據(jù)包從哪個網(wǎng)絡(luò)接口輸出。
[-p 協(xié)議類型]
-p ---proto 協(xié)議類型 指定數(shù)據(jù)包匹配的協(xié)議,如TCP、UDP和ICMP等
[-s 源IP地址|源子網(wǎng)]
-s --source 源地址或子網(wǎng) 指定數(shù)據(jù)包匹配的源地址
[--sport 源端口號]
--sport 源端口號 指定數(shù)據(jù)包匹配的源端口號
[-d 目標(biāo)IP地址|目標(biāo)子網(wǎng)]
-s --source 目標(biāo)地址或子網(wǎng) 指定數(shù)據(jù)包匹配的目標(biāo)地址
[--dport 目標(biāo)端口號]
--dport 目的端口號 指定數(shù)據(jù)包匹配的目的端口號
[-m 模塊]
-m --match 匹配的模塊 指定數(shù)據(jù)包規(guī)則所使用的過濾模塊
Targets/Jumps
target/jump決定符合條件的包到何處去,語法是--jump target或-j target。
target可以被細(xì)分為兩類,Target和Jump。
target指定要對包做的操作,比如DROP和ACCEPT。不同的target有不同的結(jié)果。一些target會使包停止前進(jìn),也就是不再繼續(xù)比較當(dāng)前鏈中的其他規(guī)則或父鏈中的其他規(guī)則。而另外一些target在對包做完操作之后,包還會繼續(xù)和其他的規(guī)則比較,如LOG,ULOG和TOS。它們會對包進(jìn)行記錄,然后讓包通過,以便匹配這條鏈中的其他規(guī)則。有了這樣的target,就可以對同一個包既改變它的TTL又改變它的TOS。有些target必須要有準(zhǔn)確的參數(shù)(如TOS需要確定的數(shù)值),有些就不是必須的,但如果我們想指定也可以(如日志的前綴,偽裝使用的端口,等等)。
常用Target簡述
ACCEPT
當(dāng)包滿足了指定的匹配條件,就會被ACCEPT,允許包前往下一個目的地。不會再去匹配當(dāng)前鏈中的其他規(guī)則或同一個表內(nèi)的其他規(guī)則,但包還要通過其他表中的鏈,可能會被DROP。
DROP
當(dāng)信息包與具有DROP目標(biāo)的規(guī)則完全匹配時,會阻塞該信息包,并且不對它做進(jìn)一步處理。該目標(biāo)被指定為-j DROP。
若包符合條件,該target就會將target丟掉,也就是說包的生命到此結(jié)束,效果就是包被阻塞了。
在某些情況下,這個target會引起意外的結(jié)果,因?yàn)樗粫虬l(fā)送者返回任何信 息,也不會向路由器返回信息,這就可能會使連接的另一方的sockets因苦等回音而亡:) 解決這個問題的較 好的辦法是使用REJECT target,(譯者注:因?yàn)樗趤G棄包的同時還會向發(fā)送者返 回一個錯誤信息,這樣另一方就能正常結(jié)束),尤其是在阻止端口掃描工具獲得更多的信息時,可以隱蔽被 過濾掉的端口等等(譯者注:因?yàn)閽呙韫ぞ邟呙枰粋€端口時,如果沒有返回信息,一般會認(rèn)為端口未打開或 被防火墻等設(shè)備過濾掉了)。還要注意如果包在子鏈中被DROP了,那么它在主鏈里也不會再繼續(xù)前進(jìn),不管 是在當(dāng)前的表還是在其他表里。總之,包死翹翹了。
REJECT
REJECT和DROP基本一樣,區(qū)別在于它除了阻塞包之外, 還向發(fā)送者返回錯誤信息。target還只能用在INPUT、FORWARD、OUTPUT和它們的子鏈里,而且包含 REJECT的鏈也只能被它們調(diào)用,否則不能發(fā)揮作用。它只有一個選項,是用來控制 返回的錯誤信息的種類的。雖然有很多種類,但如果你有TCP/IP方面的基礎(chǔ)知識,就很容易理解它們。
攔阻該數(shù)據(jù)包,并返回數(shù)據(jù)包通知對方,可以返回的數(shù)據(jù)包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(這個數(shù)據(jù)包包會要求對方關(guān)閉聯(lián)機(jī)),進(jìn)行完此處理動作后,將不再比對其它規(guī)則,直接中斷過濾程序。 范例如下:
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
RETURN
在規(guī)則中設(shè)置的RETURN目標(biāo)讓與該規(guī)則匹配的信息包停止遍歷包含該規(guī)則的鏈。如果鏈?zhǔn)侨鏘NPUT之類的主鏈,則使用該鏈的默認(rèn)策略處理信息包。它被指定為-jump RETURN。
結(jié)束在目前規(guī)則鏈中的過濾程序,返回主規(guī)則鏈繼續(xù)過濾,如果把自訂規(guī)則煉看成是一個子程序,那么這個動作,就相當(dāng)于提早結(jié)束子程序并返回到主程序中。
REDIRECT
將封包重新導(dǎo)向到另一個端口(PNAT),進(jìn)行完此處理動作后,將會繼續(xù)比對其它規(guī)則。這個功能可以用來實(shí)作透明代理或用來保護(hù)web服務(wù)器。
例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
LOG
將數(shù)據(jù)包相關(guān)信息紀(jì)錄在 /var/log 中,詳細(xì)位置請查閱 /etc/syslog.conf 配置文件,進(jìn)行完此處理動作后,將會繼續(xù)比對其它規(guī)則。
例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
MASQUERADE
改寫封包來源IP為防火墻的IP,可以指定port 對應(yīng)的范圍,進(jìn)行完此處理動作后,直接跳往下一個規(guī)則鏈(mangle:postrouting)。這個功能與 SNAT 略有不同,當(dāng)進(jìn)行IP 偽裝時,不需指定要偽裝成哪個 IP,IP 會從網(wǎng)卡直接讀取,當(dāng)使用撥接連線時,IP 通常是由 ISP 公司的 DHCP服務(wù)器指派的,這個時候 MASQUERADE 特別有用。
例如:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
SNAT
改寫封包來源 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應(yīng)的范圍,進(jìn)行完此處理動作后,將直接跳往下一個規(guī)則煉(mangle:postrouting)。
例如:iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
DNAT
改寫數(shù)據(jù)包包目的地 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應(yīng)的范圍,進(jìn)行完此處理動作后,將會直接跳往下一個規(guī)則鏈(filter:input 或 filter:forward)。
例如:iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
MIRROR
鏡像數(shù)據(jù)包,也就是將來源 IP與目的地IP對調(diào)后,將數(shù)據(jù)包返回,進(jìn)行完此處理動作后,將會中斷過濾程序。
QUEUE
中斷過濾程序,將封包放入隊列,交給其它程序處理。透過自行開發(fā)的處理程序,可以進(jìn)行其它應(yīng)用,例如:計算聯(lián)機(jī)費(fèi)用.......等。
MARK
將封包標(biāo)上某個代號,以便提供作為后續(xù)過濾的條件判斷依據(jù),進(jìn)行完此處理動作后,將會繼續(xù)比對其它規(guī)則。
例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
iptables作為Linux的基礎(chǔ)服務(wù),默認(rèn)啟動。
查看iptables服務(wù)的狀態(tài)
命令:service iptables status
重啟iptables狀態(tài)
命令:service iptables restart
使用iptables命令只能使規(guī)則臨時生效。
如果需要永久生效,則要保存.寫入到/etc/sysconfig/iptables文件里.
/etc/rc.d/init.d/iptables save
iptables規(guī)則文件保存在/etc/sysconfig/iptables中。
寫入后記得把防火墻重起一下,才能起作用。
不管你在安裝linux時是否啟動了防火墻,如果你想配置屬于自己的防火墻,那就清除現(xiàn)在filter的所有規(guī)則.
iptables -F #清除預(yù)設(shè)表filter中的所有規(guī)則鏈的規(guī)則。 iptables -X #清除預(yù)設(shè)表filter中使用者自定鏈中的規(guī)則。 iptables –Z #數(shù)據(jù)包計數(shù)器歸零。
例:查看本機(jī)關(guān)于IPTABLES的設(shè)置情況:iptables -L -n
默認(rèn)顯示filter表的情況,所以顯示了INPUT,F(xiàn)ORWARD,OUTPUT鏈上的規(guī)則情形。
例:查看nat表上的規(guī)則:iptables -t nat -L
設(shè)置默認(rèn)策略:關(guān)閉filter表的INPUT鏈、FORWARD鏈,開啟OUTPUT鏈。
iptables -P INPUT DROP iptables –P OUTPUT ACCEPT iptables –P FORWARD DROP
遠(yuǎn)程SSH登陸。允許tcp協(xié)議,開啟22端口。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
若把OUTPUT設(shè)置成DROP,則需要使用如下規(guī)則:
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
WEB服務(wù)器,開啟80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
若OUTPUT設(shè)置成DROP的話,則需要使用如下規(guī)則,其他同理。
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
郵件服務(wù)器端口配置
smtp: iptables -A FORWARD -p tcp --dport 25 -j ACCEPT #pop3: iptables -A FORWARD -p tcp --dport 110 -j ACCEPT iptables -A FORWARD -p udp --dport 110 -j ACCEPT #imap: iptables -A FORWARD -p tcp --dport 143 -j ACCEPT iptables -A FORWARD -p udp --dport 143 -j ACCEPT imaps: iptables -A FORWARD -p tcp --dport 993 -j ACCEPT iptables -A FORWARD -p udp --dport 993 -j ACCEPT pop3s: iptables -A FORWARD -p tcp --dport 995 -j ACCEPT iptables -A FORWARD -p udp --dport 995 -j ACCEPT
FTP服務(wù)器,開啟21端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 20 -j ACCEPT
DNS服務(wù)器,開啟53端口
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
允許ping,即允許icmp包通過
iptables -A INPUT -p icmp -j ACCEPT #若INPUT設(shè)置成DROP iptables -A OUTPUT -p icmp -j ACCEPT #若OUTPUT設(shè)置成DROP
允許loopback,一般系統(tǒng)都需要允許回環(huán)。否則可能導(dǎo)致一些問題。如DNS無法正常關(guān)閉。
IPTABLES -A INPUT -i lo -p all -j ACCEPT
若把OUTPUT設(shè)置成DROP,則需要使用如下規(guī)則:
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
減少不安全的端口連接
iptables -A OUTPUT -p tcp --sport 31337 -j DROP iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些木馬會掃描端口31337到31340(即黑客語言中的 elite 端口)上的服務(wù)。既然合法服務(wù)都不使用這些非標(biāo)準(zhǔn)端口來通信,阻塞這些端口能夠有效地減少網(wǎng)絡(luò)上可能被感染的機(jī)器和它們的遠(yuǎn)程主服務(wù)器進(jìn)行獨(dú)立通信的機(jī)會。
sshd的端口為22,若系統(tǒng)直接開放22端口,那么Internet上所有主機(jī)都可以連接Linux,這樣不安全。更好的方法是,僅允許某個范圍的IP或某個指定ip,且某范圍的端口的主機(jī)可以連接主機(jī),其他IP全部拒絕:
iptables –A INPUT –i ppp0 –p tcp –s 222.91.99.0/28 –-sport 1024:65536 –dport 22 –j ACCEPT iptables –A INPUT –i ppp0 –p tcp –dport 22 –j DROP
說明:1024:65535 表示端口范圍是1024至65535,包括兩端的端口在內(nèi)。
以上做法保證了一定的安全性。但由于非法的數(shù)據(jù)包會被阻塞,因此某些端口掃描工具會提示“該計算機(jī)處于防火墻保護(hù)狀態(tài)“,這也是不安全的。要欺騙這些工具,可以使用如下規(guī)則:
iptables –A INPUT –i ppp0 –p tcp –s 222.91.99.0/28 –-sport 1024:65536 –dport 22 –j ACCEPT iptables –A INPUT –i ppp0 –p tcp –dport 22 –j REJECT –reject-with tcp-reset
這樣的規(guī)則,當(dāng)非法連接服務(wù)器時,會發(fā)出tcp-reset的請求,這個封包會要求對方關(guān)閉連接。這樣,服務(wù)器會更加安全。
只允許192.168.0.3的機(jī)器進(jìn)行SSH連接
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
若要允許,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP。
要記得把 /etc/sysconfig/iptables 里的這一行刪了.
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
這一行表示所有地址都可以登陸。
或采用命令方式:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
說明: 192.168.0.1/24 24的意思就是說子網(wǎng)掩碼中表示網(wǎng)絡(luò)的二進(jìn)制位數(shù)是24位。 即: 11111111.11111111.11111111.00000000 也就是24個1。變成十進(jìn)制就是:255.255.255.0 子網(wǎng)掩碼的意義 把IP(192.168.0.1)轉(zhuǎn)換為二進(jìn)制數(shù),即:11000000.10101000.00000000.00000001 將IP和子網(wǎng)掩碼做與運(yùn)算得:11000000.10101000.00000000.00000000 再變成十進(jìn)制數(shù)得:192.168.0.0 這個就是192.168.0.1這個IP所屬的網(wǎng)絡(luò)地址,也可以說192.168.0.1在192.168.0.0這個網(wǎng)段內(nèi)。
技巧:!表示not。 例:!192.168.0.3 表示除了192.168.0.3的ip地址 其他的規(guī)則連接也一樣這么設(shè)置.
例:某Linux系統(tǒng),作為ADSL上網(wǎng)的代理服務(wù)器,同時運(yùn)行WWW服務(wù),有兩個網(wǎng)絡(luò)接口,eth0連接局域網(wǎng),ppp0是ADSL上網(wǎng)的Internet網(wǎng)絡(luò)接口,添加如下規(guī)則。
允許局域網(wǎng)內(nèi)192.168.60.24/24的所有主機(jī)訪問代理服務(wù)器,除了192.168.60.3這臺主機(jī):
iptables –A INPUT –i eth0 –s 192.168.60.3 –j DROP iptables –A INPUT –i eth0 –s 192.168.0/24 –j ACCEPT
注意:兩個規(guī)則的順序不能反。
例:讓Linux代理服務(wù)器接受所有的來源不是網(wǎng)絡(luò)接口ppp0的數(shù)據(jù),即僅允許了局域網(wǎng)的訪問,局域網(wǎng)的所有主機(jī)不能訪問Internet
iptables –A input –i !ppp0 –j ACCEPT
允許所有已經(jīng)建立的和相關(guān)的連接
iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
DROP非法連接
iptables -A INPUT -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP iptables-A FORWARD -m state --state INVALID -j DROP
丟棄壞的TCP包
iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
處理IP碎片數(shù)量,防止攻擊,允許每秒100個
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
設(shè)置ICMP包過濾,允許每秒1個包,限制觸發(fā)條件是10個包.
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
如圖顯示外網(wǎng)映射原理:
清除nat表中的規(guī)則
iptables -F -t nat iptables -X -t nat iptables -Z -t nat
例:將代理服務(wù)器80端口重定向到8009端口,設(shè)置規(guī)則如下:
iptable –t nat –A PREROUTING –p tcp –dport 80 –j REDIRECT –to-ports 8009
例:內(nèi)網(wǎng)機(jī)器對外發(fā)布WEB網(wǎng)站
內(nèi)網(wǎng)WEB服務(wù)器IP地址為192.168.0.3,當(dāng)公網(wǎng)客戶端訪問服務(wù)器時,防火墻將請求映射到內(nèi)網(wǎng)的192.168.0.3的80端口
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:80
例:禁止與211.101.46.253的所有連接
iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP
例:禁用FTP端口
iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
只禁用211.101.46.253地址的FTP連接,其他連接還可以.如web(80端口)連接。
iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP