Iptables 主機防火牆規則
1.概述 內外網防火牆 軟硬件分類
Firewall:防火牆,工作在主機或網絡的邊緣。進出本主機或網絡段的數據報文,根據規則做匹配,根據匹配的結果做處理。一種隔離技術,實現內網以及外網傳輸控制,最大限度阻止黑客破壞企業網絡,加強企業網絡安全。基於本機內核中的TCP/IP協議棧內核
防火牆根據作用對象分類
主機型防火牆:單台主機上設置防火牆,保護主機數據安全。控制的是網絡用戶 對服務器數據的訪問
網絡型防火牆:管理整個企業的網絡安全,內部主機也要設置防火牆 內網外網溝通是一定經過防火牆

防火牆根據軟硬件分類
硬件防火牆:通過硬件的方式實現防火牆
軟件防火牆:通過軟件的形式實現防火牆


2.分為兩部分iptables Netfilter 四表五鏈 匹配規則
iptables分為兩部分為iptables/netfilter
1.iptables是屬於應用程序,完成規則設置命令行工具,是一個防火牆的設置命令,/sbin/iptables,用於管理防火牆規則。
2.Netfilter:位於內核中的包過濾功能體系,是實現防火牆的功能模塊。
3.iptables 工作在網絡層,通過規則對數據“包”進行過濾



注意:
CentOS 7之前,默認啟動的防火牆是iptables,CentOS 7之后默認啟動的是firewalld,
firewall是iptables的外殼,是基於iptables工作
1.)iptables規則鏈 規則定義:設置條件,進行數據包的匹配,依據匹配進行處理
規則的集合體 --規則鏈
對數據包進行過濾或處理。--規則的作用
容納各種防火牆的規則--鏈的作用
處理數據包的不同時機--鏈的分類依據:
默認的5種規則鏈(分類依據按照時機來划分的)對數據包處理的不同時間
1、在進行路由選擇前處理數據包--PREROUTING 路由選擇前執行的規則 判別路由之前(NAT)
2、處理入站數據包--INPUT 處理發給本機的數據包
3:處理出站數據包 --OUTPUT 本機發出去的數據包
4、處理轉發數據包--FORWORD 本機相當於轉發路由,
5、在進行路由選擇后處理數據包--POSTROUTING 路由判斷選擇之后,處理數據包
2.)規則表:容納各種規則鏈
(表是鏈的分類) 根據鏈對數據不同的操作,分為表
4個功能表:
filter對數據包進行過濾,確認是否放行該數據包。
natnetwork address translation 網絡地址轉換(修改數據包中的源、目標IP地址或端口。)
Mangle拆解報文,做出修改,封裝報文,主要為數據包設置標記
raw關閉nat表上啟用的連接追蹤機制,確定是否對該數據包進行狀態跟蹤
各個鏈的包含的功能、實現的位置:數據包 從左往右 一個表一個表流動


3.)總結:iptables 四表五鏈 規則匹配 編寫順序
1.四表:Raw(跟蹤)、mangle(標記)、nat(修改)、fliter(過濾)
2.五鏈:PREROUTING、INPUT、OUTPUT、FORWORD、POSTROUTING
3.規則鏈之間的順序
流入:PREROUTING---> INPUT
流出:OUTPUT ---> POSTROUTING
轉發:PREROUTING ---> FORWARD ---> POSTROUTING
優先級次序:Raw(跟蹤)>mangle(標記)>nat(修改)>fliter(過濾)
4.規則匹配:
按順序從上往下依次檢查,匹配即停止。
若找不到匹配規則,按照該鏈的默認策略處理。
5.鏈上規則編寫次序注意事項:
1.規則編寫的時候,同類(同一應用)規則,匹配范圍小的放在上面。
2.不同類規則,訪問頻率較大的放最上面
3.設置默認策略
4.盡量將可以由一條規則描述的多個規則合並為一條規則
4.)iptables命令的使用 啟動安裝
rpm -qa | grep iptables檢查是否安裝:
yum -y install iptables iptables-services --安裝軟件安裝:

