隨筆-179  評論-666  文章-29  trackbacks-0

          關(guān)于IP Tables

          在初始化設(shè)置系統(tǒng)后,為了讓系統(tǒng)更安全,Ubuntu把Iptabls作為發(fā)行版的默認(rèn)防火墻。起初,盡管Ubuntu防火墻已經(jīng)被配置了,但是它設(shè)置為通過一個虛擬主機允許所有的進(jìn)入與流出流量。要打開服務(wù)器上某些更強的保護(hù)功能,我們需要在IP Table山增加一些基礎(chǔ)的規(guī)則。

          IP Table 規(guī)則來自于一系列可以組合起來創(chuàng)建各自的特定的處理方法的選項。每一個通過防火墻的包被所有的規(guī)則按順序檢查,一旦符合某個規(guī)則,這個報文包就遵循相關(guān)的動作,否則就處理下一行。

          IP Table 命令

          盡管這個教程只會涉及有限的一些命令,這些命令能夠提供給服務(wù)器一些基本安全,然后卻可以為IP Table提供大量的細(xì)致與具體的用例。下面是配置VPS防火墻最有用的命令中的一部分,請在腦海中保持一根弦:下面只是一個很短的列表,還有大量的其他可選參數(shù)。

          -A:(Append), 增加一條規(guī)則到IP Table中;
          -L:(List),顯示當(dāng)前規(guī)則;
          -m conntrack: 允許規(guī)則基于當(dāng)前的連接狀態(tài),詳細(xì)指定使用 --cstate 命令;
          --cstate: 解釋當(dāng)前連接可以進(jìn)入的狀態(tài),有4種,分別是: New, Related, Established, Invalid;
          -p:(protocal),指向要被檢查的規(guī)則或包的協(xié)議,指定的協(xié)議可以是tcp,upd,updlite,icmp,esp,ah,sctp,中的一種或者特殊的關(guān)鍵詞
          "all"
          --dport:(port),指向機器連接通過的端口;
          -j:(junp),這個參數(shù)指明當(dāng)有滿足一條規(guī)則的事件發(fā)生,那么就要采取的動作。它被轉(zhuǎn)換為如下四種可能中的一種

          • -ACCEPT:這個包被接收,沒有更進(jìn)一步的規(guī)則需要處理;
          • -REJECT:這個包被拒絕了,同時通知發(fā)送者,沒有更進(jìn)一步的規(guī)則需要處理;
          • -DROP:這個包被拒絕了,但是不會通知發(fā)送者,沒有更進(jìn)一步的規(guī)則需要處理;
          • -LOG:這個包被接收,同時被日志記錄,接下來的規(guī)則會繼續(xù)被執(zhí)行;

          -I:(Insert),在前兩個之間插入一條規(guī)則;
          -I INPUT 3:插入一條規(guī)則到IP Table中,并且讓它成為列表中的第三個;
          -v:(verbose),提供關(guān)于一條規(guī)則的更多的細(xì)節(jié);

          建立一個IP Table

          如果你輸入以下命令,可以在虛擬主機上看到當(dāng)前的IP Table

          sudo iptables -L

          顯示出來的內(nèi)容應(yīng)該類似下面這樣:

          Chain INPUT (policy ACCEPT)
          target prot opt source destination

          Chain FORWARD (policy ACCEPT)
          target prot opt source destination

          Chain OUTPUT (policy ACCEPT)
          target prot opt source destination

          如果你在某處有一個不同的規(guī)則集或者你想要開始一個新的,你總是可以通過刷新與刪除所有規(guī)則以使規(guī)則被還原為默認(rèn)的。

          sudo iptables -F

          更進(jìn)一步,如果你想用IP Table來提高你的工作速度,你可以在命令中使用 -n,這個參數(shù)屏蔽掉DNS查詢,阻止那些嘗試從規(guī)則集中反轉(zhuǎn)找出每一個ip的命令,你可以用這個命令列出規(guī)則來,比如下面這樣:

          iptables -L -n

          一個基本的防火墻

          基于表示當(dāng)前運行所有連接的規(guī)則,即傳入和傳出。無論怎樣都么有安全可言。在我們建立table時,需要隨時保持一根弦的就是,一旦一個包被ACCEPTED,REJECTED,DROPPED,那么就不會有更進(jìn)一步的規(guī)則被執(zhí)行了。即規(guī)則中第一個比后一個有優(yōu)先權(quán)。

          當(dāng)創(chuàng)建規(guī)則時,我們必須保證不因意外的屏蔽SSH而阻止了我們自己。

          開始時,我們必須要保證允許當(dāng)前所以的連接,當(dāng)創(chuàng)建規(guī)則時所有的連接會保持在線。

          sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

          讓我們開始來分析這段命令的意思:

          1. -A 告訴IP Table增加一條規(guī)則到table中;
          2. INPUT 指定這條規(guī)則是輸入鏈的一部分;
          3. m conntrack 后續(xù)跟著 -csstat ESTABLISHED,RELATED表明這條規(guī)則只能當(dāng)前存在的連接和與它相關(guān)的連接起作用;
          4. -j ACCEPT 判斷這個包跳轉(zhuǎn)到接收,而這個連接不會改變;

          在我們保證了當(dāng)前vps上連接不會被中斷后,我們可以著手開始屏蔽掉不安全的連接。

          我們假設(shè)想要屏蔽掉除了給ssh用的22端口和web服務(wù)的80端口外的其他傳入流量。我們通過使用下面的規(guī)則來允許指定端口上的所有流量:

          sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
          sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

          在這兩條命令中, -p 參數(shù)代表連接使用的協(xié)議,在這里是tcp,--dport指定傳遞的包通過的端口

          在我們保證了有價值的通信將會通過防火墻后,我們可以通過屏蔽掉所有剩下的進(jìn)入vps的通信來結(jié)束規(guī)則。因為這是規(guī)則列表中的最后一條,任何一個滿足上面一條規(guī)則的通信都不會被此條規(guī)則影響到,它們會被我們之前的定義所處理。

          下面就開始定義屏蔽掉所有剩下通信的規(guī)則:

          sudo iptables -A INPUT -j DROP

          通過上面的定義,我們更新后的規(guī)則類似于下面這樣:

          sudo iptables -L
          Chain INPUT (policy ACCEPT)
          target prot opt source destination
          ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
          ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
          ACCEPT tcp -- anywhere anywhere tcp dpt:http
          DROP all -- anywhere anywhere

          我們基本上快結(jié)束了。然后,我們忘記了一個規(guī)則,我們需要提供我們的vps的回環(huán)訪問。如果我們現(xiàn)在打算添加的規(guī)則沒有更多的限定語,它將是規(guī)則列表的最后一條,因為它在屏蔽掉所有通信的后面,所以它不會產(chǎn)生作用。

          為了避免這種情況,我們需要把這條規(guī)則添加到列表的第一條,使用如下的命令:

          sudo iptables -I INPUT 1 -i lo -j ACCEPT

          1. -I INPUT 1 把這條命令放在規(guī)則表的第一條;
          2. lo 指向回環(huán)接口;
          3. -j ACCEPT保證回環(huán)通信能被接收;

          到目前為止,我們已經(jīng)創(chuàng)建了一個基本的防火墻,你的規(guī)則應(yīng)該類似于這樣(我們可以使用 -v來查看iptable的詳細(xì)信息):

          sudo iptables -L -v

          Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
          pkts bytes target prot opt in out source destination
          0 0 ACCEPT all -- lo any anywhere anywhere
          1289 93442 ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
          2 212 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
          0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
          47 2422 DROP all -- any any anywhere anywhere

          Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
          pkts bytes target prot opt in out source destination

          Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
          pkts bytes target prot opt in out source destination

          然而,當(dāng)vps重啟后,IP Table就被清除掉了,下一步就是保存與恢復(fù)IP Tables。

          保存IP Tables

          雖然IP Tables非常的有用,如果服務(wù)器重啟,那么他們會被自動的刪除。為了保證他們永遠(yuǎn)有效,我們可以使用一個叫做IP-Tables persistent軟件包。
          我們可以通過apt-get 來安裝這個軟件包:

          sudo apt-get install iptables-persistent
          安裝過程中,你將會被詢是否同時保存IPv4和IPv6規(guī)則,選擇yes。

          你的規(guī)則稍后就可以被保存在 /etc/iptables/rules.v4和/etc/iptables/rules.v6中。

          當(dāng)安裝完成后,運行下面這個命令啟動iptables-persistent:
          sudo service iptables-persistent start
          后續(xù)無論怎么重啟服務(wù)器,你的規(guī)則都保存在那里。

          保存您的防火墻股則到一個文件 

          # iptables-save > /etc/iptables.up.rules 

          接著修改 /etc/network/interfaces 腳本自動應(yīng)用這些規(guī)則(末行是添加的) 

          auto eth0 
          iface eth0 inet dhcp 
          pre-up iptables-restore < /etc/iptables.up.rules 

          你也可以準(zhǔn)備一組規(guī)則冰并自動應(yīng)用它 

          auto eth0 
          iface eth0 inet dhcp 
          pre-up iptables-restore < /etc/iptables.up.rules 
          post-down iptables-restore < /etc/iptables.down.rules 


          封單個IP的命令是:

           代碼如下復(fù)制代碼
          iptables -I INPUT -s 211.1.0.0 -j DROP

          封IP段的命令是:

           代碼如下復(fù)制代碼

          iptables -I INPUT -s 211.1.0.0/16 -j DROP 
          iptables -I INPUT -s 211.2.0.0/16 -j DROP 
          iptables -I INPUT -s 211.3.0.0/16 -j DROP

          封整個段的命令是:

           代碼如下復(fù)制代碼

          iptables -I INPUT -s 211.0.0.0/8 -j DROP

          封幾個段的命令是:

           代碼如下復(fù)制代碼

          iptables -I INPUT -s 61.37.80.0/24 -j DROP 
          iptables -I INPUT -s 61.37.81.0/24 -j DROP


          vi /etc/sysconfig/iptables里:RH-Firewall-1-INPUT - [0:0]下面添加一行

          下面是只允許某個IP訪問xx端口

           代碼如下復(fù)制代碼

          -A INPUT -s 192.168.5.244 -j DROP

          以上是臨時設(shè)置。

          解封的話:

           代碼如下復(fù)制代碼

          iptables -D INPUT -s IP地址 -j REJECT 
          iptables -F 全清掉了  


          防止同步包洪水(Sync Flood)

           代碼如下復(fù)制代碼
          # iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT

          防止各種端口掃描

           代碼如下復(fù)制代碼
          # iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT

          Ping 洪水攻擊(Ping of Death)

           代碼如下復(fù)制代碼
          # iptables -A FORWARD -p icmp –icmp-type echo-request -m limit –limit 1/s -j ACCEPT


          1. 查看本機關(guān)于IPTABLES的設(shè)置情況

           代碼如下復(fù)制代碼
          # iptables -L -n

          2. 清除原有規(guī)則
          # iptables -F 清除預(yù)設(shè)表filter中的所有規(guī)則鏈的規(guī)則
          # iptables -X 清除預(yù)設(shè)表filter中使用者自定鏈中的規(guī)則

          =========================================================================================================================================

          Iptables是一個防火墻,所有的Ubuntu官方發(fā)行版(Ubuntu,Kubuntu,Xubuntu)都默認(rèn)自帶Iptables。當(dāng)你安裝完Ubuntu以后,Iptables就已經(jīng)裝好了,但是默認(rèn)設(shè)置是允許所有的通訊。從Ubuntu 8.04版本開始,Ubuntu有了一個防火墻配置的GUI工具UFW

          ubuntu下跟其他linux系統(tǒng)的操作基本相同,可能略有不同。
          iptables命令的選項很多,多使用man吧。

          查看本機設(shè)置

          查看本機的Iptables設(shè)置使用下面的命令:

          iptables -L -n

          通過iso文件剛安裝完的純凈的ubuntu,查看一下防火墻設(shè)置的話,是這樣沒有任何規(guī)則的:

          Chain INPUT (policy ACCEPT)
          target       prot opt source                 destination         
          Chain FORWARD (policy ACCEPT)
          target       prot opt source                 destination         
          Chain OUTPUT (policy ACCEPT)
          target       prot opt source                 destination

          沒有任何規(guī)則。

          清除規(guī)則

          不管有沒有配置過規(guī)則,在重新進(jìn)行配置之前,需要先清除規(guī)則:

          iptables -F        //清除預(yù)設(shè)表filter中的所有規(guī)則鏈的規(guī)則
          iptables -X        //清除預(yù)設(shè)表filter中使用者自定鏈中的規(guī)則

          設(shè)定預(yù)設(shè)規(guī)則

          這樣就清除干凈了,下面開始配置,先設(shè)定預(yù)設(shè)規(guī)則。
          對于防火墻的設(shè)置,有兩種策略:一種是全部通訊口都允許使用,只是阻止一些我們知道的不安全的或者容易被利用的口;另外一種,則是先屏蔽所有的通訊口,而只是允許我們需要使用的通訊端口。

          iptables -P INPUT DROP
          iptables -P OUTPUT ACCEPT
          iptables -P FORWARD DROP

          注意-P中的P需要大寫,表示Protocol。

          可以看出INPUT,FORWARD兩個鏈采用的是允許什么包通過,而OUTPUT鏈采用的是不允許什么包通過。
          當(dāng)超出了IPTABLES里filter表里的兩個鏈規(guī)則(INPUT、FORWARD)時,不在這兩個規(guī)則里的數(shù)據(jù)包怎么處理呢,那就是DROP(放棄)。應(yīng)該說這樣配置是很安全的,我們要控制流入數(shù)據(jù)包。
          而對于OUTPUT鏈,也就是流出的包我們不用做太多限制,而是采取ACCEPT,也就是說,不在這個規(guī)則里的包怎么辦呢,那就是通過。

          添加規(guī)則

          先來添加INPUT規(guī)則,因為INPUT預(yù)設(shè)的是DROP,所以要添加ACCEPT規(guī)則。
          首先是22端口,這個的用處地球人都知道。

          iptables -A INPUT -p tcp --dport 22 -j ACCEPT

          或者,你不寫22,寫ssh也可以。

          iptables -A INPUT -p tcp --dport ssh -j ACCEPT

          給Web服務(wù)器開啟80端口

          iptables -A INPUT -p tcp --dport 80 -j ACCEPT

          給FTP服務(wù)開啟20和21端口

          iptables -A INPUT -p tcp --dport 20 -j ACCEPT
          iptables -A INPUT -p tcp --dport 21 -j ACCEPT

          給郵件服務(wù)開啟25和110端口

          iptables -A INPUT -p tcp --dport 25 -j ACCEPT
          iptables -A INPUT -p tcp --dport 110 -j ACCEPT

          對于OUTPUT規(guī)則,因為預(yù)設(shè)的是ACCEPT,所以要添加DROP規(guī)則,減少不安全的端口鏈接。

          iptables -A OUTPUT -p tcp --sport 31337 -j DROP
          iptables -A OUTPUT -p tcp --dport 31337 -j DROP

          具體要DROP掉哪些端口,可以查詢相關(guān)的資料,可以把一些黑客常用的掃描端口全部DROP掉,多多少少提高一點服務(wù)器的安全性。

          我們還可以把規(guī)則限制到只允許某個IP:

          iptables -A INPUT -s 192.168.0.18 -p tcp --dport 22 -j ACCEPT

          這表示只允許192.168.0.18的機器進(jìn)行SSH連接。

          如果要允許一個IP段,可以使用下面的寫法:

          iptables -A INPUT -s 192.168.0.1/255 -p tcp --dport 22 -j ACCEPT

          這表示允許192.168.0.1/255IP段的機器進(jìn)行連接。
          但是,注意我們前面已經(jīng)添加一條規(guī)則來允許所有IP連接22端口,需要把這條規(guī)則刪除掉。

          iptables -D INPUT -p tcp --dport 22 -j ACCEPT

          對于FORWARD規(guī)則,因為預(yù)設(shè)的是DROP,所以要添加ACCEPT規(guī)則。
          開啟轉(zhuǎn)發(fā)功能

          iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
          iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

          丟棄壞的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

          Iptables的保存和調(diào)用

          現(xiàn)在該提一下保存的問題了。
          我們用命令來添加的設(shè)置,都不會自動保存,一旦退出,設(shè)置都將不存在了,需要手動去保存一下。

          iptables-save >/etc/iptables.up.rules

          把剛才設(shè)置的規(guī)則保存到指定的地方,文件名可以自定義。

          調(diào)用Iptables設(shè)置

          iptables-restore >/etc/iptables.up.rules

          由于每次開機或重啟后都需要去調(diào)用一次,我們把它設(shè)置自動的,執(zhí)行

          sudo gedit /etc/network/interfaces

          auto ath0
               iface ath0 inet dhcp

          后面,加上

          pre-up iptables-restore >/etc/iptables.up.rules //開機時自動調(diào)用已經(jīng)存在的Iptables設(shè)置
          post-down iptables-save >/etc/iptables.up.rule  //關(guān)機時自動保存當(dāng)前的Iptables設(shè)置

          =====================================================================================================

          防范CC攻擊

          當(dāng)apache站點受到嚴(yán)重的cc攻擊,我們可以用iptables來防止web服務(wù)器被CC攻擊,實現(xiàn)自動屏蔽IP的功能。

          1.系統(tǒng)要求

          (1)LINUX 內(nèi)核版本:2.6.9-42ELsmp或2.6.9-55ELsmp(其它內(nèi)核版本需要重新編譯內(nèi)核,比較麻煩,但是也是可以實現(xiàn)的)。

          (2)iptables版本:1.3.7

          2. 安裝

          安裝iptables1.3.7和系統(tǒng)內(nèi)核版本對應(yīng)的內(nèi)核模塊kernel-smp-modules-connlimit

          3. 配置相應(yīng)的iptables規(guī)則

          示例如下:

          (1)控制單個IP的最大并發(fā)連接數(shù)

          iptables -I INPUT -p tcp --dport 80 -m connlimit  --connlimit-above 50 -j REJECT #允許單個IP的最大連接數(shù)為 30

             iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP #限制與80端口連接的IP最大連接數(shù)為10,可自定義修改。

          #默認(rèn)iptables模塊不包含connlimit,需要自己單獨編譯加載,請參考該地址
          http://sookk8.blog.51cto.com/455855/280372不編譯內(nèi)核加載connlimit模塊


          (2)控制單個IP在一定的時間(比如60秒)內(nèi)允許新建立的連接數(shù)

          iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
          #單個IP在60秒內(nèi)只允許最多新建30個連接


          posted on 2015-10-31 15:51 Alpha 閱讀(2577) 評論(0)  編輯  收藏 所屬分類: Linux Nginx
          主站蜘蛛池模板: 兰溪市| 庆阳市| 延寿县| 肥城市| 卢氏县| 佛坪县| 蒙城县| 乐东| 青州市| 巴东县| 雷山县| 昌黎县| 南郑县| 额敏县| 芒康县| 洞口县| 临安市| 延庆县| 德昌县| 响水县| 明星| 阳西县| 抚宁县| 罗定市| 密云县| 濮阳县| 吐鲁番市| 邛崃市| 涞水县| 石台县| 遂平县| 蒲城县| 深州市| 沾化县| 锦屏县| 石棉县| 皋兰县| 文山县| 广元市| 遵义县| 凤凰县|