linux_iptables基礎以及常見配置

Linux:網絡防火牆
  netfilter: Frame
  iptables: 數據報文過濾,NAT、mangle等規則生成的工具

TCP鏈接的三次握手:
  Client --1--> Server : SYN=1,ACK=0,FIN=0,RST=0;     Client 狀態:Closed-->SYN_SENT;
  Client <--2-- Server : SYN=1.ACK=1,FIN=0,RST=0;     Server 狀態:Listen-->SYN_RCVD
  Client --3--> Server : SYN=0,ACK=1,FIN=0,RST=0;     Server 收到Client的ACK以後,二者轉換爲ESTABLISHED

TCP斷開鏈接



防火牆:  硬件,軟件:規則(匹配標準,處理辦法)
 
  Framework:
    默認規則:
       開放:堵
       關閉:通

  規則:匹配標準
    IP: 源IP,目標IP
    TCP: 源端口,目標端口
    UDP: 源端口,目標端口
    ICMP: icmp-type


linux不一樣內核的不一樣防火牆以及工具:
  Linux 2.0
    ipfw/firewall

  Linux 2.2
    ipchain/firewall
 
  Linux 2.4-2.6
    iptables/netfilter


hook function: 鉤子函數
    prerouting
    input
    output
    forward
    postrouting

規則鏈(CHAIN):
   PERROUTING
   INPUT
   OUTPUT
   FORWARD
   POSTROUTING


iptables表:
  filter(過濾):
    INPUT
    OUTPUT
    FORWARD

  NAT(地址轉換):
    PREDOUTING
    OUTPUT
    POSTROUTING

  mangle(拆開、修改、封裝):
    PREROUTING
    INPUT
    FORWARD
    OUTPUT
    POSTROUTING
 
  raw(原始格式):
    PREROUTING
    OUTPUT


  表在規則鏈上的優先級:
    PREROUTING: raw-->mangle-->nat
    INPUT     : mangle-->filter
    FORWARD   : mangle-->filter
    OUTPUT    : raw-->mangle-->nat-->filter
    POSTROUTING: mangle-->nat

 
  可使用自動義鏈,但只有在被調用時才能發揮做用,並且若是沒有自定義鏈中的任何規則匹配,還應該有返回機制;
    用戶能夠刪除自定義的空鏈
    默認鏈不能被刪除

  每一條規則都有兩個內置的計數器
    一、被匹配的報文個數
    二、被匹配的報文大小之和




規則:匹配標準, 處理動做
 
iptables [-t TABLE_NAME] COMMAND CHAIN [num] 匹配標準 -j 處理方法


保存iptables寫入的規則
  # service iptables save
     /etc/sysconfig/iptables
     此命令保存的配置文件,在下次啓動iptables時會自動讀取此配置文件

  # iptables-save > /etc/sysconfig/iptables.20160216
     此種方式保存的配置文件,在下次啓動iptables時須要使用下面的指令加載配置
       # iptables-restore < /etc/sysconfig/iptables.20160216

 
  COMMAND:
    管理規則:
       -A: 在鏈的尾部添加一條規則
       -I CHAIN [num]: 在鏈中插入一條規則,若是省略 num ,則插入爲第一條
       -D CHAIN [num]: 刪除鏈中的第num條規則
       -R CHAIN [num]: 替換指定的規則:

    管理鏈:
       -F [CHAIN]: flush,清空指定鏈中的規則,若是省略 CHAIN ,則能夠實現刪除對應表中全部鏈中的規則
       -P CHAIN target: 設定指定鏈的默認策略
       -N CHAIN: 自定義一個新的空鏈
       -X [CHAIN]: 刪除一個自定義的空鏈
       -Z [CHAIN [num]]: 將指定鏈中的規則的計數器置爲0
       -E old-chain new-chain: 重命名自定義的鏈

    查看:
       -L: 顯示指定表中的規則
         -n: 以數字格式顯示主機地址和端口號
     -v: 顯示鏈及規則的詳細信息
     -vv:
     -x: 顯示計數器的精確值
     --line-numbers: 顯示鏈中規則的號碼
 
 
  -j target
    動做(target):
       ACCEPT :放行
       DROP :丟棄
       REJECT :拒絕
       DNAT :目標地址轉換
       SNAT :源地址轉換
       REDIRECT :端口重定向
       MASQUERADE :地址假裝
       LOG : 日誌
       MARK : 打標記

 
  匹配標準:
    通用匹配
       -s,--src : 指定源地址
       -d,--dst : 指定目標地址
       -p {tcp|udp|icmp} : 指定協議
       -i INTERFACE: 指定數據報文流入接口
            可用於定義標準的鏈: PREROUTING,INPUT,FORWARD
       -o INTERFACE: 指定數據報文流出接口
            可用於定義標準的鏈: OUTPUT,POSTROUTING,FORWARD

    擴展匹配:
       隱含擴展: 不要特別指明由哪一個模塊進行的擴展,由於此時使用 -p {tcp|udp|icmp}
         -p tcp
        --sport PORT[-PORT]: 源端口
        --dport PORT[-PORT]: 目標端口
        --tcp-flags mask comp:只檢查mask指明的標誌位,使用逗號分隔的標誌位列表;comp中指明的標誌爲必須爲1
          --tcp-flags SYN,FIN,ACK,RST SYN :表示檢查四個標誌位,其中SYN爲1,其餘標誌位爲0,其至關於 --syn
        --syn :TCP三次握手的第一個數據報文

         容許192.168.21.64/26訪問21.117的80端口(http服務)
        # iptables -t filter -A INPUT -s 192.168.21.64/26 -d 192.168.21.117 -p tcp --dport 80 -j ACCEPT
            # iptables -A OUTPUT -s 192.168.21.117 -d 192.168.21.64/26 -p tcp --sport 80 -j ACCEPT

     -p icmp
        --icmp-type
          0: echo-reply
          8: echo-request
    
     容許本機21.117 ping全部主機,但不容許其餘主機ping本機
        # iptables -A OUTPUT -s 192.168.21.117 -p icmp --icmp-type 8 -j ACCEPT
            # iptables -A INPUT -d 192.168.21.117 -p icmp --icmp-type 0 -j ACCEPT

         -p udp
        --sport PORT[-PORT]: 源端口
        --dport PORT[-PORT]: 目標端口

       
       
       顯式擴展: 必須指明由哪一個模塊進行的擴展,在iptables中使用 -m 選項完成此功能
         -m EXTESTION --spe-opt
        state: 狀態擴展
          --state
             NEW : 新請求
             ESTABLISHED: 已創建的鏈接
             INVALID: 非法鏈接
             RELATED: 相關聯的
              # iptables -I INPUT -d 192.168.21.117 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

        multiport: 離散多端口匹配
          --sports,--source-ports PORT[,PORT|PORT:PORT...]
          --dports,--destination-ports
          --ports
          # iptables -I INPUT 2 -d 192.168.21.117 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT



NAT:
  DNAT:
    -j DNAT
       --to-destination IPaddr[:PORT]
    # iptables -t nat -A PREROUTING -d 105.236.8.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.17.212
    

  SNAT:源地址轉換(POSTROUTING,OUTPUT)
    -j SNAT
       --to-source IPaddr[-IPaddr[:PORT]] :指定NAT轉換的地址

    -j MASQUERADE: 例如使用ADSL撥號上網的時候使用,它會自動選擇可以上網的地址進行NAT的轉換


SNAT簡易實驗,三臺linux虛擬機
虛擬機1:主機名 httpd ip=192.168.21.117 gw=192.168.21.120
虛擬機2:主機名 test_hostonly ip=172.16.10.123 gw=172.16.10.101
虛擬機3: 主機名 lvs1 eth0=192.168.21.120 eth1=172.16.10.101


打開網關主機LVS1的網卡間轉發功能
[root@lvs1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@lvs1 ~]# cat /proc/sys/net/ipv4/ip_forward
1


在虛擬主機1上抓包
[root@httpd ~]# tcpdump -i eth0 -nn -X icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes


此時在虛擬主機2上ping 虛擬機1
[root@test_hostonly ~]# ping 192.168.21.117
PING 192.168.21.117 (192.168.21.117) 56(84) bytes of data.
64 bytes from 192.168.21.117: icmp_seq=1 ttl=63 time=0.393 ms


查看當前虛擬機1抓取到的icmp包:
13:55:35.411979 IP 172.16.10.123 > 192.168.21.117: ICMP echo request, id 54795, seq 3, length 64

13:55:35.412037 IP 192.168.21.117 > 172.16.10.123: ICMP echo reply, id 54795, seq 3, length 64
此時的ping的源地址是虛擬機2的IP地址

接下來在虛擬機3上添加SNAT的規則
[root@lvs1 ~]# iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -j SNAT --to-source 192.168.21.120
[root@lvs1 ~]# iptables -t nat -L -n
Chain POSTROUTING (policy ACCEPT)
target     prot opt source
SNAT       all  --  172.16.10.0/24       0.0.0.0/0           to:192.168.21.120

再次在虛擬機2上ping 虛擬機1
[root@test_hostonly ~]# ping 192.168.21.117
PING 192.168.21.117 (192.168.21.117) 56(84) bytes of data.
64 bytes from 192.168.21.117: icmp_seq=1 ttl=63 time=2.19 ms
64 bytes from 192.168.21.117: icmp_seq=2 ttl=63 time=0.375 ms

而後再查看虛擬機1上的抓包狀況,這個時候的ping源地址變成了192.168.21.120,和預期結果相同
14:07:17.711563 IP 192.168.21.120 > 192.168.21.117: ICMP echo request, id 12814, seq 1, length 64
14:07:17.711605 IP 192.168.21.117 > 192.168.21.120: ICMP echo reply, id 12814, seq 1, length 64

這樣一個簡單的SNAT轉換配置就完成了

此時想禁止虛擬主機2 ping 虛擬機1,則在虛擬機3 上添加FORWARD規則:
[root@lvs1 ~]# iptables -t filter -A FORWARD -s 172.16.10.0/24 -p icmp -j REJECT
[root@lvs1 ~]# iptables  -L -n
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     icmp --  172.16.10.0/24       0.0.0.0/0           reject-with icmp-port-unreachable


linux

相關文章
相關標籤/搜索