iptables

一 iptables的介紹

           Redhat6 默認的防火牆是iptableshtml

iptables防火牆的組成 :
            防火牆的組成:4張表和5條鏈
                   表是iptables防火牆服務功能的分類:
                                      raw :對ip包作狀態跟蹤 
                                      mangle :給到達防火牆的ip數據包打標籤
                                      nat :網絡地址,端口轉換
                                      filter :包過濾表,過濾符合條件的表

                    鏈是匹配IP數據包傳輸的方向:
                                      INPUT 進入防火牆主機的包
                                      OUTPUT 從防火牆主機出去的包
                                      FORWARD 匹配從防火牆主機通過的包
                                      POSTROUTING 路由選路發生以後處理,數據包到達防火牆後,已進行選路以後,網絡

                                                               防火牆再告訴這個數據包如何走
                                      PREROUTING 路由選路發生以前處理,數據包到達防火牆後尚未進行選路時,ssh

                                                               防火牆再告訴這個數據包如何走。tcp

                   表中所使用的鏈:post

                                      raw :      output,prerouting
                                      mangle :input,output,forward,postrouting,prerouting
                                      nat :       input,output,postrouting,prerouting
                                      filter :     input output forward測試

 

二   iptables的安裝與啓動

[root@hostB ~]# yum -y install iptables-services [root@hostB ~]# systemctl start iptables [root@hostB ~]# systemctl enable  iptables

三  語法格式與參數         

 

iptables基本用法
            管理程序位置:/sbin/iptables
            指令:
      iptables [-t 表名] 選項 [鏈名] [條件] [-j 目標操做]
      中括號部分能夠省略
         表名:raw,mangle,nat,filter,若是不指令默認是filter
         鏈名:INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING若是不指定鏈默認爲對應表的全部鏈

         選項:
           -A 在鏈的末尾追加一條規則;
           -L 列出全部的規則條目
                   -I 在鏈的開頭插入一條
             -D 刪除鏈內指定序號的規則
           -F 清空全部的規則
           -P 爲指定的鏈設置默認,只能是ACCEPT或者DROP
              -n 以數字顯示地址,端口spa

         目標操做:
            ACCEPT: 放行
            DROP: 直接丟棄, 不給出任何迴應
            REJECT: 拒絕經過,必要時給出提示
            LOG: 記錄日誌,而後傳給下一條規日誌

 防火牆規則的查看code

[root@HostB ~]# iptables -L #查看filter表中全部規則 Chain INPUT (policy ACCEPT) #INPUT鏈,默認規則是ACCEPT。數據包通過 #防火牆時,若是與INPUT鏈中 策略不匹配時, #實施規則爲ACCEPT 源地址 目標地址 匹配條件 target prot opt source estination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp --  anywhere        anywhere     state NEW tcp dpt:ssh REJECT all --  anywhere        anywhere     reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) #FORWARD鏈 target prot opt source destination REJECT all --  anywhere       anywhere      reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) #OUTPUT鏈 target prot opt source destination [root@HostB ~]# ------------------------------------------------------------------------------ [root@HostB ~]# iptables -nL #以數字顯示地址和端口,查看filter Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all --  0.0.0.0/0      0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp --  0.0.0.0/0      0.0.0.0/0 ACCEPT all --  0.0.0.0/0      0.0.0.0/0 ACCEPT tcp --  0.0.0.0/0      0.0.0.0/0     state NEW tcp dpt:22 REJECT all --  0.0.0.0/0      0.0.0.0/0     reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all --  0.0.0.0/0      0.0.0.0/0     reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@HostB ~]# ---------------------------------------------------------------------------------- [root@HostB ~]# iptables -t raw -nL #查看raw表的默認規則 Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@HostB ~]# ---------------------------------------------------------------------------------- [root@HostB ~]# iptables -t mangle -nL #查看mangle表的默認規則 Chain PREROUTING (policy ACCEPT) target prot opt source destination 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 Chain POSTROUTING (policy ACCEPT) target prot opt source destination [root@HostB ~]# ---------------------------------------------------------------------------------- [root@HostB ~]# [root@HostB ~]# iptables -t nat  -nL #查看nat表的默認規則 Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination [root@HostB ~]# #經過以上四張表的查看,只有filter表中有 #規則其它表中都是空的

 

 