從firewall轉為iptables:
systemctl unmask iptables---解覆蓋,即顯現iptables
systemctl mask firewalld ---覆蓋firewalld
systemctl stop firewalld
systemctl disable firewalld
systemctl restart iptables
systemctl enable iptables
iptables -v -L -n --line-numbers --查看默認filter表上 的所有鏈的信息
1.)iptables格式規則:
Iptbales [-t表名] 選項 [鏈名] [條件] [-j控制類型]
在什么表的 什么鏈 的哪個地方(選項) 添加一條防火牆規則(條件) 滿足條件后執行 J
注意!
1.不指定表名時,默認指定filter表
2.不指定鏈名時,默認指定表內的所有鏈
3.除非設置鏈的默認策略,否則必須指定匹配條件
4.選項、鏈名、控制類型使用大寫字母 其余均為小寫
2.) 4個功能表:過濾,地址轉換,標記,跟蹤
filter對數據包進行過濾,確認是否放行該數據包。
nat(network address translation) 網絡地址轉換(修改數據包中的源、目標IP地址或端口。)
Mangle拆解報文,做出修改,封裝報文,主要為數據包設置標記
raw關閉nat表上啟用的連接追蹤機制,確定是否對該數據包進行狀態跟蹤
3.) 5種規則鏈 (默認) 分類依據 對數據包處理的不同時間
1、在進行路由選擇前處理數據包--PREROUTING 路由選擇前執行的規則 判別路由之前(NAT)
2、處理入站數據包--INPUT 處理發給本機的數據包
3:處理出站數據包 --OUTPUT 本機發出去的數據包
4、處理轉發數據包--FORWORD 本機相當於轉發路由,
5、在進行路由選擇后處理數據包--POSTROUTING 路由判斷選擇之后,處理數據包
5.)查看表 規則 -L -n -v --line-numbers
查看規則
-L:列出指定鏈上的所有規則,后面緊跟要查看的鏈
-n:以數字格式顯示地址和端口號(不反解)
-v: 顯示詳細信息 -vv:更加詳細信息
--line-numbers 行號
iptables -v -L -n --line-numbers --查看默認filter表上 的所有鏈的信息
iptables -t nat -n -L PREROUTING --查看 nat表上的 PREROUTING鏈信息

因為沒有配置,所有為空

列表中的內容chain
police ACCEPT默認允許的意思
target控制類型
port端口類型
source源地址
destination目的地址
6.)鏈管理 設置遠程登錄 -F清除規則 -Z 重新計數-P鏈默認規則
-F 清除所有規則
-P(大寫)為指定的鏈設置 默認規則,
-Z 棧內流量數據,重新計數
iptables -t filter -P INPUT DROP -- -P設置默認類型為DROP直接丟棄
iptables -L -n -v --line-numbers --查看所有防火牆
iptables -P INPUT ACCEPT --設置可以遠程登錄

這樣可以遠程登錄

7..)鏈規則管理 -A末尾追加 -I 開頭插入 -D刪除 -R替換
-A 在鏈的末尾追加一條規則
-I 在鏈的開頭或指定行插入一條規則
(在鏈名后面(例如INPUT)可以添入數字代表把寫入的規則插入第幾行。省略默認為第一行)
-D 刪除指定鏈上的指定規則
-R 修改或替換指定鏈上的指定規則
1.在末尾增加一條規則 -A
iptables -A INPUT -s 192.168.10.100 -d 192.168.10.200 -j ACCEPT
在末尾增加規則 收到來自10.100的數據包 發到10.200 做ACCEPT接受的動作

在增加一個 不接受DROP
iptables -A INPUT -s 192.168.10.111 -d 192.168.10.200 -j DROP

2.刪除一條 規則 -D
iptables -D INPUT 2 刪除INPUT的第二條規則

3.更改一條規則
iptables -R INPUT 1 -s 192.168.10.0/24 -d 192.168.10.200 -j ACCEPT
更改什么鏈第幾條

