iptables 從入門到應用(防火墻)

原文地址: http://powermichael.blog.51cto.com/12450987/1952049


\color{red}{一、簡介}

1.1、是什么?

iptables是隔離主機以及網絡的工具,通過自己設定的規(guī)則以及處理動作對數據報文進行檢測以及處理。

1.2、發(fā)展史

防火墻的發(fā)展史就是從墻到鏈再到表的過程,也即是從簡單到復雜的過程。為什么規(guī)則越來越多,因為互聯(lián)網越來越不安全了,所有防火墻的的規(guī)則也越來越復雜。防火的工具變化如下:

    ipfirewall(墻)-->ipchains(鏈條)--iptables(表)

    2.0版內核中,包過濾機制是ipfw,管理工具是ipfwadm;

    2.2 版內核中,包過濾機制ipchain,管理工具是ipchains;

    2.4版及以后的內核中,包過濾機制是netfilter,管理工具iptables。

\color{red}{二、原理}

2.1、組成

linux的防火墻由netfilter和iptables組成。用戶空間的iptables制定防火墻規(guī)則,內核空間的netfilter實現(xiàn)防火墻功能。

netfilter(內核空間)位于Linux內核中的包過濾防火墻功能體系,稱為Linux防火墻的“內核態(tài)”。

iptables(用戶空間)位于/sbin/iptables,是用來管理防火墻的命令的工具,為防火墻體系提供過濾規(guī)則/策略,決定如何過濾或處理到達防火墻主機的數據包,稱為Linux防火墻的“用戶態(tài)”。

2.2、實現(xiàn)方式

Linux系統(tǒng)的防火墻功能是由內核實現(xiàn)的,包過濾防火墻工作在TCP/IP的網絡層。



用戶空間的iptables制定相應的規(guī)則策略控制內核空間的netfilter處理相應的數據訪問控制。

iptables有四表五鏈(其實有五表,是后來加進來的),四表分別是下圖的的raw,mangle,nat,filter表。五鏈分別是PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING鏈。表有什么用?鏈又有什么用呢?其實表決定了數據報文處理的方式,而鏈則決定了數據報文的流經哪些位置。

你可以從圖中看出規(guī)則表的優(yōu)先級:raw-->mangle-->nat-->filter。



四表的介紹如圖(ps:由于現(xiàn)在有五表了,所以我把另一個表也加了進來)。



五鏈的介紹如圖。

制作防火墻規(guī)則通常有兩種基本策略。一是黑名單策略;二是白名單策略。

黑名單策略指沒有被拒絕的流量都可以通過,這種策略下管理員必須針對每一種新出現(xiàn)的攻擊,制定新的規(guī)則,因此不推薦。

白名單策略指沒有被允許的流量都要拒絕,這種策略比較保守,根據需要,逐漸開放,目前一般都采用白名單策略,推薦。

2.3、數據包過濾匹配流程

如圖,我們可以分析數據報文進入本機后應用了哪些表規(guī)則以及鏈規(guī)則,根據表規(guī)則和鏈規(guī)則我們分析數據包的過濾匹配流程。

比如我們制定一個filter表的規(guī)則,filter表決定是否放行數據包通過,那如果通過,則必須經由INPUT鏈流入數據包,INPUT鏈是處理入站數據的,如果沒問題,繼續(xù)放行到用戶空間,再經由OUTPUT鏈將數據包流出。

那如果是nat表的規(guī)則,nat表主要實現(xiàn)轉發(fā)功能,數據包先經由PREROUTING鏈進行路由選擇,選擇好路線后再經由FORWARD鏈轉發(fā)數據,然后再進行一個路由選擇,最后由POSTROUTING鏈流出數據。

其他表規(guī)則的數據包流程不做介紹,圖中介紹的十分詳盡。


\color{red}{三、iptables命令}


3.1、制定iptables表規(guī)則思路

(1)選擇一張表(此表決定了數據報文處理的方式)

(2)選擇一條鏈(此鏈決定了數據報文的流經哪些位置)

(3)選擇合適的條件(此條件決定了對數據報文做何種條件匹配)

(4)選擇處理數據報文的動作,制定相應的防火墻規(guī)則。

3.2、基本語法結構

結構:

iptables [ -t 表名 ] 管理選項 [ 鏈名 ] [ 條件匹配 ] [ -j 目標動作或跳轉 ]

幾個注意事項:

不指定表名時,默認表示filter表,不指定鏈名時,默認表示該表內所有鏈,除非設置規(guī)則鏈的缺省策略,否則需要指定匹配條件。


3.3、詳細語法

iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name

rule-specification = [matches...] [target]

