一:Linux 防火牆基礎:
Linux防火牆體系主要工作在網絡層,針對TCP/IP數據包實施過濾和限制,屬於典型的包過濾防火牆(也稱網絡層防火牆);
Linux防火牆體系基於內核編碼實現,具有非常穩定的性能和高效率,因此被廣泛的應用。
1.Netfilter和iptables的區別:
-
Netfilter:指的是Linux內核中實現包過濾防火牆的內部結構,不以程序或文件的形式存在,屬於“內核態”(KernelSpace,又稱內核空間)的防火牆功能體系;
-
Iptables:指的是用來管理Linux防火牆的命令程序,通常位於/sbin/iptables,屬於“用戶態”(UserSpace,又稱用戶空間)的防火牆管理體系;
2.包過濾的工作層次:
主要是網絡層,針對IP數據包;體現在對包內的IP地址、端口等信息的處理上;
3.Iptables 的表、鏈結構:
iptables作用:爲包過濾機制的實現提供規則(或策略),通過各種不同的規則,告訴netfilter對來自某些源、前往某些目的或具有某些協議特徵的數據包應該如何處理。
規則鏈:
-
規則的作用:對數據包進行過濾或處理
-
鏈的作用:容納各種防火牆規則
-
鏈的分類依據:處理數據包的不同時機
默認包括5種規則鏈
-
INPUT:處理入站數據包
-
OUTPUT:處理出站數據包
-
FORWARD:處理轉發數據包
-
POSTROUTING鏈:在進行路由選擇後處理數據包(對數據鏈進行源地址修改轉換)
-
PREROUTING鏈:在進行路由選擇前處理數據包(做目標地址轉換)
INPUT、OUTPUT鏈主要用在“主機型防火牆”中,即主要針對服務器本機進行保護的防火牆;而FORWARD、PREROUTING、POSTROUTING鏈多用在“網絡型防火牆”中。
規則表
-
表的作用:容納各種規則鏈
-
表的劃分依據:防火牆規則的作用相似
默認包括4個規則表:
-
raw表:確定是否對該數據包進行狀態跟蹤;對應iptable_raw,表內包含兩個鏈:OUTPUT、PREROUTING
-
mangle表:爲數據包的TOS(服務類型)、TTL(生命週期)值,或者爲數據包設置Mark標記,以實現流量整形、策略路由等高級應用。其對應iptable_mangle,表內包含五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
-
nat表:修改數據包中的源、目標IP地址或端口;其對應的模塊爲iptable_nat,表內包括三個鏈:PREROUTING、POSTROUTING、OUTPUT
-
filter表:確定是否放行該數據包(過濾);其對應的內核模塊爲iptable_filter,表內包含三個鏈:INPUT、FORWARD、OUTPUT
4.規則表之間的順序:
rawàmangleànatàfilter
規則鏈之間的順序
-
入站:PREROUTINGàINPUT
-
出站:OUTPUTàPOSTROUTING
-
轉發:PREROUTINGàFORWARDàPOSTROUTING
規則鏈內的匹配順序
-
按順序依次檢查,匹配即停止(LOG策略例外)
-
若找不到相匹配的規則,則按該鏈的默認策略處理
二:編寫防火牆規則:
iptables 的基本語法、控制類型:
語法構成: iptables [ -t 表名] 選項 [鏈名] [條件] [ -j 控制類型]
注意事項:
-
不指定表名時,默認指filter表
-
不指定鏈名時,默認指表內的所有鏈
-
除非設置鏈的默認策略,否則必須指定匹配條件
-
選項、鏈名、控制類型使用大寫字母,其餘均爲小寫
數據包的常見控制類型:
-
ACCEPT:允許通過
-
DROP:直接丟棄,不給出任何迴應
-
REJECT:拒絕通過,必要時會給出提示
-
LOG:在/var/log/messages文件中記錄日誌信息,然後傳給下一條規則繼續匹配(匹配即停止對LOG操作不起作用,因爲LOG只是一種輔助動作,並沒有真正的處理數據包)
eg:在filter表(-t filter)的INPUT鏈中插入(-I)一條拒絕(-jREJECT)發給本機的使用ICMP協議的數據包(-picmp):
在測試PC上ping 設置防火牆主機,查看結果是無法連接到端口:
添加、查看、刪除規則等基礎操作:
1、添加新的規則:
-
-A:在鏈的末尾追加一條規則;“-p協議名”
eg:在filter表INPUT鏈的末尾添加一條防火牆規則:
-
-I:在鏈的開頭(或指定序號)插入一條規則
eg:添加兩條規則分別位於filter表的第1條、第2條(其中省略了“-tfilter”選項,默認使用filter表)
2、查看規則列表:
-
-L:列出所有的規則條目
eg:查看filter表INPUT鏈中的所有規則,並顯示規則序號:
-
-n:以數字形式顯示地址、端口等信息
eg:以數字地址形式查看filter表INPUT鏈中的所有規則:
-
-v:以更詳細的方式顯示規則信息
-
–line-numbers:查看規則時,顯示規則的序號
刪除、清空規則:
-
-D:刪除鏈內指定序號(或內容)的一條規則
eg:刪除filter表INPUT鏈中的第2條規則:
-
-F:清空所有的規則
eg:清空filter表INPUT鏈中的所有規則:
設置默認策略:
當找不到任何一條能夠匹配的數據包的規則時,則執行默認策略(默認策略的控制類型爲ACCEPT(允許)、DROP(丟棄)兩種。
-
-P:爲指定的鏈設置默認規則
-
-X:刪除自定義的規則鏈
eg:將filter表中FORWARD鏈中的默認策略設爲丟棄,OUTPUT鏈的默認策略設爲允許
[root@iptables ~]# iptables -t filter -P FORWARD DROP
[root@iptables ~]# iptables -P OUTPUT ACCEPT
注意:當使用管理選項“-F”清空鏈,默認策略不受影響。因此若要修改默認策略,必須通過管理選項“-P”重新進行設置。默認策略並不參與鏈內規則的順序編排,因此在其他規則之前或之後設置並無區別。
3、規則的匹配條件:
a:通用匹配:
-
可直接使用,不依賴於其他條件或擴展
-
包括網絡協議、IP地址、網絡接口等條件
常見的通用匹配條件:
協議匹配:-p 協議名
(eg:tcp、udp、icmp、all(針對所有IP數據包)),可用的協議類型存放於Linux系統的/etc/procotols文件中;
eg:丟棄通過icmp協議訪問防火牆本機的數據包、允許轉發經過防火牆的除icmp協議以外的數據包:
[root@iptables ~]# iptables -I INPUT -p icmp -j DROP
[root@iptables ~]# iptables -A FORWARD -p ! icmp -j ACCEPT
地址匹配:-s 源地址、 -d 目的地址
可以是IP地址、網段地址,但不建議使用主機名、域名地址,因爲解析過程會影響效率
eg:拒絕轉發源地址爲192.168.10.100的數據、允許轉發源地址位於192.168.1.0/24網段的數據:
[root@iptables ~]# iptables -A FORWARD -s 192.168.10.100 -j REJECT
[root@iptables ~]# iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
當遇到小規模的網絡掃描或攻擊時,封IP地址是比較有效的方式。
eg:添加防火牆規則封鎖來自172.16.16.0/24網段的頻繁掃描、登錄窮舉等不良企圖:
[root@iptables ~]# iptables -I INPUT -s 172.16.16.0/24 -j DROP
[root@iptables ~]# iptables -I FORWARD -s 172.16.16.0/24 -j DROP
接口匹配:-i 入站網卡、-o 出站網卡
eg:丟棄從外網接口eth0訪問防火牆本機且源地址爲私有地址的數據包:
[root@iptables ~]# iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
b:隱含匹配:
-
要求以特定的協議匹配作爲前提
-
包括端口、TCP標記、ICMP類型等條件
常用的隱含匹配條件:
端口匹配:–sport 源端口、–dport 目的端口
單個端口號或者以冒號“:”分隔的端口範圍都是可以接受的,但不連續的多個端口不能採用這種方式。
eg:允許爲網段192.168.1.0/24轉發DNS查詢數據包:
[root@iptables ~]# iptables -A FORWARD -s 192.168.1.0/24 -p udp –dport 53 -j ACCEPT
[root@iptables ~]# iptables -A FORWARD -d 192.168.1.0/24 -p udp –sport 53 -j ACCEPT
eg:構建vsftpd服務器時,開放20、21端口,以及用於被動模式的端口範圍24500~24600:
[root@iptables ~]# iptables -A INPUT -p tcp –dport 20:21 -j ACCEPT
[root@iptables ~]# iptables -A INPUT -p tcp –dport 24500:24600 -j ACCEPT
TCP標記匹配:–tcp-flags 檢查範圍 被設置的標記
針對協議爲TCP、用來檢查數據包的標記位(–tcp-flags);
“檢查範圍”指出需要檢查數據包的哪幾個標記,“被設置的標記”則明確匹配對應值爲1的標記,多個標記之間以逗號進行分隔。
eg:拒絕從外網接口eth0直接訪問防火牆本機的TCP請求,但允許其他主機發給防火牆的TCP等響應數據包請求:
[root@iptables ~]# iptables -P INPUT DROP
[root@iptables ~]# iptables -I INPUT -i eth0 -p tcp –tcp-flags SYN,RST,ACK SYN -j DROP
[root@iptables ~]# iptables -I INPUT -i eth0 -p tcp –tcp-flags ! –syn -j ACCEPT
“–syn”用來兼容舊版本iptables的形式,等同於“–tcp-flags SYN,RST,ACK SYN”
ICMP類型匹配:–icmp-type ICMP類型
ICMP類型使用字符串或數字代碼表示:
-
Echo-Request代碼爲8——表ICMP請求;
-
Echo-Reply代碼爲0——ICMP回顯;
-
Destination-Unreachable代碼爲3——ICMP目標不可達;
eg:禁止從其他主機ping本機,但是允許本機ping其他主機:
[root@iptables ~]# iptables -A INPUT -p icmp –icmp-type 8 -j DROP
[root@iptables ~]# iptables -A INPUT -p icmp –icmp-type 0 -j ACCEPT
[root@iptables ~]# iptables -A INPUT -p icmp –icmp-type 3 -j ACCEPT
[root@iptables ~]# iptables -A INPUT -p icmp -j DROP
查看可用的ICMP協議類型:iptables -p icmp -h
c:顯式匹配:
-
要求以“-m 擴展模塊”的形式明確指出類型
-
包括多端口、MAC地址、IP範圍、數據包狀態等條件
常用的顯式匹配條件:
多端口匹配:-m multiport –sports 源端口列表
-m multiport –dports 目的端口列表
eg:允許本機開放25、80、110、143端口,以便提供電子郵件服務:
[root@iptables ~]# iptables -A INPUT -p tcp -m multiport –dport 25,80,110,143 -j ACCEPT
IP範圍匹配:-m iprange –src-range IP範圍
用來檢查數據包的源地址、目標地址,其中IP範圍採用“起始地址—結束地址”的形式:
eg:禁止轉發源IP地址位於192.168.1.10與192.168.1.20之間的TCP數據包:
[root@iptables ~]# iptables -A FORWARD -p tcp -m iprange –src-range 192.168.1.10-192.168.1.20 -j ACCEPT
MAC地址匹配:-m mac –mac-source MAC地址
因爲MAC地址的侷限性,此類匹配一般只適用於內部網絡。
eg:根據MAC地址封鎖主機,禁止其訪問本機的任何應用:
[root@iptables ~]# iptables -A INPUT -m mac –mac-source 00:01:02:03:04:cc -j DROP
狀態匹配:-m state –state 連接狀態
-
基於iptables的狀態跟蹤機制用來檢查數據包的連接狀態(State)
-
常見的連接狀態包括NEW(與任何連接無關的)、ESTABLISHED(響應請求或者已建立連接的)、RELATED(與已有連接有相關性的,eg:FTP數據連接)。
eg:禁止轉發與正常TCP連接無關的非“–syn”請求數據包(如僞造的一些網絡攻擊數據包):
[root@iptables ~]# iptables -A FORWARD -m state –state NEW -p tcp ! –syn -j DROP
eg:只開放本機的web服務(80端口),但對發給本機的TCP應答數據包予以放行,其他入站數據包均丟棄:
[root@iptables ~]# iptables -I INPUT -p tcp -m multiport –dport 80 -j ACCEPT
[root@iptables ~]# iptables -I INPUT -p tcp -m state –state ESTABLISHED -j ACCEPT
[root@iptables ~]# iptables -P INPUT DROP
iptables 防火牆首次配置介紹就到這裏了,希望對大家有幫助!