1. 程式人生 > >純幹貨詳解iptables工作原理以及使用方法

純幹貨詳解iptables工作原理以及使用方法

rip -a sports 公網 寫法 內網ip 行處理 外部 是否

簡介

網絡中的防火墻,是一種將內部和外部網絡分開的方法,是一種隔離技術。防火墻在內網與外網通信時進行訪問控制,依據所設置的規則對數據包作出判斷,最大限度地阻止網絡中不法分子破壞企業網絡,從而加強了企業網絡安全。

防火墻的分類

硬件防火墻,如思科的ASA防火墻,H3C的Secpath防火墻等
軟件防火墻,如iptables、firewalld等

Linux包過濾防火墻簡介

1、Linux操作系統中默認內置一個軟件防火墻,即iptables防火墻
2、netfilter位於Linux內核中的包過濾功能體系,又稱為模塊,並且自動加載,是內核很小的一部分稱為Linux防火墻的“內核態”,註意,真正生效的是內核態。

3、iptables位於/sbin/iptables,用來管理防火墻規則的工具稱為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個時機做標記。

nat表:包含了PREROUTING、OUTPUT、POSTROUTING。註意在這3個時機進行ip或端口修改。
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工作原理以及使用方法