match = -m matchname [per-match-options]

target = -j targetname [per-target-options]

3.4、語法結構解析

語法結構解析如下。

注意:本導圖是按照iptables語法結構的使用的先后順序制作的,如果按照此種方式能夠很快地幫助我們記憶以及掌握iptables規(guī)則的制定。


3.4.1、表

其實表的介紹,在上面已經介紹了。這里我們可以再來回顧以下五張表的功能。


3.4.2、管理選項

管理選項分為三大類,分別為:規(guī)則的顯示,規(guī)則鏈管理以及規(guī)則管理。我們可以通過man幫助查看iptables的用法,大多選項用法都見名知意。


鏈管理

-N, --new-chain chain:新建一個自定義的規(guī)則鏈;
-X, --delete-chain [chain]:刪除用戶自定義的引用計數為0的空鏈;
-F, --flush [chain]:清空指定的規(guī)則鏈上的規(guī)則;
-E, --rename-chain old-chain new-chain:重命名鏈;

-Z, --zero [chain [rulenum]]:置零計數器;
注意:每個規(guī)則都有兩個計數器
packets:被本規(guī)則所匹配到的所有報文的個數;
bytes:被本規(guī)則所匹配到的所有報文的大小之和;

-P, --policy chain target 制定鏈表的策略(ACCEPT|DROP|REJECT)

規(guī)則管理

-A, --append chain rule-specification:追加新規(guī)則于指定鏈的尾部;
-I, --insert chain [rulenum] rule-specification:插入新規(guī)則于指定鏈的指定位置,默認為首部;
-R, --replace chain rulenum rule-specification:替換指定的規(guī)則為新的規(guī)則;
-D, --delete chain rulenum:根據規(guī)則編號刪除規(guī)則;
-D, --delete chain rule-specification:根據規(guī)則本身刪除規(guī)則;

規(guī)則顯示

-L, --list [chain]:列出規(guī)則;
-v, --verbose:詳細信息;
-vv 更詳細的信息
-n, --numeric:數字格式顯示主機地址和端口號;
-x, --exact:顯示計數器的精確值,而非圓整后的數據;
--line-numbers:列出規(guī)則時,顯示其在鏈上的相應的編號;
-S, --list-rules [chain]:顯示指定鏈的所有規(guī)則;

3.4.3、鏈
五鏈的功能如圖所示。

3.4.4、條件匹配

條件匹配分為基本匹配和擴展匹配,擴展匹配又分為顯示匹配和隱式匹配。

基本匹配的特點是:無需加載擴展模塊,匹配規(guī)則生效;擴展匹配的特點是:需要加載擴展模塊,匹配規(guī)則方可生效。

隱式匹配的特點:使用-p選項指明協(xié)議時,無需再同時使用-m選項指明擴展模塊以及不需要手動加載擴展模塊;

顯示匹配的特點:必須使用-m選項指明要調用的擴展模塊的擴展機制以及需要手動加載擴展模塊。

基本匹配的使用選項及功能

-p 指定規(guī)則協(xié)議,tcp udp icmp all
-s 指定數據包的源地址,ip hostname
-d 指定目的地址
-i 輸入接口
-o 輸出接口
! 取反

隱式匹配的使用選項及功能

-p tcp
--sport 匹配報文源端口;可以給出多個端口,但只能是連續(xù)的端口范圍
--dport 匹配報文目標端口;可以給出多個端口,但只能是連續(xù)的端口范圍
--tcp-flags mask comp 匹配報文中的tcp協(xié)議的標志位
-p udp
--sport 匹配報文源端口;可以給出多個端口,但只能是連續(xù)的端口范圍
--dport 匹配報文目標端口;可以給出多個端口,但只能是連續(xù)的端口范圍
--icmp-type
0/0: echo reply 允許其他主機ping
8/0:echo request 允許ping其他主機

顯式匹配的使用選項及功能
顯式匹配的選項特別多,所以使用思維導圖的方式梳理一下。我們可以使用命令:man iptables-extensions查看具體用法。

1.multiport(多端口)

開放多個端口。


  1. 例子:
    iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
    iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT

2.iprange(ip范圍)

以連續(xù)地址塊的方式來指明多IP地址匹配條件。

  1. 例子:
    iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
    iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

3.time(時間范圍)

指定時間范圍。

  1. 例子:
    iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT
    iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 901 -j ACCEPT

4.string(字符串)

對報文中的應用層數據做字符串模式匹配檢測(通過算法實現(xiàn))。

--algo {bm|kmp}:字符匹配查找時使用算法
--string "STRING": 要查找的字符串
--hex-string “HEX-STRING”: 要查找的字符,先編碼成16進制格式

