1. 程式人生 > >22、iptables學習筆記

22、iptables學習筆記

netfilter: 工作核心中,讓規則能夠生效網路框架        

iptables: 工作於使用者空間,編寫規則並且傳送到netfilter


四表:

raw,mangle,nat,filter(預設表)

五鏈:

PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING


表和鏈的對應關係:

filter:

INPUT, FORWARD, OUTPUT


nat:

PREROUTING, OUTPUT, POSTROUTING


mangle:

PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING


檢查條件:

IP:SIP, DIP

TCP:SPORT, DPORT, Flags

UDP:SPORT, DPORT

ICMP:ICMP-TYPE


擴充套件機制:

time,string, state(connection-tracking)


處理機制:

DROP

REJECT

ACCEPT

SNAT

DNAT

RETURN

REDIRECT

LOG


iptables [-t table] -N chain

建立一條自定義的規則鏈

iptables [-t table] -X [chain]

刪除自定義的空鏈

iptables [-t table] -E old-chain-name new-chain-name

修改自義鏈名


iptables [-t table] -P chain target

為鏈指定預設策略,指定預設規則


iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

-F: 清空鏈中的規則

規則有編號,在鏈中自上而下,從1開始;

-L: list,列出表中的所有規則;

-n: 數字格式顯示IP和Port

-v: 以詳細格式顯示

  pkts bytes target     prot opt in     out     source               destination 

pkts: packets, 被本規則所匹配到的報文的個數;

bytes: 被本規則所匹配到的所有報文的大小之和,會執行單位換算;

target: 目標,即處理機制;

prot: 協議,一般為{TCP|UDP|ICMP}; 

opt: 可選項

in: 資料包的流入介面;

out: 資料包的流出介面;

source: 源地址;

destination: 目標地址;

-vv

-vvv

-x: exactly, 精確值,不執行單位換算;

--line-numbers: 顯示各規則的行號;

-Z: zero, 把規則的計數器清零


iptables [-t table] {-A|-I|-D|-R} chain rule-specification


規則命令:

追加規則

iptables [-t table] -A chain [rulenum] rule-specification

刪除規則

iptables [-t table] -D chain rulenum

插入規則

iptables [-t table] -I chain [rulenum] rule-specification

替換指定規則

iptables [-t table] -R chain rulenum rule-specification

只顯示指定鏈上的規則新增命令:

iptables [-t table] -S [chain [rulenum]]


rule-specification

匹配條件 -j 處理機制


匹配條件:

通用匹配:

-s :匹配原地址,可以IP,也可以網路地址;可以使用!操作符取反, ! 172.16.0.0/16; -s 相當於 --src, 或 --source

-d : 匹配目標地址

-p : 匹配協議,通常只使用{TCP|UDP|ICMP}三者之一;

-i :資料報文流入的介面;通常只用於INPUT、FORWARD和PREROUTING

-o :流出的介面;通常只用於OUTPUT、FORWARD和POSTROUTING


  擴充套件匹配

 隱含擴充套件: 使用-p {tcp|udp|icmp}指定某特定協議後,自動能夠對協議進行的擴充套件

-p icmp

--icmp-type

8: ping請求

0:ping響應


放行ping其它主機

iptables -A OUTPUT -s 192.168.130.61 -p icmp  --icmp-type 8 -j ACCEPT

iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 0 -j ACCEPT

放行其它主機ping自己

iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 8 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -p icmp  --icmp-type 0 -j ACCEPT

-p udp

--dport

--sport


放行本機dns服務,自己作為DNS客戶端

iptables -A OUTPUT -s 192.168.130.61 -p udp --dport 53 -j ACCEPT

iptables -A INPUT -d 192.168.130.61 -p udp --sport 53 -j ACCEPT


放行本機dns服務,自己作為DNS伺服器

iptables -A INPUT -d 192.168.130.61 -p udp --dport 53 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -p udp --sport 53 -j ACCEPT