例如下列例子:
iptables -t filter -P FORWARD DROP(要把轉發關掉保證安全)
iptables -t filter -n -L --line-numbers(查看filter表的相關規則內容)
iptables -L FORWARD -n -v(查看指定規則鏈的內容)
iptables -P OUTPUT ACCEPT(一般默認出站不過濾)
iptables -D INPUT 1(刪除INPUT鏈的第一條規則)
一般情況下 設置默認規則INPUT和FORWARD要設置成DROP,OUTPUT一般設置為ACCEPT
8.)數據包的常見控制類型
ACCEPT:允許通過
DROP直接丟棄, 不給出任何回應
REJECT:拒絕通過, 必要時會給出提示
REDIRECT端口 重定向
LOG記錄日志信息, 然后傳給下條規則 繼續匹配
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE地址偽裝
例如:
iptables -t filter -I INPUT -d 192.168.22.13 -p icmp -j DROP
設置規則 來自filter表的 input鏈 到目的地址22.13 -p端口協議為icmp DROP不通過
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
設置規則 來自filter表的 input鏈 端口為22的 則通過
iptables -A INPUT -p tcp --sport 22 -j ACCEPT
設置規則 在filter表的 input鏈插入一個規則 端口協議為tcp 來源地址端口為22的包 通過
9.)匹配條件 ! -s d p i o 取非 ping
-s IP|NETADDR 數據包的來源地址ip或網段 檢查報文中源IP是否屬於此處指定的地址范圍
-d IP|NETADDR 到目標ip或網段 檢查報文中目標IP是否屬於此處指定的地址范圍
-p {tcp|udp|icmp}支持三種協議 檢查報文中的協議,即IP首部中protocols所標識的協議
-i {eth0/eth1/ens33} 從那個網卡進來 僅用於PREROUTING,INTPUT,FORWARD鏈
-o {eth0/eth1/ens33} 從那個網卡出去 僅用於FORWARD,OUTPUT,POSTROUTING鏈
例如:
1.使客戶能連接22端口 input連接22 output回復
iptables -I INPUT -s 192.168.10.1 -d 192.168.10.200 -p tcp --dport 22 -j ACCEPT
I插入filter表的input鏈 來自10.1 到10.200 的ip 協議為tcp 目的端口為22 則通過
iptables -I OUTPUT -s 192.168.10.200 -d 192.168.10.1 -p tcp --dport 22 -j ACCEPT
-I插入 filter表的output鏈 來自10.200 到10.1 的ip 協議為tcp 目的端口為22 則通過

2. 10.100 和10.150 可ping
iptables -A INPUT -s 192.168.10.100 -d 192.168.10.150 -p icmp -j ACCEPT
在input表 最后插入規則 來源10.100 目的10.150 協議為icmp 通過 進
iptables -A OUTPUT -s 192.168.10.150 -d 192.168.10.100 -p icmp -j ACCEPT
在input表 最后插入規則 來源10.150 目的10.100 協議為icmp 通過 出

3. -R 修改第一個
iptables -R INPUT 1 -s 192.168.10.1 -d 192.168.10.200 -p tcp --dport 22 -i ens33 -j ACCEPT
R修改filter表的input鏈 來自10.1 到10.200 的ip 協議為tcp 目的端口為22 從ens33進來的 則通過
iptables -R OUTPUT 1 -s 192.168.10.200 -d 192.168.10.1 -p tcp --dport 22 -o ens33 -j ACCEPT
R修改 filter表的output鏈 來自10.200 到10.1 的ip 協議為tcp 目的端口為22 從ens33進來的 則通過

4. 可以 ping
iptables -A INPUT -p icmp -s 192.168.10.0/24 -d 192.168.10.20 -j ACCEPT
在input鏈最后加入 來源10.0/24網段 目的ip 10.20 icmp的協議 即可ping 通 進
iptables -A OUTPUT -p icmp -s 192.168.10.20 -d 192.168.10.0/24 -j ACCEPT
在output鏈最后加入 來源10.20 目的ip10.0/24 icmp協議 可通 出
iptables -L -查看

