純幹貨詳解iptables工作原理以及使用方法
網絡中的防火墻,是一種將內部和外部網絡分開的方法,是一種隔離技術。防火墻在內網與外網通信時進行訪問控制,依據所設置的規則對數據包作出判斷,最大限度地阻止網絡中不法分子破壞企業網絡,從而加強了企業網絡安全。
防火墻的分類
硬件防火墻,如思科的ASA防火墻,H3C的Secpath防火墻等
軟件防火墻,如iptables、firewalld等
Linux包過濾防火墻簡介
1、Linux操作系統中默認內置一個軟件防火墻,即iptables防火墻
2、netfilter位於Linux內核中的包過濾功能體系,又稱為模塊,並且自動加載,是內核很小的一部分稱為Linux防火墻的“內核態”,註意,真正生效的是內核態。
iptables規則鏈
規則的作用:對數據包進行過濾或處理
鏈的作用:容納各種防火墻規則,相當於容器
鏈的分類依據:處理數據包的不同時機
系統默認自帶的5種規則鏈:
INPUT:處理入站數據包
OUTPUT:處理出站數據包
FORWARD:處理轉發數據包
POSTROUTING:在進行路由選擇後處理數據包(出站過濾)
PREROUTING:在進行路由選擇前處理數據包(入站過濾)
註意:POSTROUTING、PREROUTING在做NAT時所使用
iptables規則表
表的作用:容納各種規則鏈
表的劃分依據:防火墻規則的作用相似,以功能進行劃分
默認包括4個規則表:
raw表:確定是否對該數據包進行狀態跟蹤
mangle:為數據包設置標記,標記之後可以分流、限流
nat表:修改數據包中的源、目標IP地址或端口
filter表:確定是否放行該數據包,即過濾
註意:最終規則是存到鏈裏面,最小的容器是鏈表裏面會存放鏈,鏈是一條又一條的規則,一條一條的存
五鏈四表圖
raw表:包含了PREROUTING和OUTPUT。註意只能在這兩個時機進行跟蹤。
mangle表:包含了PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。註意在這5個時機做標記。
filter表:包含了INPUT、FORWARD、OUTPUT。註意在這3個時機進行過濾數據。
iptables匹配流程
規則表之間的順序:raw→mangle→nat→filter,即先做狀態跟蹤→在做標記→在做修改源目IP或端口→在做是否過濾
規則鏈之間的順序:
入站:PREROUTING→INPUT 路由前發現是自己的,直接進站
出站:OUTPUT→POSTROUTING
轉發:PREOUTING→FORWARD→POSTROUTING
註意:PREROUTING和POSTROUTING是最外圍,規則鏈是靠時機分的,分為了入站,出站,轉發三個時機
規則鏈內的匹配順序:
按順序依次檢查,匹配即停止(LOG策略外)
若找不到相匹配規則,按該鏈的默認策略處理
匹配流程示意圖
主機型防火墻:
1、入站:數據包發來,路由前,先做跟蹤,再做標記,修改,查看路由,如果是發往本機的直接往上走,進站前標記,然後出站過濾
2、出站:出站和路由後,指的是最上面的路由選擇,本機選擇之後先經過跟蹤→標記→修改→是否過濾,出站之後是mangle表的路由後→nat表的路由後
網絡型防火墻:
3、轉發:數據進來以後,經過路由前raw、mangle、nat,路由前完成之後進行選擇,發現此數據是需要發到別的地方,非本地,通過forward,經過mangle的forward,filter的forward,還要經過路由後標記、修改IP及端口,結束
iptables命令語法
- 語法構成
iptables [-I 鏈名] [-t 表名] [-p 條件] [-j 控制類型]- 參數詳解
-A:在鏈的末尾追加一條規則
-I:在鏈的開頭(或指定序號)插入一條規則
-L:列出所有的規則條目
-n:以數字形式顯示規則信息(協議解釋成數字)
-v:以更詳細的方式顯示規則信息
--line-numbers:查看規則時,顯示規則的序號
-D:刪除鏈內指定序號(或內容)的一條規則
-F:清空所有的規則
-P:為指定的鏈設置默認規則(一條沒有匹配上,按照默認規則走)- 註意事項
不指定表名時,默認指filter表
不指定鏈名時,默認指定表內的所有鏈
除非設置鏈的默認策略,否則必須指定匹配條件
選項、鏈名、控制類型使用大寫字母,其余均為小寫- 數據包的常見控制類型
ACCEPT:允許通過
DROP:直接丟棄,不給出任何回應
REJECT:拒絕通過,必要時會給出提示
LOG:記錄日誌信息,然後傳給下一跳規則繼續匹配
規則的匹配類型
1、通用匹配(可直接使用,不依賴於其他條件或擴展)
常見的通用匹配條件
協議匹配:-p 協議名
地址匹配:-s 源地址、-d 目的地址
接口匹配:-i 入站網卡、-o 出站網卡
2、隱含匹配(要求以特定的協議匹配作為前提)
常見的通用匹配條件
端口匹配:--sport源端口、--dport目的端口
TCP標記匹配:--tcp-flags 檢查範圍 被設置的標記
ICMP類型匹配:--icmp-type ICMP類型
3、顯式匹配(要求以"-m擴展模塊”的形式明確指出類型)
常見的通用匹配條件
多端口匹配:-m multiport --sports 源端口列表;-m multiport --dports 目的端口列表
IP範圍匹配:-m iprange-src-range IP範圍
MAC地址匹配:-m mac --mac-source MAC地址
狀態匹配:-m state --state 連接狀態
實驗環境
- 系統環境:centos6.5
- 內網IP:192.168.100.77/24
- 公網IP:172.16.16.101/24
- 網關防火墻:
公網網網卡:eth0:172.16.16.254
內網網卡:eth1:192.168.100.254
實驗論證
準備工作
1、清空防火墻規則、關閉Selinux
[root@Init5 ~]# vim /etc/sysconfig/selinux
[root@Init5 ~]# reboot #重啟
[root@Init5 ~]# /etc/init.d/iptables stop #清空防火墻規則
2、查看網卡信息
[root@Init5 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 #查看網關防火墻公網網卡信息
[root@Init5 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 #查看網關防火墻內網網卡信息
[root@client ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 #查看公網網卡信息
[root@redhat6 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 #查看內網網卡信息
3、開啟網關防火墻路由功能
[root@Init5 ~]# vim /etc/sysctl.conf #配置一些系統信息以及內核參數
[root@Init5 ~]# sysctl -p #重新加載配置文件
4、測試互聯互通
[root@client ~]# ping -c 3 172.16.16.254 #公網服務器ping公網網關
[root@client ~]# ping -c 3 192.168.100.77 #公網服務器ping內網服務器
一、iptables語法詳解
1、內網ICMP設置DROP,網關防火墻ping是什麽效果?
[root@redhat6 ~]# iptables -I INPUT -p ICMP -j DROP #拒絕其他主機ping通此主機
[root@Init5 ~]# ping 192.168.100.77
[root@Init5 ~]# /etc/init.d/iptables stop #網關防火墻清空iptables規則
2、內網ICMP設置REJECT,網關防火墻ping是什麽效果?
[root@redhat6 ~]# iptables -I INPUT -p ICMP -j REJECT #內網設置REJECT
[root@Init5 ~]# ping -c 4 192.168.100.77
[root@Init5 ~]# /etc/init.d/iptables stop #網關防火墻清空iptables規則
3、內網ICMP設置LOG,內網網關ping是什麽效果?
[root@redhat6 ~]# iptables -I INPUT -j LOG #內網設置LOG
[root@redhat6 ~]# tail -f /var/log/messages #監視日誌文件
[root@Init5 ~]# ping -c 4 192.168.100.77 #網關服務器ping內網
此時切換內網,查看監視日誌
[root@Init5 ~]# /etc/init.d/iptables stop #網關防火墻清空iptables規則
4、設置默認規則
[root@redhat6 ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT #為了連接Xshell遠程連接,將22端口設置為允許
[root@redhat6 ~]# iptables -P INPUT DROP #默認除了22端口,其余走默認,全部禁掉,根據業務需要,再將允許的端口添加
5、添加iptables新規則
[root@redhat6 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT #在第一行插入此規則
[root@redhat6 ~]# iptables -L -n --line-numbers
[root@redhat6 ~]# iptables -A INPUT -p tcp --dport 21 -j DROP #在行尾追加此規則
6、查看防火墻規則
[root@redhat6 ~]# iptables -L
[root@redhat6 ~]# iptables -L -n
[root@redhat6 ~]# iptables -L -n --line-numbers
7、刪除、清空規則
[root@redhat6 ~]# iptables -D INPUT -p tcp --dport 21 -j DROP #指定防火墻內容規則進行刪除
[root@redhat6 ~]# iptables -D INPUT 1 #指定序列進行刪除
[root@redhat6 ~]# iptables -P INPUT ACCEPT #註意一下哈,我之前設了一個默認是拒絕所有入站,現在改掉,否則演示清空規則的時候,使用xshell連接,會直接被踢掉
[root@redhat6 ~]# iptables -F #不加-t,默認過濾,相當與-t filter,也就是INPUT OUTPUT FWORD都清空
#繼續添加一些新規則
[root@redhat6 ~]# iptables -I OUTPUT -p icmp -j DROP
[root@redhat6 ~]# iptables -I INPUT -p icmp -j DROP
[root@redhat6 ~]# iptables -n -L --line-numbers
[root@redhat6 ~]# iptables -F OUTPUT #清除所有出站
[root@redhat6 ~]# iptables -n -L --line-numbers
二、通用匹配
1、協議匹配:-p 協議名
[root@redhat6 ~]# /etc/init.d/iptables stop #實驗之前清空防火墻
①.內網設置
[root@redhat6 ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT #允許我連接Xshell
[root@redhat6 ~]# iptables -P INPUT DROP #進站默認一律丟棄
[root@redhat6 ~]# iptables -P FORWARD DROP #通過此主機進行數據轉發,又不是網關防火墻先丟棄
[root@redhat6 ~]# /etc/init.d/httpd start #開啟Web服務
[root@redhat6 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT #雖然之前進站默認設置的是丟棄,但是此時添加這條語句也是可以訪問Web服務器,用什麽開啟什麽就可以了
②.網關設置
[root@redhat6 ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT #先保證Xshell可以使用
[root@redhat6 ~]# iptables -P INPUT DROP #目前為止除了22端口,其余進站全禁掉
③.公網訪問內網
[root@client ~]# elinks 192.168.100.77
④.網關添加新規則
[root@Init5 ~]# iptables -P FORWARD DROP #將數據轉發默認全部丟棄掉
⑤.公網再次訪問內網
[root@client ~]# elinks 192.168.100.77
2、地址匹配:-s 源地址、-d 目的地址
①.網關設置
[root@Init5 ~]# iptables -I FORWARD -d 192.168.100.77 -p tcp -j ACCEPT #要註意,即使添加了此項,外網主機依然無法訪問,此時只允許了去訪問了,並沒有允許數據包回來
[root@Init5 ~]# iptables -I FORWARD -s 192.168.100.77 -p tcp -j ACCEPT #添加此項允許數據包回來
②.公網再次訪問內網
[root@client ~]# elinks 192.168.100.77
3、接口匹配:-i 入站網卡、-o 出站網卡
①.網關設置
[root@Init5 ~]# iptables -t nat -A PREROUTING -i eth0 -d 172.16.16.254 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.77
#這裏做了一個DNAT地址轉換,下一個帖子會詳細介紹,是將公網網關172.16.16.254/24轉換成192.168.100.77/24內網IP地址訪問
[root@Init5 ~]# iptables -I FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT #這裏設置了允許入站網卡eth0轉發tcp協議80端口的服務。此時是允許訪問內網主機
[root@Init5 ~]# iptables -I FORWARD -i eth0 -p tcp --dport 80 -j DROP #將丟棄80服務的規則放在第一條
②.公網訪問內網
[root@client ~]# elinks 172.16.16.254
③.網關設置
[root@Init5 ~]# iptables -D FORWARD -i eth0 -p tcp --dport 80 -j DROP #清除丟棄訪問80服務的規則
④.公網訪問內網
[root@client ~]# elinks 172.16.16.254
⑤.網關設置
[root@Init5 ~]# iptables -I FORWARD -s 192.168.100.0/24 -p tcp --sport 80 -j DROP
[root@Init5 ~]# iptables -I FORWARD -o eth0 -s 192.168.100.0/24 -p tcp --sport 80 -j DROP
#註意一下,在轉發過程中,源地址是192.168.100.0/24網段,源端口是80的,全部禁掉
⑥.公網再次訪問內網
[root@client ~]# elinks 172.16.16.254 #無法訪問
三、隱含匹配
1、端口匹配:--sport源端口、--dport目的端口
[root@Init5 ~]# /etc/init.d/iptables stop #實驗之前清空防火墻
①.網關設置(基本上DNS上在網關型防火墻設置如下)
[root@Init5 ~]# iptables -I FORWARD -s 192.168.1.0/24 -p udp --dport 53 -j ACCEPT
[root@Init5 ~]# iptables -I FORWARD -d 192.168.1.0/24 -p udp --sport 53 -j ACCEPT
[root@Init5 ~]# iptables -I FORWARD -d 192.168.1.0/24 -p tcp --sport 53 -j ACCEPT
[root@Init5 ~]# iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 53 -j ACCEPT
②.內網(主機型)
[root@redhat6 ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT #冒號代表連續的端口
[root@redhat6 ~]# iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
2、TCP標記匹配:--tcp-flags 檢查範圍 被設置的標記
寫法1:
[root@redhat6 ~]# iptables -I INPUT -i eth0 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP #SYN被標記,直接丟棄
寫法2:
[root@redhat6 ~]# iptables -I INPUT -i eth0 -p tcp ! --tcp-flags SYN,RST,ACK SYN -j ACCEPT #!代表邏輯非
此時查看Xshell
3、 ICMP類型匹配:--icmp-type ICMP類型
"8"作用:對應ICMP請求,禁止其他機子ping本機
①.內網設置
[root@redhat6 ~]# /etc/init.d/iptables stop #實驗之前清空防火墻
[root@redhat6 ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP #8代表禁止其他機子ping本機
[root@redhat6 ~]# ping -c 4 172.16.16.101
②.公網ping內網
[root@client ~]# ping -c 4 192.168.100.77
"0"作用:對應ICMP回顯應答(ping應答)
①.內網設置
[root@redhat6 ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
[root@redhat6 ~]# iptables -P INPUT DROP #進站時機設置默認丟棄
[root@redhat6 ~]# ping 192.168.100.254 #此時自己的網關也無法ping通
[root@redhat6 ~]# iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT #回顯應答(ping應答)
[root@redhat6 ~]# ping 192.168.100.254
"3"作用:對應ICMP目標不可達
①.內網
[root@redhat6 ~]# iptables -I INPUT -p icmp --icmp-type 3 -j ACCEPT
[root@redhat6 ~]# ping 192.168.100.254 #網關能ping通
②.網關防火墻
[root@Init5 ~]# iptables -I INPUT -p icmp --icmp-type 3 -j REJECT
[root@Init5 ~]# iptables -I INPUT -p icmp -j REJECT
③.內網
[root@redhat6 ~]# ping 192.168.100.254
[root@redhat6 ~]# iptables -I INPUT -p icmp --icmp-type 3 -j DROP
[root@redhat6 ~]# ping -c 3 192.168.100.254
四、顯示匹配
1、 多端口匹配:-m multiport --sports 源端口列表;-m multiport --dports 目的端口列表
[root@redhat6 ~]# /etc/init.d/iptables stop #實驗之前清空防火墻
[root@Init5 ~]# /etc/init.d/iptables stop
[root@redhat6 ~]# iptables -I INPUT -p tcp -m multiport --dports 20,25,80,443,100,53 -j ACCEPT
2、IP範圍匹配:-m iprange-src-range IP範圍
①.網關設置
[root@Init5 ~]# iptables -A INPUT -p icmp -m iprange --src-range 192.168.100.50-192.168.100.200 -j DROP #丟棄掉"192.168.1.50-192.168.1.200"網段,不允許ping
②.內網測試
[root@redhat6 ~]# ping -c4 192.168.100.254
3、MAC地址匹配:-m mac --mac-source MAC地址(註意!!!!!!經過一個路由MAC地址就變了)
①.網關設置
[root@Init5 ~]# iptables -D INPUT -p icmp -m iprange --src-range 192.168.100.50-192.168.100.200 -j DROP #清除規則
[root@Init5 ~]# iptables -A INPUT -m mac --mac-source 00:0C:29:03:B1:BA -j DROP
②.內網測試
[root@redhat6 ~]# ping -c4 192.168.100.254
4、 狀態匹配:-m state --state 連接狀態
常見的連接狀態包括
NEW:與任何連接無關的(客戶端發送請求給服務器端,服務器端還沒有進行處理)
ESTABLISHED:響應請求或已建立連接的
RELATED:與已有連接有相關性的,如FTP數據連接(客戶端訪問服務器端FTP,21端口已經連接,當20端口要建立的時候,就屬於RELATED)
三臺機子全部清掉防火墻
[root@Init5 ~]# /etc/init.d/iptables stop
①.內網設置
[root@redhat6 ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
[root@redhat6 ~]# iptables -P INPUT DROP #此時只有22端口可以進去,除此之外啥都不行
[root@redhat6 ~]# ping 192.168.100.254 #ping網關不通
[root@redhat6 ~]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
[root@redhat6 ~]# ping 192.168.100.254 #可以ping通
[root@raid ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #設置與ftp相關連
[root@raid ~]# iptables -I INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT #與任何連接無關
純幹貨詳解iptables工作原理以及使用方法