放行本機的tftp服務,自己作為tftp伺服器(測試不成功,無法傳輸資料)

iptables -A INPUT -d 192.168.130.61 -p udp --dport 69 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61  -p udp --sport 69 -j ACCEPT


 -p tcp

 --dport m[-n] :匹配的目標埠,可以是連續的多個埠;

 --sport       :匹配的源埠     

 --tcp-flags rst,syn,ack,fin syn


放行本機web服務,自己作為web客戶端

iptables -A OUTPUT -s 192.168.130.61 -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -d 192.168.130.61 -p tcp --sport 80 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -p tcp --dport 443-j ACCEPT

iptables -A INPUT -d 192.168.130.61 -p tcp --sport 443 -j ACCEPT

 

 放行本機ss服務,自己作為ss伺服器

 iptables -t filter -A INPUT -d 192.168.130.61 -p tcp --dport 22 -j ACCEPT

 iptables -t filter -A OUTPUT -s 192.168.130.61 -p tcp --sport 22 -j ACCEPT



  顯式擴充套件:必須要明確指定的擴充套件模組

  -m 擴充套件模組名稱 --專用選項1 --專用選項2

  

  multiport: 多埠匹配,一次指定多個(15個以內)離散埠

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

  --dports

  --ports


[[email protected] ~]# 

[[email protected] ~]# iptables -S

-P INPUT DROP

-P FORWARD DROP

-P OUTPUT DROP

-A INPUT -d 192.168.130.61/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p udp -m udp --sport 53 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --sport 80 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --sport 443 -j ACCEPT 

-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --dport 22 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p udp -m udp --dport 53 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --dport 80 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --dport 443 -j ACCEPT 

-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --sport 22 -j ACCEPT  

  使用multiport將80,443這3條合併為1條

  iptables -A INPUT -d 192.168.130.61 -p tcp -m multiport --dports 80,443 -j ACCEPT

  iptables -A OUTPUT -s 192.168.130.61 -p tcp -m multiport --sports 80,443 -j ACCEPT

  

  iprange: ip地址範圍

  [!] --src-range from[-to]

  [!] --dst-range from[-to]

  

  只允許192.168.130.1-192.168.130.60範圍內的IP能ssh訪問192.168.130.61

  iptables -A INPUT -d 192.168.130.61 -p tcp --dport 22 -m iprange --src-range 192.168.130.1-192.168.130.60 -j ACCEPT

      iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 22 -m iprange --dst-range 192.168.130.1-192.168.130.60 -j ACCEPT

  

      time: 指定時間範圍

      --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

         --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 

  

         --timestart hh:mm[:ss]

          --timestop hh:mm[:ss]

  

          [!] --weekdays day[,day...]

  

          只有每週的週一至週五的8點到18點可以訪問192.168.130.61的web伺服器

          iptables -A INPUT -d 192.168.130.61 -p tcp --dport 80 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT

          iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 80 -j ACCEPT

  

          string: 字串匹配

          --algo {bm|kmp}:字元匹配查詢時使用演算法

          --string "STRING": 要查詢的字串

          --hex-string “HEX-STRING”: 要查詢的字元,先編碼成16進位制格式

          

          禁止訪問192.168.130.61含有google字元的網站

          iptables -I OUTPUT -s 192.168.130.61 -p tcp --sport 80 -m string --algo kmp --string "google" -j DROP


        connlimit: 每IP對指定服務的最大併發連線數;

        [!] --connlimit-above [n]

iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 3 -j DROP

       

