天天看點

iptables與SELinux解析

防火牆,顧名思義,是用于防止一些可能造成的威脅對作業系統造成破壞,為了保護系統而采取的一種防護措施,将威脅擋在防火牆外;iptables,防火牆指令,用于編寫netfilter規則,将其送入核心空間,當封包從内或外傳輸時,對核心空間的規則進行比對,由上到下,比對到的第一條規則後,就不再比對下面的規則,防火牆的這種比對方式稱之為首項比對;防火牆有幾種分類方式一種是軟硬體防火牆,對應用程式和底層硬體的防護;一種是主機防火牆,以及網絡防火牆;主機防火牆是一種局限于目前主機的防火牆,主要針對于該主機的封包的輸入輸出,對其進行比對篩選;網絡防火牆則是通過外網,伺服器,内網三者或者更多之間所建構的一種防火牆機制,比較來說,網絡防火牆在企業工作中可能更加常用;

  netfilter:位于Linux核心中的防火牆元件;防火功能實作的主體;

  iptables:專門為netfilter編寫規則的使用者空間中的應用程式工具;

  在iptables指令中有五種chain(鍊),INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTINGG

  INPUT:目前主機的從使用者空間到達核心空間的入口;

  OUTPUT:目前主機從核心空間到使用者空間的入口;

  FORWARD:當金星主機轉換,即目前主機作為另外兩台主機的中轉時使用,通常可用于設定區域網路與外網之間的伺服器,對内外網設定域的轉換,通過中轉FORWARD設定内網的防火牆;

  PREROUTING:是目的位址轉換(DNAT),要把别人的公網IP換成你們内部的IP,才讓通路到你們内部受防火牆保護的伺服器。

  POSTROUTING:是源位址轉換(SNAT),要把你内部網絡上受防火牆保護的ip位址轉換成你本地的公網位址才能讓它們上網。

  iptables中有四個表,分别是:filter,mangle,nat,raw

  filter:過濾防火牆,常用于本機的防火牆設定,允許那個端口通路或者允許哪些主機通路等;

  mangle:拆解封包并對封裝格式進行修改,然後再重新封裝封包;

  nat:進行網絡位址轉換;SNAT,DNAT,還可以進行端口的轉換;

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

  各表的優先級次序(從高到低):

    raw --> mangle --> nat --> filter

  各表包含哪些鍊:

   raw:PREROUTING,OUTPUT

   mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

   nat:PREROUTING,OUTPUT,POSTROUTING,INPUT

   filter:INPUT,FORWARD,OUTPUT

  資料封包的流向:

    流入本機通路某程序的資料封包:

      PREROUTING --> INPUT

    由本機某程序發送出去的資料封包:

      PREROUTING --> OUTPUT --> POSTROUTING

    經由本機轉發的資料封包:

      PREROUTING --> FORWARD --> POSTROUTING

  iptables基本指令:書寫需要比對的規則,當規則一旦被比對就不會再往下尋找比對的規則;規則書寫主要是兩個部分,1.比對條件,2.動作;

  比對條件有基本比對以及擴充比對兩種;

   基本比對即對IP位址以及端口号,協定類型等比對;

   擴充比對則是在對基本比對的基礎上擴充,對功能子產品進行比對;

  動作:常用的動作有ACCEPT接受,DROP拒絕,REJECT拒絕(并通知對方我拒絕了你)

  規則的通用編寫格式:

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

  -t table:指定使用哪個表,需要對自己所要書寫的規則有一個明确的定位,确定使用那種表上的哪條鍊;

  COMMAND:iptables的操作選項;

   鍊操作選項:

     -P:設定預設政策,即設定一個鍊中的規則全部不比對後的操作,通常不采用設定預設鍊的方      式,而是在鍊的尾部插入一條DROP規則;

     -F:清空鍊上的規則,若不指定具體那個表的那條鍊,則清空filter表的所有規則;

     -X:删除自定義鍊,删除的自定義鍊引用次數必須為0才能删除成功;

     -N:建立自定義鍊;

   示例:

     #iptables -P INPUT DROP

     #iptables -F

     #iptables -N wjq

     #iptables -X wjq

   規則的操作選項:

     -A:在鍊的尾部插入一條規則;

     -I #:指定插入位置将規則插入到#處;若不指定預設插入到第一行;

     -D #:删除規則;

     -R:修改鍊的規則,需要指定修改鍊的位置;

     #iptables -A INPUT -s 172.16.72.2 -d 172.16.72.4 -j ACCEPT

     #iptables -I INPUT -s 172.16.72.2 -d 172.16.72.4 -j ACCEPT

     #iptables -D INPUT 1

     #iptables -R INPUT 2 -s 172.16.72.2 

     修改filter表中的INPUT鍊,将其修改為外部主機無法ping通該主機

     講規則插入到filter表中的INPUT鍊上,使外部主機能夠ping通該網段主機

  檢視鍊的操作選項:

     -L:列出指定表指定列上的所有規則;

     -n:以數字化的形式顯示;

     -v:顯示詳細資訊;

     #iptables -nvL

  基本比對條件:

    [!] -s 源IP:檢查傳輸過來的封包的源IP位址是否比對指定的規則的源IP;

    [!] -d 目的IP:檢查傳輸過來的封包的目的IP位址是否比對指定的規則的目的IP;

     設定源主機172.16.0.0/16網段的主機到目标主機172.16.72.6的規則

    [!] -p 協定:協定如tcp,udp,icmp等; 

         tcp:

           --dport port:指定tcp的源端口,檢視傳輸封包的源端口是否比對;

           --sport port:指定tcp的目的端口,檢視傳輸封包的目的端口是否比對;

           --tcp-flag mask comp:

                     mask:要檢查的标志位,如URG,ACK,PSH,RST,SYN,FIN;

                     comp:标志位置1的清單,不在該清單中的标志位為0;

         示例:

          所有主機都可以通路目标主機172.16.72.6的22号端口

          目前主機可以通路自身的web站點中的内容

         udp:

           --dport port:指定udp的源端口,檢視傳輸封包的源端口是否比對;

           --sport port:指定udp的目的端口,檢視傳輸封包的目的端口是否比對;

         icmp:

           --icmp-type:

                8:request,外部主機ping該主機時的請求;

                0:reply,本主機ping外部主機是的回複;

          設定阻止外部主機ping通目前主機  

    [!] -i:檢查資料封包入站的接口是否對應此條件中指定的接口;

    [!] -o:檢查資料封包出站的接口是否對應此條件中指定的接口;

  擴充比對條件:

   -m multiport:多端口比對,可以一次比對多個端口,最多達到15個端口;

     [!] --dports port[,port|,port:port]

     [!]--sports port[,port|,port:port]

   示例:對多端口設定規則

   -m iprange:設定源IP或目的IP的指定範圍;

     [!] --src-range:源IP的指定範圍;

       如:172.16.72.0-172.16.72.10

     [!]--dst-range:目的IP的指定範圍;

   示例:設定由源位址172.16.72.0至172.16.72.10的主機可以通路本主機的22,80,445端口

   -m time:設定封包通路的時間,可以設定在幾點到幾點之間 是否能夠通路,星期幾,幾月這些時    間都可以通過擴充子產品設定;

      --timestart HH:MM:SS:開始時間如9點,09:00:00;

      --timestop HH:MM:SS:結束時間;

     [!] --weekdays [1,2,3,4,5,6,7]:設定星期;

     [!] --monthdays:設定月份;

   示例:設定不能在周日通路22,80端口的規則

   -m string:設定關鍵字比對的擴充子產品,當比對某關鍵字時允許或拒絕通路,通常用于web站點訪    問;

     --string "PATTERN":比對的關鍵字;

     --algo {bm|kmp}:比對關鍵字的算法;

   示例:設定web站點關鍵字過濾,當遇到關鍵字admin,則拒絕通路

   -m connlimit:根據每個用戶端IP做并發連接配接數的比對;,可以對ssh,ftp,telnet等進行連接配接數    的設定;

     --connlimit-upto n:連接配接數數量小于等于n,此時規則應設定為允許;

     --connlimit-above n:連接配接數數量大于n,此時規則應設定為拒絕;

   示例:當23端口的telnet遠端連接配接大于5時,拒絕通路

   -m limit:設定封包通路速率;幾分鐘通路幾次等;

     --limit #[second|minute|hour|day]:設定通路頻率;

     --limit-burst #:設定初始通路數量,當這個通路數量執行完後,才開始進行通路頻率的匹      配;

   示例:限制本地主機的web伺服器在周一不允許通路;新請求的速率不能超過100個每秒

   -m state:設定連接配接追蹤機制;

     --state [ESTABLISHED|NEW|RELATED|INVALID|UNTRACKED]:

       ESTABLISHED:已經建立起來的連接配接;

       NEW:沒有建立起來的連接配接

       RELATED:與其他已建立的連接配接相關聯的狀态;關聯态或衍生态;

       INVALID:無法識别的狀态;無效狀态;

       UNTRACKED:未追蹤的連接配接;

     state擴充幾乎可以涵蓋之前所有講過的比對規則,可以講過這些規則濃縮;

     通常state規則可以設定ESTABLISHED在第一條規則處,比對那些已經建立起來的連接配接,再在規     則後面建立一個個狀态為NEW的規則即可;

     在使用state擴充配置ftp時,由于ftp是将端口随機衍生出兩一個端口來作為主機通路端口,所     以需要RELATED的擴充,除此以外還需要對應的追蹤子產品nf_conntrack_ftp

     可以使用modprobe指令裝載,也可以直接在配置檔案/etc/sysconfig/iptables-config檔案中     寫入IPTABLES_MODULES="nf_conntrack_ftp"

     示例:

       設定通用的ESTABLISHED狀态,可以對所有已建立連接配接的端口協定等允許通路

       設定通路172.16.72.6web站點的第一次通路,即未連接配接的通路為允許,這樣下次連接配接時的狀       态即為ESTABLISHED

  網絡防火牆:

    filter表中的FORWARD鍊規則設定;

    nat表中的相關鍊的規則設定;

    自定義鍊;

  FORWARD鍊:

    實作内網與外網之間的轉發時使用中間伺服器的FORWARD鍊進行防火牆過濾轉發功能;

  在FORWARD鍊上定義規則,要注意以下幾個問題:

     1.對于經由FORWARD鍊的資料,在做通路控制時要注意資料的流動方向;即源位址和目的位址,      源端口和目的端口;

     2.如果可以啟用連接配接追蹤機制,建議将雙方向的狀态為

     ESTABLISHED的資料直接放行,且将此規則放置于鍊的第一條;

     3.必須在鍊的最後設定預設拒絕所有資料的規則,可以設定預設政策,也可以設定拒絕規則;

  iptables網絡防火牆練習:

   1.給一台Linux安裝三塊網卡,提供三個網絡接口;

   2.内網中使用者主機所在的網段為172.18.0.0/16,所有伺服器所在的網段為172.16.0.0/16,外      部網絡為192.168.100.0/24網段;伺服器所在網絡中,可以使用一台伺服器實作多個服務,也可以    使用多台伺服器分别實作各個服務,可自行根據你的計算機的性能來決定;并且為内部的所有主機    和伺服器指定正确的網關;外部主機無需指定網關;

   3.要求:

    1) 内網使用者可以通路所有伺服器提供的所有服務(samba,ftp,dns,web(http)),但隻有           172.18.18.18主機能夠使用ssh和telnet協定通路所有内網伺服器;

    2) 内網使用者可以通路外部網絡;

    3) 内網伺服器不得主動通路任何其他網絡中的任何主機,隻能被通路;

    4) 外網使用者隻能通路内網伺服器的web服務;

    三台主機,内網主機1,内網主機2,内網伺服器,外網主機;

    内網主機1:172.18.0.2  

    内網主機2:172.18.18.18

    内網伺服器:

       三個網卡分别是

         伺服器網卡172.16.72.6

         内網網卡:172.18.0.1

         外網網卡:192.168.100.1

         配置指令同上

    外網主機:

         外網網卡:192.168.100.2

    配置路由:

      在内網主機

      [root@localhost ~]# ip route add default via  172.18.0.1

      在外網主機

      [root@localhost ~]# ip route add default via  192.168.100.1

      設定内網伺服器路由轉發功能

      [root@localhost ~]# sysctl -w net.ipv4.ip_forward=1

      [root@localhost ~]# sysctl -p

      至此内網,内網伺服器,外網之間可正常通信;可以在内網伺服器上filter表上的FORWARD鍊     上進行相關配置;如

      先設定内網伺服器FORWARD的拒絕通路,在設定其可以通過該防火牆的相關服務資訊;

      這樣内外網之間的通信就需要我們設定防火牆的相關規則才可通信;4

      設定狀态state在連接配接已建立,及相關衍生态的規則,一般這類規則都放在第一條,根據其使     用頻率而定;

      ①内網使用者可以通路外網

      設定内網主機能夠ping通外網主機,而外網主機無法ping通内網主機,在内網伺服器的         FORWARD鍊上;

      内網ping外網:

      外網ping内網:

      通過類似的規則可以使内網使用者通路外網,而外網無法通路内網,如添加内網通過内網伺服器     通路外網20,21,22,80端口的服務

      [root@localhost ~]# iptables -I FORWARD 4 -s 172.18.0.0/16 -d 192.168.100.0/24 -m        state --state NEW -j ACCEPT 

      ②内網使用者可以通路所有伺服器提供的所有服務(samba,ftp,dns,web(http)),但隻有         172.18.18.18主機能夠使用ssh和telnet協定通路所有内網伺服器;

     [root@localhost ~]# iptables -I INPUT -s 172.18.0.0/16 -m state --state              ESTABLISHED,RELATED -j ACCEPT

     [root@localhost ~]# iptables -I INPUT 2 -s 172.18.0.0/16  -p tcp -m multiport --      dports 20,21,22,80,139,445  -m state --state NEW -j ACCEPT

     [root@localhost ~]# iptables -I INPUT 3 -s 172.18.0.0/16  -p udp -m multiport --      dports 137,138  -m state --state NEW -j ACCEPT

     [root@localhost ~]# iptables -A INPUT -j DROP

     [root@localhost ~]# modprobe nf_conntrack_ftp

      内網主機通路内網伺服器的httpd:

      内網主機通路内網伺服器的ftp:

      内網主機通路内網伺服器的samba:

      内網主機通路内網伺服器的DNS:

      在内網伺服器中配置主DNS伺服器區域資料:

      /var/named/qhdlink.com.zone

     chown named:named /var/named/qhdlink.com.zone修改權限

     定義區域:

     /etc/named.rfc1912.zones

     修改主配置檔案,使内網主機擁有通路内網主伺服器中DNS的權限

     修改allow-query{}

      /etc/named.conf 将listen-on改為any,監聽内網伺服器的全部IP位址

      将aliow-query也改為any,或将其改為172.18.0.0/16也可;

    直接修改之前添加的udp端口,添上關于DNS的53端口 

    [root@localhost ~]# iptables -R INPUT 3 -s 172.18.0.0/16 -p udp -m multiport --dports     53,137,138 -m state --state NEW -j ACCEPT

    内網主機通路内網伺服器DNS:

    172.18.18.18主機能夠使用ssh和telnet協定通路所有内網伺服器

     對内網主機2設定靜态路由指向伺服器對于内網的IP 172.18.0.1

     設定内網伺服器防護牆;

     [root@localhost ~]# iptables -R INPUT 6 -p tcp -m multiport --dports 22,23 -s          172.18.18.18 -m state --state NEW -j ACCEPT 

     通路結果:

     ③内網伺服器不得主動通路任何其他網絡中的任何主機,隻能被通路;

     [root@localhost ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

     [root@localhost ~]# iptables -A OUTPUT -j DROP

     ④外網使用者隻能通路内網伺服器的web服務;

     [root@localhost ~]# iptables -I INPUT 2 -s 192.168.100.0/24 -m state --state          ESTABLISHED -j ACCEPT

     [root@localhost ~]# iptables -I INPUT 3 -s 192.168.100.0/24 -p tcp --dport 80 -m        state --state NEW -j ACCEPT

     外網通路内網伺服器web:

   内網伺服器整體防火牆配置:

    filter INPUT鍊:

   filter FORWARD鍊:

   filter OUTPUT鍊:

  nat表:

   iptables防火牆中的nat表主要适用于進行内網與外網通信的源位址轉換SNAT以及目的位址轉換     DNAT的操作;

   在對nat表配置相關規則時,需要明确講規則插入到哪個鍊中;

   CentOS 7中的nat表有四條鍊:POSTROUTING,PREROUTING,INPUT,OUTPUT

   CentOS 6中nat表有三條鍊:PREROUTING,POSTROUTING,OUTPUT

   SNAT:源位址轉換,将内網源位址轉換為可以在外網中使用的IP位址,通常用于一個區域網路對外部     表現為一個IP位址;在進行源位址轉換時需要先查找路由表看是否有對應的路由條目,若無則無     法轉發,是以SNAT的實作需要先查找路由表,在POSTROUTING鍊上編寫規則;

   注意:在内網伺服器上進行源位址轉換時,轉換的位址,必須在該主機上事先存在;

   在内網伺服器上添加SNAT轉換的IP位址:172.16.72.50/16

    編寫SNAT轉換規則:當源主機為172.18.0.0/16網段的IP時,轉換IP位址為172.16.72.50

    在内網主機172.18.18.18處ping 192.168.100.2,再在内網伺服器的對應192.168.100.1的外網接    口的裝置處抓包;

    由上圖可見,當172.18.18.18主機ping 192.168.100.2時,經過内網伺服器,并在内網伺服器進    行IP位址的轉換,轉換為172.16.72.50;

   MASQUERADE:

      針對于動态IP位址進行的源位址僞裝,自動選取核心中存在的IP位址作為僞裝;

    --to-ports port[-port]

    抓包檢視:

     目前内網伺服器的IP位址有:172.16.72.6,172.10.0.1,192.168.100.1

     由圖可見,兩組資料,源位址轉換的IP位址都不同;

   DNAT:目的位址轉換,将外網的公告位址轉換為能通路内網的IP位址;在路由之前就完成位址轉     換,将此類規則配置在PREROUTING鍊上;

    設定外網ping在外網活動的IP172.16.72.50,在内網伺服器處,172.16.72.50被轉換為内網的源    位址172.18.18.18.

    在外網主機192.168.10.2處ping 172.16.72.50,再在内網伺服器的對應172.18.18.0.0/16的外網    接口的裝置處抓包;

    由上圖可見,外網主機ping 172.16.72.50後,172.16.72.50被轉換為172.18.18.18;

   iptables規則儲存和讀取:iptables規則對于系統的重要性不言而喻,而當我們做出了一些錯誤的    規則部署時,我們需要一個可以将以前規則儲存起來的功能,這樣就可以有效的保障防火牆的運    行,不至于産生大的危險;

   iptables-save:規則儲存指令

    使用方法:采用輸出重定向的方式

     iptables-save > /PATH/TP/FILE

   iptables-restore:規則讀取指令

    使用方法:采用輸入重定向的方式

     iptables-restore < /PATH/TO/FILE

    CentOS 7 與CentOS 6的指令使用一緻

    注意:可以使用crontab的任務排程的形式,在指定時間内恢複一次防火牆的規則,這樣,即便是    遭到大的破環也可以恢複系統的正常運作;

   也可使用如下方式:

    service iptables save

      預設會将目前生效的所有規則直接送往/etc/sysconfig/iptables檔案中儲存

    service iptables restore|restart

      直接将/etc/sysconfig/iptables中儲存的規則載入;

  SELinux:使美國安全局NSA對于強制通路控制的實作,是最傑出的本機安全性授權;

  SELinux安全系統是工作于核心當中,在開發出來時,因為windows系統的核心不是開源的,屬于企業的機密,是以美國安全局就無法基于windows使用SELinux,而Linux從開發之初就是開源,美國安全局基于Linux開發的這款安全系統,是以也稱之為SELinux;

  SELinux的安全級别有四種A,B,C,D,A級别為最高,但目前很少有企業對系統的防護達到了A級别,通常達到B級别已經是很完善的防護系統了;A級别需要的是全程監控,即硬體生産的時候監控,運送的時候監控,組裝的時候監控,即讓這套防護系統的完成都處于監控下,一絲不苟地完成;

  基于SELinux的通路控制機制有兩種,一種是自主通路控制機制DAC,即針對某個特定的使用者群組進行性的權限設定;一種是強制通路控制機制MAC,這種機制不是針對于使用者去通路,而是針對于發起操作的程序與程序所需要操作的檔案之間的類型是否相同,相同則可以通路操作,不同則不允許,這就要引出一個新的概念Sandbox沙箱;

  Sandbox沙箱會根據所要操作的檔案的類型和沙箱中的程序的類型比對才可以載入到沙箱,在進行這些操作時會檢視政策庫,政策庫中是一條條的規則,是程序能不能操作檔案的關鍵,每一次操作檔案的時候都會去檢視政策庫中的規則,若可比對,且可以載入到沙箱,則可以操作;為了加強規則的比對效率,需要講規則編譯成二進制内容;

  SELinux為每個檔案都設定了安全标簽,安全用來标記檔案,用來與程序之間操作時比對其類型是否比對,安全标簽有四個字段,其中最重中的就是檔案類型字段;

  user-identify:role:domain|type:sencitivity

  user-identify:SELinux使用者身份辨別;

  role:角色;

  domain|type:域(程序),類型(檔案);程序的域和檔案的類型能夠比對的上才能通路;

  sencitivity:敏感度,如s0;

  ls --context:顯示目前路徑下的帶有安全标簽的檔案詳細資訊;

  ps auxZ:列出目前程序,包括程序對應的域;

  SELinux幾種工作模式:

    enforcing - SELinux security policy is enforced.

    permissive - SELinux prints warnings instead of enforcing.

    disabled - No SELinux policy is loaded.

    enforcing:強制狀态,表示SELinux已運作,并且按照程序與檔案之間的類型進行限制;

    permissive:寬容狀态,SELinux已運作,但是對于程序與檔案不比對的情況隻會發出警告而沒有             實際行動;

    disabled:關閉SELinux狀态;

    getenforce:檢視目前SELinux狀态;

    setenforce {0|1}:設定目前SELinux狀态,0為permissive狀态,1為enforcing狀态;

    由圖可知,我們平常使用httpd是将SELinux關閉通路,我們所建立的DocumentRoot的檔案類型為   default_t,而正常的httpd程序所對應的檔案的類型為httpd_sys_script_t;但這種情況下我們能訪   問就是因為我們開啟了permissive狀态;而當我們開啟了SELinux的enforcing時就無法正常通路;

    想要在SELinux開啟的狀态下通路httpd的web站點,隻需要修改web站點的檔案屬性即可,這個時   候就需要chcon指令;

    chcon [option] context_type FILEPATH

     -t context_type:修改的屬性;

     -R:遞歸修改;

     --reference=filepath:按指定的檔案類型修改;

    可以使用restorecon指令還原某檔案或目錄的安全上下文為預設值;

     restorecon

        -R:遞歸;

   規則庫:SELinux中的政策庫都是以二進制代碼的形式表示,想要對其操作,隻能對布爾型的規則  庫進行操作,對規則庫進行修改,就可以在SELinux為enforcing狀态下實作我們想要實作的一些服  務,如ftp,samba,nfs等;

   檢視規則庫:

     getsebool -a:顯示所有已經生效的布爾型規則;

     setsebool -P:寫入政策檔案,使更改永久生效;

     想要使規則開啟隻需将規則置1即可;

   開啟ftp服務:

   将前兩個規則開啟:

  開啟nfs服務:

       正常啟動即可

   開啟samba服務:

     samba配置資訊

     啟動smb,nmb

     service smb start 

     service nmb start

     在用戶端主機挂載共享目錄:

     通路挂載後的共享目錄:

     在samba主機配置SELinux的讀寫布爾規則:

     再次通路:

本文轉自 wujunqi1996 51CTO部落格,原文連結:http://blog.51cto.com/12480612/1968980

繼續閱讀