iptables -A INPUT -p icmp -s 192.168.10.20 -j ACCEPT
(允許192.168.10.20主機能Ping本機)
iptables -I INPUT -p tcp -d 192.168.22.13 -j ACCEPT
(允許所有主機能基於TCP訪問192.168.22.13)
10.針對網卡接口流入限制匹配 網卡-i ens33 進入 -o出去
-i ens33:流入ens33網卡的數據流 -o ens33:流出ens33網卡的數據流
例如:
iptables -A INPUT -d 192.168.10.0/24 -i ens33 -j ACCEPT
在最后插入 從ens33進來的 目標網段使10.0網段的 通過
(所有22網段主機數據流入本機ens33網卡數據流允許)
iptables -A OUTPUT -s 192.168.10.0/24 -o ens33 -j ACCEPT
(響應22網段主機數據流出本機ens33網卡數據流允許)
11.)擴展匹配
iptables支持的擴展模塊
Centos7:/usr/lib64/xtables/模塊xxx.so
centos-6 :/lib64/xtable/xxx.so
顯示擴展
必須指明擴展模塊
獲取擴展幫助文檔的方式:①centos-6 man iptables
②Centos-7 man iptables-extensions
1.例如 --d /s port PORT目標端口 源端口
--dport PORT 目標端口,可以單個端口,可以是連續的端口(不能離散)
--sport PORT 源端口,
例如:
iptables -I OUTPUT -s 192.168.10.20 -d 192.168.10.0/24 -p tcp --sport 22 -j ACCEPT 出
在output鏈第一條前增加 當數據包來源ip10.20 目的10.0網段 協議為tcp 端口22 則通過
iptables -I INPUT -s 192.168.10.0/24 -d 192.168.10.20 -p tcp --dport 22 -j ACCEPT 進
在input鏈第一條前增加 當數據包來源ip10.0網段 目的10.20 協議為tcp 端口22 則通過
iptables -L 查看 22端口為ssh協議

2.三次握手--tcp-flags LIST1 LIST2
--tcp-flags LIST1 LIST2(較少使用):SYN 連接請求 ACK 應答 RST 重置 PSH數據傳輸
例如:
iptables -I INPUT -i eth0 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
--syn:檢查TCP握手的第一次(其中只有SYN是1)
在filter表 input鏈中 在第一行插入 如果有數據包從 eth0 接口來 協議為tcp 啟動隱式模塊
檢查tcp三次握手的這些標志SYN,RST,ACK 如果只要SYN=1 其他為0 則不通過
3.Ping -p icmp --icmp-type 0/8
-p icmp --icmp-type 0/8
0:ping響應
8:請求應答, Ping請求
例如:
iptables -A INPUT -s 192.168.10.0/24 -p icmp --icmp-type 8 -j ACCEPT 請求
在input鏈最后加入 來源網段10.0 ping請求 為8 則通過
iptables -A OUTPUT -s 192.168.10.10 -d 192.168.10.0/24 -p icmp --icmp-type 0 -j ACCEPT
在input鏈最后加入 來源10.10 目的網段10.0 ping請求 為0 則通過 回應

12.)顯示擴展 隱式擴展 -m(注意:如指明了協議可以省略-m)
1.)multiport 端口擴展:-m multiport --sports s源端口 d目的端口
使用離散方式指明多個端口(最多15個)
多端口匹配: -m multiport --sports 源 端口列表
-m multiport --dports 目的 端口列表
例如:
iptables -I INPUT -s 192.168.10.0/24 -d 192.168.10.50 -m multiport -p tcp --dport 22,23,80 -j ACCEPT
Input鏈 源網段10.0 目的網段10.50 tcp協議 訪問 目的端口22.23.80 則通過 進
iptables -I OUTPUT -s 192.168.10.50 -d 192.168.10.0/24 -m multiport -p tcp --sport 22,23,80 -j ACCEPT
Output鏈 源網段10.50 目的網段10.0 tcp協議 訪問源端口22.23.80 則通過 出

2.)iprange 連續ip擴展:指明連續的IP地址 -m iprange --src-range
-m iprange --src-range 指明連續的 源IP地址范圍
-m iprange --dst-range 指明連續的 目的IP地址范圍
例如:
iptables -I INPUT -d 192.168.30.10 -p tcp -m multiport --dport 22:25,80,514 -m iprange --src-range 192.168.30.11-192.168.30.30 -j ACCEPT
Input鏈 目的地址30.10 協議為tcp 源端口為22.25.80.514 來源地址范圍30.11-30滿足則通過
iptables -I OUTPUT -s 192.168.30.10 -p tcp -m multiport --sport 22:25,80,514 -m iprange --dst-range 192.168.30.11-192.168.30.30 -j ACCEPT
Output鏈 目的地址30.10 協議為tcp 目標端口為22.25.80.514 目的地址范圍30.11-30滿足則通過

