關於iptables防火牆的介紹和使用
目錄
1.Netfileter/iptables(以下簡稱iptables)防火牆簡介
- unix/linux自帶的開源,且基於包過濾的防火牆工具
- 可對流入和流出伺服器的資料包進行控制
- 可在低配的硬體上執行
- 是Linux2.4及2.6核心中整合的服務
- 在OSI七層的二、三、四層上工作
- iptables是防火牆的管理工具,位於/sbin/iptables,真正實現功能的是netfilter,他是Linux核心中實現包過濾的內部結構
- iptables包含四個表5個鏈,其中表是按照對應資料包的操作區分的,鏈是按照不同的HOOK點來區分的,表和鏈實際上是neifilter的兩個維度
2.iptables四表五鏈介紹
2.1表、鏈、規則之間的關係
表(table)
iptables是表的容器,iptables包含的各個表
鏈(chains)
Iptables表是鏈的容器
INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
規則(Policy)
鏈是規則的容器
2.2iptables表的介紹
1.filter表(是iptables預設使用的表)
作用:過濾流經主機的資料包
核心模組:Iptables_filter
規則鏈
- INPUT
- FORWARD
- OUTPUT
2.nat表
作用:
- 負責網路地址轉換,即來源與目的IP地址和port的轉換;
- 和主機本身沒有關係,一般用於區域網或者特殊的埠轉換服務相關;
- nat功能相當於網路的ACL控制,和網路交換機的ACL類似.
核心模組:iptables_nat
規則鏈:
- OUTPUT
- PREROUTING
- POSTROUTING
3.Mangle表(基本用不倒)
作用:
- 修改資料包的服務型別、TTL;
- 可以配置路由實現QOS核心模組
核心模組:iptables_mangle
規則鏈:
- PERROUTING
- POSTROUTING
- INPUT
- OUTPUT
- FORWARD
4.Raw表(RHEL4沒有此表)
作用:決定資料包是否被狀態處理機制處理
核心模組:iptables_raw
規則鏈:
- OUTPUT
- PREROUTING
注意:表的處理優先順序:Raw>mangle>nat>filter
2.3規則鏈介紹
INPUT:用來過濾目標地址是主機地址的資料包
OUTPUT:處理源地址是本機地址的資料包
PREROUTING:資料包到達防火牆時進行路由判斷之前執行的規則,作用是改變資料包的目的地址和目的埠等
POSTROUTING:在資料包離開防火牆時進行路由判斷之後執行的規則,作用是改變資料包源地址,源埠,例如:我們現在的筆記本和虛擬機器都是192.168.30.0/24,在出網的時候被我們的企業路由器把源地址改為了公網地址,主要應用在區域網共享上網
FORWARD:負責轉發主機資料包,和NAT關係很大。LVS NAT模式,net.ipv4_forward=1
2.4規則鏈之間的優先順序
2.4.1第一種情況
入站資料流向
- 從外界達到防火牆的資料包,先被PREROUTING規則鏈處理(是否修改資料包地址);
- 之後進行路由選擇(判斷資料包應該發往何處),如果資料包的目標主機是防火牆本機(例如Internet使用者訪問防火牆主機中的web伺服器的資料包),那麼核心將其轉給INPUT鏈進行處理(決定那個是否能夠通過);
- 通過以後再交給系統上層的應用程式(例如Apache伺服器)進行響應
2.4.2第二種情況
轉發資料流向
- 來自外界的資料包到達防火牆之後,先被PREROUTING規則連處理;
- 之後進行路由選擇,如果資料包的目標地址是其他外部地址(比如區域網使用者通過閘道器訪問QQ站點的資料包),則核心將其傳遞給FORWARD鏈進行處理,(是否轉發或攔截);
- 然後再交給POSTROUTING規則鏈(是否修改資料包的地址)進行處理
2.4.3第三種情況
出站資料流向
- 防火牆本機想外部地址傳送資料包(比如說在防火牆本機中測試公網DNS伺服器時),首先被OUTPUT規格鏈處理;
- 之後進行路由選擇,然後在傳遞給POSTROUTING規則連(是否修改資料包源地址等)進行處理
- 管理和設定iptables
3.1IPTABLES基本語法格式
Iptables[-t 表名] 命令選項 [鏈名] [條件匹配] [ -j 目標動作和跳轉]
說明:
- 表名,鏈名用於指定iptables命令所操作的表和鏈
- 命令選項:用於指定管理iptables規則的方式(如:插入、增加、刪除、檢視)
- 目標動作和跳轉:用於指定資料包的處理方式(如:通過、拒絕、丟棄、跳轉給其他的鏈處理)
3.2IPTABLES管理命令的管理控制選項
-A(append):在指定的鏈的末尾新增一條新的規則
-D(delete):指定鏈中的某一條規則,可以按規則序號和內容刪除
-I(insert):在指定鏈中插入一條新的規則,預設在第一行新增
-R(replace):修改、替換指定鏈中的某一條規則,可以按照序號和內容進行替換
-L(list):指定鏈中所有的規則進行檢視
-F(flush):清空所有的規則
-N(new-chain):一條使用者自己定義的規則鏈
-X(delete-chain):刪除指定表中使用者自定義的規則鏈
-P(policy):設定指定鏈的預設策略
-N(numeric):使用數字顯示輸出結果
-V(version):檢視版本
-h(help):獲取幫助
3.3防火牆處理包的方式
ACCEPT:允許資料包通過
DROP:直接丟棄資料包,不給任何迴應訊息
REJECT:拒絕資料包通過,必要時會給資料傳送端一個響應的資訊
LOG在/var/log/message檔案中記錄日誌資訊,然後將資料包傳遞給下條規則
3.4IPTABLES防火牆規則的儲存與恢復
3.4.1原理:
Iptables-save把規則儲存到檔案中,再由目錄rc.d下的指令碼(/etc/rc.d/init.d/iptables)自動裝載
3.4.2儲存規則的方法
第一種
使用Iptables-save來儲存
Iptables-save > /etc/sysconfig/iptables //來生成儲存規則的檔案
第二種:
使用service iptables save //他能把規則自動儲存在/etc/sysconfig/iptables中
當計算機啟動時,rc.d下的指令碼將用命令iptables-restore呼叫這個檔案,從而就自動恢復了規則
3.5匹配規則
a)規則從上往下匹配,只要匹配到就不往下匹配,如果沒有匹配上就走預設規則
b)防火牆是層層過濾的,實際上是按照配置規則的順序從上到下,從前到後進行匹配的
c)如果匹配上規則,則明確表明是阻止還是通過,資料包就不在匹配新的規則
d)如果所有規則中沒有明確表明是阻止還是通過,也就是沒有匹配規則,向下進行匹配,直到匹配預設得到明確的阻止還是通過
e)防火牆預設規則是對應鏈的所有規則執行完成後才會執行的
4.實際操作
4.1拒絕進入防火牆的所有ICMP資料包
命令:[[email protected] sysconfig]# iptables -I INPUT -p icmp -j REJECT
4.2新增允許防火牆轉發出icmp協議以外的所有資料包
[[email protected] sysconfig]# iptables -A FORWARD ! -p icmp -j ACCEPT
4.3拒絕轉發來自192.168.1.10主機資訊,允許轉發來自192.168.0.0/24網段的資料
-s:指定源地址
命令:[[email protected] sysconfig]# iptables -I FORWARD -s 192.168.1.10 -j REJECT
命令:[[email protected] ~]# iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
4.4丟棄從外網介面進入防火牆本機的源地址為私網地址的資料包
-i:指定網絡卡
命令:
[[email protected] ~]# iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
[[email protected] ~]# iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
[[email protected] ~]# iptables -A INPUT -i eht0 -s 172.16.0.0/12 -j DROP
4.5封堵網段172.16.0.0/12 2分鐘後候解封
命令:
[[email protected] Desktop]# iptables -A INPUT -s 172.16.0.0/12 -j DROP //禁止172.16.0.0/12的網段
[[email protected] Desktop]# at now +2 minutes //增加一次性任務2分鐘後刪除此規則
at> iptables -D INPUT 1
at> <EOT>
job 5 at 2018-10-03 12:58
4.6只允許管理員從172.16.0.0/12使用遠端登陸防火牆主機
命令:
[[email protected] ~]# iptables -A INPUT -p tcp --dport 22 -s 172.16.0.0/12 -j ACCEPT //只允許源172.16.0.0/12的地址的22埠的tcp協議進入
[[email protected] ~]# iptables -A INPUT -p tcp --dport 22 -j DROP //丟棄埠22的TCP協議
4.7允許本機開放的埠從TCP埠20-1024提供的應用服務
命令:
[[email protected] ~]# iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT //在入站鏈中新增本機允許TCP20-1024埠進入的
[[email protected] ~]# iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT //在出站鏈中新增的本機允許TCP20-1024端口出去
!!!此處特別注意:
對於INPUT鏈dsport指的是本地的埠
對於OUTPUT鏈sport指的是本地的埠
4.8允許轉發來自172.16.0.0/12區域網段的DNS請求資料包
命令:
[[email protected] ~]# iptables -A FORWARD -s 172.16.1.20 -p udp --sport 53 -j ACCEPT
[[email protected] ~]# iptables -A FORWARD -d 172.16.1.20 -p udp --dport 53 -j ACCEPT
4.9禁止其他主機ping防火牆主機,但允許從防火牆上ping其他主機
命令:
[[email protected] ~]# iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
[[email protected] ~]# iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
[[email protected] ~]# iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
4.10禁止轉發來自MAC地址和主機的資料包
命令:
[[email protected] ~]# iptables -I INPUT -m mac --mac-source 80:18:44:DF:F6:81 -j DROP
說明:iptables中使用‘-m 模組關鍵字’的形式呼叫顯示匹配。咱們這裡用‘-m mac -mac-source’來表示資料包的源MAC地址
4.11允許防火牆對外開放TCP埠20、21、25、110以及被動模式FTP埠1250-1280
命令:
[[email protected] ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
說明:這裡使用‘ -m multiport --dport ’來指定目的埠及範圍
4.12禁止轉發源IP地址為192.168.1.20-192.168.1.99的TCP資料包
命令:
[[email protected] ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
說明:此處用‘ -m iprange --src-range’來指定IP地址的範圍
4.13禁止轉發與正常TCP連線無關的非--syn請求的資料包
命令:
[[email protected] ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
說明:‘-m state’表明資料包的連線狀態,‘NEW’表示與任何連線無關的
4.14拒絕訪問防火牆新資料包,但允許相應連線或已有連線相關資料包
命令:
[[email protected] ~]# iptables -A INPUT -p tcp -m state --state NEW -j DROP //丟棄新建的TCP連線
[[email protected] ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT //接受已經建立的連線
說明:
‘ ESTABLISHED’表示已經響應或者已經建立連線的資料包,‘RELATED’表示與建立連線有相關性的連線
4.15只開放本機WEB服務(80),FTP(20.21.20450-20480),放行外部主機主機發往伺服器其他埠的應答資料包,將其他入站資料包均予以丟棄處理
命令:
[[email protected] ~]# iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT //允許接受20.21.80埠
[[email protected] ~]# iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT //允許接受20450到20480埠
[[email protected] ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT //接受已響應連線和已建立連線
[[email protected] ~]# iptables -P INPUT DROP //為INPUT鏈建立預設規則,入站資料包全部丟棄
5.錯誤記錄
5.1新增允許防火牆轉發除icmp協議以外的所有資料包
解決:雖然會報錯但是新增規則的命令還是會被執行,報錯資訊顯示”Using intrapositioned negation is deprecated (` --option ! this`)”使用內部缺陷,屬於BUG問題,”in favor of extrapositioned (` ! --option this`)”表是支援的方式為 ! --option this 這樣就可以解決此報錯問題
Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`).
Intrapositioned 內陷的
Negation 否定
Deprecated 貶低
Extrapositioned 外接 外部轉換