iptables防火牆
一、iptables概述
Netfilter/Iptables(以下簡稱Iptables)是unix/linux自帶的一款優秀且開放源代碼的完全自由的基于包過濾的防火牆工具,它的功能十分強大,使用非常靈活,可以對流入和流出伺服器的資料包進行很精細的控制。
iptables是linux2.4及2.6核心中內建的服務。
iptables主要工作在OSI七層的二、三、四層,如果重新編譯核心,iptables也可以支援7層控制]
二、iptables網路安全前言介紹
#學好iptables的基礎:
1、OSI7層模型以及不同層對應哪些協定?
2、TCP/IP三次握手,四次斷開的過程,TCP HEADER,狀态轉換
3、常用的服務端口要非常清楚了解。
4、常用服務協定原理http協定,icmp協定。
#企業中安全配置原則:
1、盡可能不給伺服器配置外網IP,可以通過代理轉發或者通過防火牆映射。
2、并發不是特别大情況有外網IP,可以開啟防火牆服務。
3、大并發的情況,不能開iptables,影響性能,利用硬體防火牆提升架構安全。Copy to clipboardErrorCopied
三、iptables防火牆使用時名詞概念了解
#容器:裝東西的器皿,docker容器技術,将鏡像裝在了一個系統中,這個系統就稱為容器
iptables稱為一個容器---裝着防火牆的表
防火牆的表又是一個容器---裝着防火牆的鍊
防火牆的鍊也是一個容器---裝着防火牆的規則
iptables---表---鍊---規則
規則:防火牆一條一條安全政策
#防火牆比對規則流程:
1. 防火牆是層層過濾的,實際是按照配置規則的順序從上到下,從前到後進行過濾的。
2. 如果比對上規則,即明确表示是阻止還是通過,資料包就不再向下比對新的規則。
3. 如果規則中沒有明确表明是阻止還是通過的,也就是沒有比對規則,向下進行比對,直到比對預設規則得到明确的阻止還是通過。
4. 防火牆的預設規則是所有規則執行完才執行的。Copy to clipboardErrorCopied
四、iptables應用
#應用場景
1.主機安全
2.内部共享上網
3.端口或IP映射
#iptables工作流程
1.比對規則是從上往下的依次執行的
2.隻要比對上規則,就不會再往下執行
3.如果都沒有比對到規則,就執行預設的規則
4.防火牆預設規則最後執行,預設允許所有
#注意:比對越多的規則越往前放
五、iptables(四表五鍊)
iptables 是內建在 Linux 核心中的包過濾防火牆系統,使用 iptables 可以添加、删除具體的過濾規則,iptables 預設維護着 4 個表和 5 個鍊,所有的防火牆政策規則都被分别寫入這些表與鍊中
#"四表"是指iptables 的功能:
預設的 iptables規則表有filter表(過濾規則表)、nat 表(位址轉換規則表)、mangle(修改資料标記位規則表)、raw(跟蹤資料表規則表)
filter 表:控制資料包是否允許進出及轉發,可以控制的鍊路有 INPUT、FORWARD 和 OUTPUT。
nat 表:控制資料包中位址轉換,可以控制的鍊路有 PREROUTING、INPUT、OUTPUT 和 POSTROUTING。
mangle:修改資料包中的原資料,可以控制的鍊路有 PREROUTING、INPUT、OUTPUT、FORWARD 和 POSTROUTING。
raw:控制 nat 表中連接配接追蹤機制的啟用狀況,可以控制的鍊路有 PREROUTING、OUTPUT。
#"五鍊"是指核心中控制網絡的 NetFilter 定義的 5 個規則鍊,每個規則表中包含多個資料鍊:
Linux 防火牆的過濾架構![]()
@iptables防火牆詳解
#四表:
1.Filter表
2.NAT表
3.Managle表
4.Raw表
#五鍊:
1.INPUT
2.FORWARD
3.OUTPUT
4.PREROUTING
5.POSTRUTING
1、#Filter:實作防火牆安全過濾功能
INPUT 對于指定到本地套接字的包,即到達本地防火牆伺服器的資料包 外面---->(門)房子iptables
FORWARD 路由穿過的資料包,即經過本地防火牆伺服器的資料包 外面-----(前門)房子(後門)---房子
OUTPUT 本地建立的資料包 外面<-----(門)房子iptables
2、#NAT:實作将資料包中IP位址或者端口資訊,内網到外網進行改寫/外網到内網進行改寫
PREROUTING 一進來就對資料包進行改變 在路由之前,進行資料包IP位址或端口資訊的轉換
OUTPUT 本地建立的資料包在路由之前進行改變 本地防火牆要出去的流量進行相應轉換(了解)
POSTROUTING 在資料包即将出去時改變資料包資訊 在路由之後,進行資料包IP位址或端口資訊的轉換
SNAT 和 DNAT 是 iptables 中使用 NAT 規則相關的的兩個重要概念。如上圖所示,如果内網主機通路外網而經過路由時,源IP會發生改變,這種變更行為就是SNAT;反之,當外網的資料經過路由發往内網主機時,資料包中的目的IP (路由器上的公網IP) 将修改為内網IP,這種變更行為就是DNAT
#注:
在nat server 中,先更改配置檔案,/etc/sysctl.conf 中改為
net.ipv4.ip_forward = 1
修改完成後,指令行sysctl -p 讓其全部執行生效
3、#Managle:對資料進行标記
4、#Raw:将資料包一些标記資訊進行拆解Copy to clipboardErrorCopied
六、iptables使用
1.iptables安裝
[root@web02 ~]# yum install -y iptables-services
2、加載防火牆的核心子產品
[root@m01 ~]# modprobe ip_tables
[root@m01 ~]# modprobe iptable_filter
[root@m01 ~]# modprobe iptable_nat
[root@m01 ~]# modprobe ip_conntrack
[root@m01 ~]# modprobe ip_conntrack_ftp
[root@m01 ~]# modprobe ip_nat_ftp
[root@m01 ~]# modprobe ipt_state
#檢視加載的子產品
[root@m01 ~]# lsmod | egrep 'filter|nat|ipt'
3、停止firewalld,啟動iptables
[root@web02 ~]# systemctl stop firewalld
[root@web02 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@web02 ~]# systemctl start iptables.service
七、iptables實操
1、防火牆參數資訊
-A --- 表示将規則添加到指定鍊上
-I --- 表示将規則插入到指定鍊上
-D --- 表示将規則從指定鍊上删除
-R --- 表示将規則資訊進行修改
-p --- 指定相應服務協定資訊(tcp udp icmp all)
--dport --- 表示指定目标端口資訊
--sport --- 表示指定源端口号資訊
-j --- 指定對相應比對規則執行什麼操作(ACCEPT DROP REJECT REDIRECT)
ACCEPT 允許通過
DROP 直接拒絕
REJECT 委婉拒絕
REDIRECT 重定向
-s --- 指定比對的源位址網段資訊,或者比對的主機資訊
-d --- 指定比對的目标位址網段資訊,或者比對的主機資訊
-i --- 指定比對的進入流量接口資訊 隻能配置在INPUT鍊上
-o --- 指定比對的發出流量接口資訊 隻能配置在OUTPUT鍊上
-m --- 指定應用擴充子產品參數
multiport --- 可以比對多個不連續端口資訊
Copy to clipboardErrorCopied
2、iptables防火牆配置初始化
iptables -F --- 清除防火牆預設規則
iptables -X --- 清除防火牆自定義鍊
iptables -Z --- 清除防火牆技術器資訊Copy to clipboardErrorCopied
3、iptables防護牆資訊檢視方法
iptables -L --- -L 以清單形式顯示所有規則資訊
iptables -L -n --- -n 以數字形式顯示IP位址或端口資訊,不要轉換為字元串顯示
iptables -t nat -L -n --- -t 表示指定檢視或者配置相應的表
iptables -L -n -v --- -v 表示顯示詳細規則資訊,包含比對計數器數值資訊
iptables -L -n --line-number --- --line-number 顯示規則序号資訊Copy to clipboardErrorCopied
4、iptables防火牆端口規則配置
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP --- -A 表示添加規則到相應鍊上,預設表示添加規則到結尾
iptables -t filter -D INPUT -p tcp --dport 22 -j DROP --- -D 表示删除規則從相應鍊上。
iptables -t filter -D INPUT 規則序号
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP --- -I 表示插入規則到相應鍊上,預設表示插入規則到首部
iptables -t filter -I INPUT 3 -p tcp --dport 22 -j DROP --- 指定規則插入位置
iptables -t filter -R INPUT 6 -p tcp --dport 8080
5、阻止相應網段主機通路服務端指定端口服務
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT -i eth0 -s 10.0.0.9 -p tcp --dport 22
6、除了某個位址可以通路22端口之外,其餘位址都不能通路
10.0.0.1 10.0.0.253 10.0.0.9(隻允許)
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT ! -s 10.0.0.9 -p tcp --dport 22
7、指定阻止通路多個端口服務
iptables -A INPUT -s 10.0.0.9 -p tcp --dport 22:80 -j DROP --- 比對連續的端口号通路
iptables -A INPUT -s 10.0.0.9 -m multiport -p tcp --dport 22,24,25 -j DROP --- 比對不連續的端口号通路
Copy to clipboardErrorCopied
8、通過防火牆實作禁ping功能
#實作ping功能測試鍊路是否正常,基于icmp協定實作的
icmp協定有多種類型:
icmp-type 8:請求類型 icmp-type 0:回複類型
#實踐01:實作禁止主機通路防火牆伺服器(禁ping)
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP
#實踐02:實作禁止防火牆通路主機伺服器(禁ping)
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j DROP
#實踐03:所有icmp類型都禁止
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
iptables -A OUTPUT -p icmp -m icmp --icmp-type any -j DROP
#實踐04:實作防火牆狀态機制控制
NEW: 發送資料包裡面控制字段為syn=1,發送第一次握手的資料包
ESTABLISHED: 請求資料包發出之後,響應回來的資料包稱為回複的包
RELATED: 基于一個連接配接,然後建立新的連接配接
INVALID: 無效的的資料包,資料包結構不符合正常要求的
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Copy to clipboardErrorCopied
9、轉發源位址
# 将38080端口轉發至本機的80端口
[root@web01 ~]# iptables -t nat -A PREROUTING -p tcp --dport 38080 -j REDIRECT --to-port 80
[root@web01 ~]# iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 172.16.1.8
八、iptables常用操作
1、檢視防火牆(預設filter表)
[root@web02 ~]# iptables -nvL #檢視防火牆狀态
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source
2、檢視防火牆規則,指定nat表
[root@web02 ~]# iptables -nL -t nat #檢視防火牆規則,指定表
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@web02 ~]#
3、清除防火牆規則
#删除鍊中所有的規則
[root@web02 ~]# iptables -F
#删除使用者定義的鍊
[root@web02 ~]# iptables -X
#規則計數器清零
[root@web02 ~]# iptables -Z
4、添加防火牆規則
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
iptables #指令
-t #指定表
filter #表名字
-A #添加規則至鍊的最後
INPUT #鍊名字
-p #指定協定
tcp #tcp協定
--dport #指定端口
-j #指定動作
DROP #丢棄
5、删除防火牆規則
[root@web02 ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@web02 ~]#
[root@web02 ~]# iptables -D INPUT 2
九、防火牆配置執行個體
1、禁止端口通路
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 3306 -j DROP
2、拒絕IP通路
#配置通路抛棄
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.7 -i eth0 -j DROP
-s 指定源位址
-i 指定網卡
#測試通路
[root@web01 ~]# curl 10.0.0.8
curl: (7) Failed connect to 10.0.0.8:80; Connection timed out
#配置通路拒絕
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.9 -i eth0 -j REJECT
#通路測試
[root@web03 ~]# curl 10.0.0.8
curl: (7) Failed connect to 10.0.0.8:80;
3、禁止IP網段通路
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.0/24 -i eth0 -j DROP
4、隻允許某個IP通路
[root@web02 ~]# iptables -t filter -A INPUT -p tcp ! -s 10.0.0.1 -i eth0 -j DROP
5、比對端口範圍
#拒絕多個端口通路,可以使用逗号隔開
[root@web02 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
-m #指定擴充項
multiport #多端口比對
#寫端口範圍可以使用 : 在端口之間
[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 22:100 -j DROP
十、企業裡一般iptables配置
1、配置之前考慮下
1)#考慮防火牆開在哪台機器上
2)#該機器部署了什麼服務
nginx
keepalived
3)#服務開啟的是什麼端口
80
443
22
4)#預設規則為所有都拒絕
2、配置安全規則
#允許通路80和443
iptables -I INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
-I 添加規則至前面
#隻允許跳闆機連接配接22端口
iptables -A INPUT -p tcp -s 172.16.1.61 --dport 22 -j ACCEPT
#禁止ping
iptables -A INPUT -p icmp --icmp-type 8 ! -s 172.16.1.61 -j DROP
#允許通路外網
iptables -A INPUT -i eth0 -j ACCEPT
#預設拒絕所有
iptables -P INPUT DROP
-P #更改policy預設政策
重要問題(實戰坑)
#根據以上配置方法,最後一步設定了預設拒絕所有規則,那麼跳闆機連接配接主機後,千萬不要進行清理防火牆的操作,否則就什麼都連接配接不上了,因為清理防火牆規則不會清理'iptables -P INPUT DROP'這一條規則,那麼防火牆預設規則就變成所有都dorp了
#解決方法:
需要到虛拟機或者實體機上操作
1.iptables -P INPUT ACCEPT
2.systemctl restart iptables
3.重新開機實體機(有風險)
#避免方法:
1)将 iptables -P INPUT ACCEPT 加到定時任務(測試階段可用該方法)
* * * * * /usr/sbin/iptables -P INPUT ACCEPT
2)其他環境測試,測試沒有問題後,複制所有規則到環境執行
3)配置前,先儲存之前的防火牆規則,根據以前的規則修改
[root@web01 ~]# iptables-save > iptables_m01_20200116
修改後導入規則
[root@web01 ~]# iptables-restore < iptables_m01_20200116
3、企業中配置
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -nL
十一、防火牆規則永久生效
#把規則寫入iptables配置檔案
[root@m01 ~]# vim /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
#儲存已經配置的規則
[root@m01 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
十二、内部共享上網
1、在m01上操作
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
-j 指定動作
SNAT 源位址轉換
--to-source 源位址轉換指向
2、沒有外網ip的主機操作
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=172.16.1.61
DNS1=223.5.5.5
[root@web01 ~]# ifdown eth1 && ifup eth1
十三、端口轉發和IP轉發
1、端口轉發
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 5555 -j DNAT --to-destination 172.16.1.7:22
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
2、IP轉發
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.1.61 -j DNAT --to-destination 172.16.1.7
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
3、iptables常見列題
1、詳述iptales工作流程以及規則過濾順序?
2、iptables有幾個表以及每個表有幾個鍊?
#四表五鍊
3、iptables的幾個表以及每個表對應鍊的作用,對應企業應用場景?
4、畫圖講解iptables包過濾經過不同表和鍊簡易流程圖并闡述。
5、請寫出檢視iptables目前所有規則的指令。
6、禁止來自10.0.0.188 ip位址通路80端口的請求
7、如何使在指令行執行的iptables規則永久生效?
#(service iptables save)
8、實作把通路10.0.0.3:80的請求轉到172.16.1.17:80
#(iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 172.16.1.8)
9、實作172.16.1.0/24段所有主機通過124.32.54.26外網IP共享上網
10、寫一個防火牆配置腳本,隻允許遠端主機通路本機的80端口
#iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
#iptables -t filter -A INPUT -j DROP
11、寫一個腳本解決DOS攻擊生産案例
#!/bin/bash
#步驟:
# 寫一個腳本解決DOS攻擊生産案例
# 過濾出IP及IP重複次數
# grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/nginx/access.log
# awk '{print $1}' /var/log/nginx/access.log
# awk '{print $1}' /var/log/nginx/access.log | uniq -c | sort -n
# 每一分鐘怎麼做?
# 将統計結果超過100的,屏蔽掉
DIR="/var/log/nginx/access.log"
IPS_DIR="/var/log/nginx/IPS.txt"
DATE=`date +%F_%H_%M`
BACKUP_DIR="/var/log/nginx/backup"
NEW_FILE_NAME=$BACKUP_DIR/$DATE.txt
if [ ! -d $BACKUP_DIR ];then
mkdir -pv $BACKUP_DIR
fi
cp -r $DIR $NEW_FILE_NAME
>$DIR
awk '{print $1}' $NEW_FILE_NAME | sort | uniq -c | sort -n > ${IPS_DIR}
while read line
do
COUNT=`echo $line | awk '{print $1}'`
IP=`echo $line | awk '{print $2}'`
if [ $COUNT -gt 100 ];then
/usr/sbin/iptables -t filter -A INPUT -s $IP -p tcp -j DROP
fi
done < ${IPS_DIR}
/nginx/access.log | uniq -c | sort -n
每一分鐘怎麼做?
将統計結果超過100的,屏蔽掉
DIR="/var/log/nginx/access.log"
IPS_DIR="/var/log/nginx/IPS.txt"
DATE=
date +%F_%H_%M
BACKUP_DIR="/var/log/nginx/backup"
NEW_FILE_NAME=DATE.txt
if [ ! -d $BACKUP_DIR ];then
mkdir -pv $BACKUP_DIR
fi
cp -r $DIR $NEW_FILE_NAME
$DIR
awk ‘{print $1}’ $NEW_FILE_NAME | sort | uniq -c | sort -n > ${IPS_DIR}
while read line
do
COUNT=`echo $line | awk '{print $1}'`