iptables -I INPUT -d 192.168.10.10 -p tcp -m multiport --dport 22:25,80,514 -m iprange --src-range 192.168.10.11-192.168.10.254 -j ACCEPT
iptables -I OUTPUT -d 192.168.10.10 -p tcp -m multiport --sport 22:25,80,514 -m iprange --dst-range 192.168.10.11-192.168.10.254 -j ACCEPT
3.)time 日期時間擴展:根據時間進行匹配 -m time --timestart
--datestart 日期開始
--datestop 日期結束
--timestart時間開始 時分
--timestop時間結束 時分
iptables -I INPUT -s 192.168.10.100 -d 192.168.10.200 -m time --timestart 15:30 --timestop 15:50 -m multiport -p tcp --dport 22,23,80 -j ACCEP
來源於10.100 目的ip10.200 數據包在15.30-50發過來 協議tcp 目的端口22.23.80 則通過
iptables -I OUTPUT -s 192.168.10.200 -d 192.168.10.100 -m time --timestart 15:30 --timestop 15:50 -m multiport -p tcp --sport 22,23,80 -j ACCEPT
來源於10.200 目的ip10.100 數據包在15.30-50發過來 協議tcp 源端口22.23.80 則通過
iptables -L -n -v

4.)string 字符串模塊擴展:只能對明文編碼協議生效 根據7層字符進行匹配
--algo {bm|kmp}:指定字符串匹配的算法
[!] --string 參數
[!] --hex-string 參數
例如:
iptables -I INPUT -d 192.168.10.20 -m multiport -m string --algo kmp --string "kkk" -p tcp --dport 80 -j ACCEPT
Input鏈 目的ip10.20 啟動multiport模塊 目的端口80 啟動匹配字符串模塊 匹配kkk通過
iptables -I OUTPUT -d 192.168.10.20 -m multiport -m string --algo kmp --string "kkk" -p tcp --sport 80 -j ACCEPT
Input鏈 目的ip 10.20 啟動multiport模塊 源端口80 啟動匹配字符串模塊 匹配kkk通過
Iptables -L -v -n --查看信息

5.)connlimit 限制請求數量擴展:限制單個IP並發請求數量進行匹配過濾
--connlimit-upto : 請求數小於等於閾值時執行操作(centos-6不支持)
--connlimit-above: 請求數大於3時執行操作
例如:
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
(限制ssh並發連接最多3個)
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-upto 3 -j ACCEPT
(限制ssh並發連接最多3個)

6.)limit 速率模塊擴展:對響應 速率 進行過濾匹配
--limit-burst:空閑峰值數量
--limit #/minute:單位時間的速率
例如:
iptables -I INPUT -d 192.168.10.20 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
input鏈 目的ip10.20 ping模塊 8進 啟動limit 速率模塊 空閑峰值為5 一分鍾30的頻率 允許通過
iptables -I OUTPUT -s 192.168.10.20 -p icmp --icmp-type 0 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
Output鏈 源ip10.20 ping模塊 0出 啟動limit 速率模塊 空閑峰值為5 一分鍾30的頻率 允許通過

7.)state 連接狀態擴展:檢查連接的狀態-m state --state ESTABLISHED,RELATED
所有的可追蹤的連接狀態:
NEW:與任何連接 無關的(新來的)
ESTABLISHD:響應請求 或已建立連接的
RELATED:與已有連接 有相關性的
INVALID:不被允許的類型
UNTRACKED:沒有被跟蹤的(不常用的)
例如:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

13.) iptables規則保存 和重載
iptables的配置文件:/etc/sysconfig/iptables-config
1.保存在某個文本中,在需要的時候進行重載規則
iptables-save > /root/iptabls-rule 將規則保存至/root/iptabls-rule
cat /root/iptabls-rule
iptables -F
iptables -L
iptables-restore < /root/iptabls-rule 重新加載


2.永久修改和保存
service iptables save(centos-6) (相當於iptables-save > /etc/sysconfig/iptables)
service iptables save
service iptables restart 生效