防火牆規則的刪除:htm

                                          #查看規則時,用--line-numbers顯示行號 [root@HostB ~]# iptables -t filter -nL  --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1    ACCEPT     all  --  0.0.0.0/0       0.0.0.0/0 state RELATED,ESTABLISHED 2    ACCEPT     icmp --  0.0.0.0/0       0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0       0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0       0.0.0.0/0   state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0       0.0.0.0/0   reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1    REJECT     all  --  0.0.0.0/0       0.0.0.0/0   reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination [root@HostB ~]# #刪除filter表中INPUT鏈的第5條規則 [root@HostB ~]# iptables -t filter -D INPUT 5 #刪除filter表中INPUT鏈的全部規則 [root@HostB ~]# iptables -t filter -F INPUT [root@HostB ~]# iptables -t filter -F #刪除filter表中全部鏈的全部規則 [root@HostB ~]# iptables -t raw -F #刪除其它表中的全部規則 [root@HostB ~]# iptables -t mangle   -F [root@HostB ~]# iptables -t nat  -F #經過以上指令所有清空規則後當即生效,重 #啓iptables服務以後,會自動恢復。 #重啓iptables時會讀取/etc/sysconfig/iptables #文件中保存的策略,因此經過指令清空防火牆規 #則後要保存到文件中,使它永久生效。 [root@HostB ~]# iptables-save > /etc/sysconfig/iptables    

 

四  自定義防火防火牆規則

                        主機型防火牆: 寫防火牆規則保護本機
                                       使用到的表和鏈:filter表中的INPUT鏈
 
                         網絡理防火牆:寫防火牆規則限制數據包的通過
                                         使用到的表和鏈:filter表中的FORWARD鏈

       條件(規則):
                條件的匹配順序:
            順序比對,匹配即中止(LOG除外)
            若無任何匹配,則按該鏈的默認策略處理
         匹配條件:
            通用匹配:
                協議匹配  -p 協議名
                地址匹配  -s 源地址 -d 目標地址
                接口匹配  -i 收數據的網卡
            隱含匹配:
                端口匹配 --sport 源端口 --dport目標端口
                ICMP類型匹配 --icmp-type ICMP類型:echo-reply

案例1: 在hostB上配置防火牆規則,只容許其它主機ssh鏈接同時拒絕其它鏈接 #在filter表的INPUT中添加一條規則容許tcp協 #議且目標端口是22的數據經過。 [root@HostB ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT #把INPUT鏈的默認規則設置爲DROP [root@HostB ~]# iptables -t filter -P INPUT DROP [root@HostB ~]# iptables -t filter -nL INPUT --line-numbers Chain INPUT (policy DROP) num target prot opt source destination 1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 [root@HostB ~]# 案例2: 在hostB主機上安裝httpd服務,同時容許192.168.4.0網段的主機訪問httpd服務。 同時要求新添加的指令插入到現有規則的第1行 #yum源若是是ftp的形式,須要先關閉iptables [root@HostB ~]# yum -y install httpd [root@HostB ~]# systemctl start httpd [root@HostB ~]# echo "HostB" >/var/www/html/test.html #在INPUT鏈中插入一條規則容許192.168.4.0網段 #的數據包訪問本機的80端口 #INPUT後面不加數字表示插入到第1行,若是要插 #入到第3行後面,那麼INPUT後面加3 [root@HostB ~]#iptables -t filter -I INPUT -p tcp --dport 80 -s 192.168.4.0/24 -j ACCEPT [root@HostB ~]#iptables -t filter -nL INPUT --line-numbers Chain INPUT (policy DROP) num target prot opt source destination 1    ACCEPT     tcp  --  192.168.4.0/24       0.0.0.0/0            tcp dpt:80
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 [root@HostB ~]# [root@HostB ~]# iptables-save >/etc/sysconfig/iptables 案例3: 在hostB主機上開啓icmp協議,容許全部主機Ping [root@HostB ~]# iptables -t filter  -A INPUT -p icmp -j ACCEPT #查看規則,新規則默認插入到最後 [root@HostB ~]# iptables -t filter -nL INPUT Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp --  192.168.4.0/24       0.0.0.0/0            tcp dpt:80 ACCEPT tcp --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ACCEPT icmp --  0.0.0.0/0            0.0.0.0/0 [root@HostB ~]# 容許hostB主機ping其它主機,不容許其它主機ping hostB [root@HostB ~]# #刪除第3條規則, [root@HostB ~]# iptables -t filter -D INPUT 3 #在filter表中添加規則,容許ping的回 #包進入即放行icmp協議的echo replay包 [root@HostB ~]# iptables -t filter -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT [root@HostB ~]# [root@HostB ~]# iptables -t filter -nL Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp --  192.168.4.0/24       0.0.0.0/0            tcp dpt:80 ACCEPT tcp --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ACCEPT icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@HostB ~]# #在INPUT鏈中已容許ping的回包進入 #對於ping的請求包OUTPUT鏈的默認規則是ACCEPT #因此此時hostB主機已能夠ping通hostA,hostC而 #hostA,hostC卻ping不通hostB

 

        網絡型防火牆:
              寫防火牆規則限制數據包的通過 (filter -->FORWARD)

              拓撲結構:

              外網             防火牆                              內網
              hostA --------------------------> HostB ---------------------------> HostC
                                                  eth0: 192.168.4.5/24          eth0:192.168.4.51/24
                                                  gw:指向HostB的eth0          eth1:192.168.2.51/24           eth1:192.168.2.52/24
                                                                                                                                           gw:指向HostB的eth1