5.connlimit(連接限制)
根據每個客戶端IP作并發(fā)連接數量限制。

--connlimit-upto n 連接數小于等于n時匹配
--connlimit-above n 連接數大于n時匹配

6.limit(速率限制)
報文速率控制。

7.state(狀態(tài))
追蹤本機上的請求和響應之間的數據報文的狀態(tài)。狀態(tài)有五種:INVALID, ESTABLISHED, NEW, RELATED, UNTRACKED


法則:

    1、對于進入的狀態(tài)為ESTABLISHED都應該放行;

    2、對于出去的狀態(tài)為ESTABLISHED都應該放行;

    3、嚴格檢查進入的狀態(tài)為NEW的連接;

    4、所有狀態(tài)為INVALIED都應該拒絕;  

3.4.5、處理動作
處理動作有內置的處理動作和自定義的處理動作。自定義的處理動作用的比較少,因此只介紹內置的處理動作。

ACCEPT:允許數據包通過

DROP:直接丟棄數據包,不給出任何回應信息

REJECT:拒絕數據包通過,必要時會給數據發(fā)送端一個響應信息

LOG:在日志文件中記錄日志信息,然后將數據包傳遞給下一條規(guī)則

QUEUE: 防火墻將數據包移交到用戶空間

RETURN:防火墻停止執(zhí)行當前鏈中的后續(xù)Rules,并返回到調用鏈

REDIRECT:端口重定向

MARK:做防火墻標記

DNAT:目標地址轉換

SNAT:源地址轉換

MASQUERADE:地址偽裝

3.5、保存和載入規(guī)則

CentOS6和CentOS7保存和載入的規(guī)則稍有差異。
3.5.1、CentOS 7

保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有規(guī)則
-t, --test:僅分析生成規(guī)則集,但不提交

3.5.2、CentOS 6

保存規(guī)則:service iptables save #保存規(guī)則于/etc/sysconfig/iptables文件,覆蓋保存;
重載規(guī)則:service iptables restart #默認重載/etc/sysconfig/iptables文件中的規(guī)則
配置文件:/etc/sysconfig/iptables-config

\color{red}{四、iptables的實踐應用}
iptables十分重要與網絡的安全息息相關,我們理所應當掌握。不過我們大可不必死記硬背,一定結合實際項目,多多練習,效果才會更好。
4.1、iptables常用規(guī)則

1.放行sshd服務

iptables -t filter -A INPUT -s 192.168.0.0/24 -d 192.168.0.1 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.0.1 -p tcp --sport 22 -j ACCEPT

2.放行httpd/nginx服務

iptables -I OUTPUT -s 192.168.0.1 -p tcp --sport 80 -j ACCEPT
iptables -I INPUT -d 192.168.0.1 -p tcp --dport 80 -j ACCEPT

3.放行本機端的流入流出

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
不放行本機的流入與流出,訪問本機的httpd服務,網頁會出現(xiàn)Error establishing a database connection。

4.限制ping 192.168.0.1主機的數據包數,平均2/s個,最多不能超過3個

iptables -A INPUT -i ens33 -d 192.168.0.1 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT

4.2、如何配置iptables

a) 1. 刪除現(xiàn)有規(guī)則
iptables -F
b) 2. 配置默認鏈策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
c) 3. 允許遠程主機進行SSH連接
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
d) 4. 允許本地主機進行SSH連接
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
e) 5. 允許HTTP請求
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT

4.3、iptables初始化腳本

#!/bin/bash
  
echo &quot;Setting firewall . . . . start&quot;
  
#--------RULESET INIT----------#
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#------------------------------#
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#------------------------------#
#zabbix
iptables -A INPUT -p tcp --destination-port 10050 -j ACCEPT
iptables -A INPUT -p udp --destination-port 10051 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 10050 -j ACCEPT
iptables -A OUTPUT -p udp --destination-port 10051 -j ACCEPT
#for web
iptables -A INPUT -p tcp --destination-port 21 -j ACCEPT
iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 80 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 21 -j ACCEPT
#for mysql
iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 3306 -j ACCEPT
#for mail
iptables -A INPUT -p tcp --destination-port 25 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 25 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 110 -j ACCEPT
#for ssh
iptables -A INPUT -p tcp -s any/0 --destination-port 22 -j ACCEPT
iptables -N icmp_allowed
iptables -A icmp_allowed -p ICMP --icmp-type 11 -j ACCEPT
iptables -A icmp_allowed -p ICMP --icmp-type 8 -j ACCEPT
iptables -A icmp_allowed -p ICMP -j DROP
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
/etc/init.d/iptables save
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容