ab -c 200 -n 2000 https://172.16.100.7/test.html 

  

  

          limit: 報文速率控制

          --limit #[/second|/minute|/hour|/day]

          --limit-burst #

          iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -j ACCEPt

  初始可以達到每秒ping 5次,平均每秒不能超過2個

  

          state: 狀態匹配  

          --state  

          NEW

          ESTABLISHED

          RELATED

          INVALID


    調整連線追蹤功能所能容納的追蹤的最大連線數:

        # cat /proc/sys/net/nf_conntrack_max 

        定義了連線追蹤的最大值,因此,建議按需調大此值;

        # cat /proc/net/nf_conntrack

        記錄了當前追蹤的所有連線

        # cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established

        法則:

        1、對於進入的狀態為ESTABLISHED都應該放行;

        2、對於出去的狀態為ESTABLISHED都應該放行;

        3、嚴格檢查進入的狀態為NEW的連線;

        4、所有狀態為INVALIED都應該拒絕;

        如何放行工作於被動模式下的FTP服務?

        1、確保iptables載入ftp協議支援的模組:ip_nat_ftp, ip_conntrack_ftp

        編輯/etc/sysconfig/iptables-config檔案,定義如下引數:

        IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

        modprobe ip_nat_ftp

        modprobe ip_conntrack_ftp

        2、放行請求報文的RELATED和ESTABLISHED狀態,放行響應報文的ESTABLISHED狀態;

iptables -A INPUT -d 192.168.130.61 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -m state --state ESTABLISHED -j ACCEPT 

iptables -A INPUT -d 192.168.130.61 -p tcp --dport 21 -j ACCEPT

iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 21 -j ACCEPT       

       

        -j target

        RETURN: 返回呼叫鏈


練習:判斷下述規則的意義:

# iptables -N clean_in

# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP

# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP


# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

# iptables -A clean_in -d 192.168.130.61 -j RETURN 



# iptables -A INPUT -d 192.168.130.61 -j clean_in


# iptables -A INPUT  -i lo -j ACCEPT

# iptables -A OUTPUT -o lo -j ACCEPT



# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP


# iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT





利用iptables的recent模組來抵禦DOS***: 22,建立一個列表,儲存有所有訪問過指定的服務的客戶端IP



ssh: 遠端連線,


iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP



iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP


1.利用connlimit模組將單IP的併發設定為3;會誤殺使用NAT上網的使用者,可以根據實際情況增大該值;


2.利用recent和state模組限制單IP在300s內只能與本機建立2個新連線。被限制五分鐘後即可恢復訪問。


下面對最後兩句做一個說明:


1.第二句是記錄訪問tcp 22埠的新連線,記錄名稱為SSH

--set 記錄資料包的來源IP,如果IP已經存在將更新已經存在的條目


2.第三句是指SSH記錄中的IP,300s內發起超過3次連線則拒絕此IP的連線。

--update 是指每次建立連線都更新列表;

--seconds必須與--rcheck或者--update同時使用

--hitcount必須與--rcheck或者--update同時使用


3.iptables的記錄:/proc/net/xt_recent/SSH



也可以使用下面的這句記錄日誌:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"




路由:對於Linux主機來說,設定/proc/sys/net/ipv4/ip_forward的值為1,即為開啟了路由功能;

NAT: 過載技術

Basic NAT: 靜態NAT;

NAPT:動態NAT,網路地址埠轉換;

源地址轉換:SNAT,用於讓內網主機訪問網際網路

目標地址轉換:DNAT,讓網際網路上主機訪問本地內網中的某伺服器上的服務,(釋出)


iptables基於SNAT和DNAT這兩個目標實現地址轉換技術;

-j SNAT --to-source SIP

規則新增:POSTROUTING鏈

-j MASQUERADE


-j DNAT --to-destination DIP[:PORT]

支援埠對映


例子:

# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.20.11

# iptables -A FORWARD -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo kmp --string "hello" -j REJECT

# iptables -t nat -A PREROUTING -d 192.168.130.61 -p tcp --dport 22022 -j DNAT --to-destination 192.168.20.12:22


儲存規則:

service iptables save

規則會被儲存至/etc/sysconfig/iptables檔案中;

預設,start時也會讀取此檔案中的內容以設定規則;

# iptables-save > /path/to/some_rulefile

# iptables-restore < /path/from/some_rulefile