環境準備 #清除HostB上原有的配置 [root@hostB ~]# iptables -t filter -P INPUT ACCEPT [root@hostB ~]# iptables -t filter -F [root@hostB ~]# iptables-save > /etc/sysconfig/iptables #查看內核路由轉發是否開啓 [root@hostB ~]# sysctl -a | grep -i net.ipv4.ip_forward #開啓方法 [root@hostB ~]# echo 1 >/proc/sys/net/ipv4/ip_forward [root@hostB ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf [root@hostB ~]# sysctl -p net.ipv4.ip_forward = 1 #在主機C上配網關 #添加網關指令以前須要先關閉Network manager #刪除網關: #route del default gw 192.168.2.51 [root@hostC ~]# route add default gw 192.168.2.51 [root@hostC ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0         192.168.2.51    0.0.0.0         UG    0      0        0 eth1 192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 eth1 [root@hostC ~]# #在主機A上配網關 [root@hostA ~]# route add default gw 192.168.4.51 #開啓http服務供測試使用 [root@hostA ~]# rpm  -q httpd || yum -y install httpd [root@hostA ~]# systemctl start httpd [root@hostA ~]# setenforce 0 測試: 在A主機上ping C主機,在B主機上抓包能夠看數據包的通過 [root@hostA ~]# ping 192.168.2.52 PING 192.168.2.52 (192.168.2.52) 56(84) bytes of data. 64 bytes from 192.168.2.52: icmp_seq=1 ttl=254 time=1.49 ms 64 bytes from 192.168.2.52: icmp_seq=2 ttl=254 time=0.864 ms [root@HostB ~]# tcpdump -i eth0 -p icmp #經過抓包能夠看出 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes #A主機向B主機的eh1口發送了ping的請求包 15:17:33.483515 IP 192.168.4.5 > 192.168.2.52: ICMP echo request, id 9743,seq1,length 64 #C主機向B主機的eth0發關了ping的迴應包 15:17:33.484305 IP 192.168.2.52 > 192.168.4.5: ICMP echo reply, id 9743,seq1,length 64
15:17:34.485872 IP 192.168.4.5 > 192.168.2.52: ICMP echo request, id 9743,seq2,length 64
15:17:34.486311 IP 192.168.2.52 > 192.168.4.5: ICMP echo reply, id 9743,seq2,length 64 #在B主機上對filter表的FORWARD鏈配置規則, #由於默認是ACCEPT,因此先把默認規則修改 #爲DROP而後再配置具體規則, [root@hostB ~]# iptables -t filter -P FORWARD DROP [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination [root@hostB ~]# 案例4: 主同C能夠訪問主機A的httpd服務 #在filter表的FORWARD鏈中放行目標端口是80 #的數據包和源端口是80的端口 [root@hostB ~]# iptables -t filter -A FORWARD -p tcp --dport 80 -j ACCEPT [root@hostB ~]# iptables -t filter -A FORWARD -p tcp --sport 80 -j ACCEPT [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp --  0.0.0.0/0     0.0.0.0/0    tcp dpt:80 ACCEPT tcp --  0.0.0.0/0     0.0.0.0/0    tcp spt:80 [root@hostB ~]# iptables-save > /etc/sysconfig/iptables 案例5: 在B上配置策略,容許A通ssh訪問C主機 [root@hostB ~]# iptables -t filter -A FORWARD -p tcp --dport 22 -j ACCEPT [root@hostB ~]# iptables -t filter -A FORWARD -p tcp --sport 22 -j ACCEPT [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 ACCEPT tcp --  0.0.0.0/0            0.0.0.0/0            tcp spt:80 ACCEPT tcp --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ACCEPT tcp --  0.0.0.0/0            0.0.0.0/0            tcp spt:22 [root@hostB ~]# 

 

      防禦類型及條件

               基本匹配條件
            通用匹配:
              能夠直接使用,不依賴於其餘條件或者提升

            擴展匹配:
              前提條件:
                有對應的防火牆模塊支持,安裝iptables時已自動安裝
               基本用法:
                -m 擴展模塊 --擴展條件 條件值
               擴展條件類型:
                MAC地址匹配 -m mac --mac-source MAC地址

                多端口匹配:
                   多端口匹配能夠減小防火牆規則指令條數,鏈接端口用冒號不連續的端口與逗號
                   -m multiport --sport 源端口列表
                   -m multiport --dport 目標端口列表
                IP範圍匹配   

                                                                  -m iprange --src-range IP1-IP2
                   -m iprange --dst-range IP1-IP2

 

 

案例6: 一條規則開放多個端口 [root@hostB ~]# iptables -t filter -F FORWARD [root@hostB ~]# iptables -t filter -A FORWARD -m  multiport -p tcp --dport 22,80 -j ACCEPT [root@hostB ~]# iptables -t filter -A FORWARD -m  multiport -p tcp --sport 22,80 -j ACCEPT [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp --  0.0.0.0/0     0.0.0.0/0   multiport dports 22,80 ACCEPT tcp --  0.0.0.0/0     0.0.0.0/0   multiport sports 22,80 [root@hostB ~]# 案例7: 對192.168.2.50-60這個網段的地址禁ping,但hostC修改本身的ip後仍能夠ping #先添加一條規則容許ping #再添加一條192.168.2.50-60地址被禁止ping #的規則。注意,這條規則添加時要放到第3條 #規則的上面,即具體規則放前面,模糊規則放後面 [root@hostB ~]# iptables -t filter -A FORWARD -p icmp -j ACCEPT [root@hostB ~]# iptables -t filter -I FORWARD 3 -p icmp -m iprange  --src-range 192.168.2.50-192.168.2.60 -j REJECT [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp --  0.0.0.0/0   0.0.0.0/0   multiport dports 22,80 ACCEPT tcp --  0.0.0.0/0   0.0.0.0/0   multiport sports 22,80 REJECT icmp --  0.0.0.0/0   0.0.0.0/0   source IP range 192.168.2.50-192.168.2.60 reject-with icmp-port-unreachable ACCEPT icmp --  0.0.0.0/0            0.0.0.0/0 [root@hostB ~]# 案例8: 直接對hostC的mac地址進行禁ping, 不管hostC的地址如何修改都不能ping #查看MAC地址的方法: [root@hostC ~]# ifconfig eth1 eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500 inet 192.168.2.52  netmask 255.255.255.0  broadcast 192.168.2.255 ether 52:54:00:26:67:d0  txqueuelen 1000 (Ethernet) [root@HostB ~]# arp -a                    #在hostC鄰居主機上執行arp -a也能夠看到 ? (192.168.4.5) at 52:54:00:d0:3a:fa [ether] on eth0 ? (192.168.4.254) at 52:54:00:37:78:11 [ether] on eth0 ? (192.168.2.52) at 52:54:00:26:67:d0 [ether] on eth1 #在HostB上添加規則禁止主機C的MAC [root@HostB ~]# iptables -t filter -I FORWARD 3 -p icmp -m mac --mac-source 52:54:00:26:67:d0  -j DROP [root@HostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp --  0.0.0.0/0     0.0.0.0/0         multiport dports 22,80 ACCEPT tcp --  0.0.0.0/0     0.0.0.0/0         multiport sports 22,80 DROP icmp --  0.0.0.0/0     0.0.0.0/0         MAC 52:54:00:26:67:D0 REJECT icmp --  0.0.0.0/0     0.0.0.0/0 source IP range 192.168.2.50-192.168.2.60 reject-with icmp-port-unreachable ACCEPT icmp --  0.0.0.0/0     0.0.0.0/0 [root@HostB ~]# 

 

    NAT表的使用

案例9:
        使用nat表作數據包中的原地址轉換,實現全部主機共享同一個公網ip地址上網

      拓撲結構:
      外網            防火牆          內網
      hostA --------------------------> HostB ------------------------> HostC
      eth0: 192.168.4.5/24    eth0:192.168.4.51/24
                  eth1:192.168.2.51/24    eth1:192.168.2.52/24
                              gw:指向HostB的eth1

環境準備:                       #刪除主機A上的網關,清空主機B上已有的防火牆策略 [root@hostA ~]# route  del default gw 192.168.4.51 [root@hostB ~]# iptables -t filter -P FORWARD ACCEPT [root@hostB ~]# iptables -t filter -F [root@hostB ~]# iptables-save > /etc/sysconfig/iptables #使用nat表的POSTROUTING鏈 #-s 192.168.2.0/24 -p tcp --dport 80是匹配條件 # -j SNAT 是動做 [root@hostB ~]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -p tcp --dport 80  -j SNAT --to-source 192.168.4.51 [root@hostB ~]# iptables -t nat -nL  POSTROUTING --line-numbers Chain POSTROUTING (policy ACCEPT) num target prot opt source destination 1   SNAT   tcp  -- 192.168.2.0/24  0.0.0.0/0  tcp dpt:80 to:192.168.4.51 [root@hostB ~]# iptables-save > /etc/sysconfig/iptables #若是公網地址是服務商動態分配時 #-o eth0 表示數據包從eth0口出去 # -j MASQUERADE 動態捕獲eth0的地址 iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -p tcp --dport 80  -o eth0 -j MASQUERADE
相關文章
相關標籤/搜索