防火牆( FireWall )是一套網路防御系統,具有隔離功能,工作在網絡或主機邊緣,對進出網絡或主機的數據包基於一定的規則檢查,並在匹配某規則時由規則定義的行為進行處理的一組功能的組件,基本上 的實現都是默認情況下關閉所有的通過型訪問,只開放允許訪問的策略。
防火牆基礎概念和原理
防火牆的分類
按服務分為:主機防火牆和網絡防火牆
按實現方式分為:硬件防火牆和軟件防火牆
按OSI七層網絡模型可分為:網絡層防火牆和應用層防火牆
其中需要說明的是對於網絡層防火牆和應用層防火牆來說各有優缺點:
網絡層防火牆:對數據包進行選擇,選擇的依據是系統內設置的過濾邏輯 ,被稱為訪問控制列表(ACL),通過檢查數據流中每個數據的 源地址,目的地址,所用端口號和協議狀態等因素,或他們的組 合來確定是否允許該數據包通過 。 優點:對用戶來說透明,處理速度快且易於維護 ;缺點:無法檢查應用層數據,如病毒等
應用層防火牆/代理服務型防火牆(Proxy Service):將所有跨越防火牆的網絡通信鏈路分為兩段,內外網用戶的訪問都是通過代理服務器上的“鏈接”來實現。優點:在應用層對數據進行檢查,比較安全;缺點:增加防火牆的負載
現實生產環境中所使用的防火牆一般都是二者結合體 :即先檢查網絡數據,通過之后再送到應用層去檢查
實際上防火牆是linux的Netfilter組件,工作在內核空間並集成在linux內核中 ,通過各種二進制程序或其他軟件來控制。
在linux內核中選取五個位置放了五個hook(勾子) function (INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING),用戶可以通過一個命令工具(iptables)向其寫入規則
網絡傳輸報文流向:
- 流入本機:PREROUTING --> INPUT-->用戶空間進程
- 流出本機:用戶空間進程 -->OUTPUT--> POSTROUTING
- 轉發:PREROUTING --> FORWARD --> POSTROUTING
iptables由四個表和五個鏈以及一些規則組成
四個表 table:filter、nat、mangle、raw
- filter表:過濾規則表,根據預定義的規則過濾符合條件的數據包
- nat表:network address translation 地址轉換規則表
- mangle:修改數據標記位規則表
- Raw:關閉NAT表上啟用的連接跟蹤機制,加快封包穿越防火牆速度
優先級由高到低的順序為:raw-->mangle-->nat-->filter
Netfilter表和鏈對應關系
當一個數據包進入網卡時,數據包首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去
如果數據包就是進入本機的,數據包就會沿着圖向下移動,到達INPUT鏈。數據包到達INPUT鏈后,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包經過OUTPUT鏈 ,然后到達POSTROUTING鏈輸出
如果數據包是要轉發出去的,且內核允許轉發,數據包就會向右 移動,經過FORWARD鏈,然后到達POSTROUTING鏈輸出
規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作作出處理
- 基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
- 擴展匹配:通過復雜高級功能匹配
處理動作:稱為target,跳轉目標內建處理動作:ACCEPT、DROP、REJECT、SNAT、DNAT 、MASQUERADE、MARK、LOG...
規則要添加在鏈上,才生效;
iptables的rules添加法則
- 同類規則(訪問同一應用),匹配范圍小的放上面
- 不同類規則(訪問不同應用),匹配到報文頻率較大的放上面
- 將那些可由一條規則描述的多個規則合並為一個
- 設置默認策略
防火牆進階(規則設定)
規則格式: iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-targetoptions]
-t table: raw, mangle, nat, [filter]默認
SUBCOMMAND:
1、鏈管理:
- -N:new, 自定義一條新的規則鏈
- -X:delete,刪除自定義的空的規則鏈
- -P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有: ACCEPT:接受 DROP:丟棄
- -E:重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名, 也不能被刪除
2、查看:
- -L:list, 列出指定鏈上的所有規則,本選項須置后
- -n:numberic,以數字格式顯示地址和端口號
- -v:verbose,詳細信息
- -vv 更詳細
- -x:exactly,顯示計數器結果的精確值,而非單位轉換后的 易讀值 --line-numbers:顯示規則的序號
常用組合: --vnL、 --vvnxL 、--line-numbers
-S selected,以 iptables-save 命令格式顯示鏈上規則
3、規則管理:
- -A:append,追加
- -I:insert, 插入,要指明插入至的規則編號,默認為第一條
- -D:delete,刪除 (1) 指明規則序號 (2) 指明規則本身
- -R:replace,替換指定鏈上的指定規則編號
- -F:flush,清空指定的規則鏈
- -Z:zero,置零 iptables的每條規則都有兩個計數器 (1) 匹配到的報文的個數 (2) 匹配到的所有報文的大小之和
匹配條件
基本:通用的,PARAMETERS
擴展:需加載模塊,MATCH EXTENTIONS 加載模塊用法:-m module-name --options ...
處理動作:
-j targetname [per-target-options]
- ACCEPT,
- DROP
- REJECT:--reject-with:icmp-port-unreachable默認
- RETURN:返回調用鏈 REDIRECT:端口重定向
- LOG:記錄日志,dmesg
- MARK:做防火牆標記
- DNAT:目標地址轉換
- SNAT:源地址轉換
- MASQUERADE:地址偽裝 ...
示例:
iptables -A INPUT -s 172.18.64.0/24 -d 172.18.64.107 -p tcp -m multiport --dports 20:22, 80 -j ACCEPT
iptables -A INPUT -d 172.18.64.107 -p tcp --dport 80 -m iprange --src-range 172.18.64.17- 172.18.64.97 -j DROP
iptables -A INPUT -s 172.18.64.106 -m mac --macsource 40:5E:5C:6E:9D:7A -j ACCEPT
iptables -A INPUT -s 172.18.64.17 -j REJECT
iptables -A OUTPUT -s 172.18.64.106 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
iptables -A INPUT -s 172.18.64.0/16 -d 172.18.64.107 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun -j DROP (默認以格林日志時間為准!即北京時間-8)
iptables -A INPUT -d 172.18.64.107 -p tcp --dport 22 -m connlimit --connlimit-above(upto) 2 -j REJECT
iptables -I INPUT -d 172.18.100.107 -p icmp --icmptype 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
iptables -A INPUT -d 172.18.64.107 -p tcp -m multiport -- dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.18.64.106 -p tcp -m multiport - -sports 22,80 -m state --state RELATED,INVALID -j ACCEPT
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multimport - -dports 80,21,22,23 -m state --state NEW -j LOG -- log-prefix "new connections:"
state擴展 :根據”連接追蹤機制“去檢查連接的狀態,較耗資源
conntrack機制:追蹤本機上的請求和響應之間的關系 ,狀態有如下幾種:
- NEW:新發出請求;連接追蹤信息庫中不存在此連接的 相關信息條目,因此,將其識別為第一次發出的請求
- ESTABLISHED:NEW狀態之后,連接追蹤信息庫中為 其建立的條目失效之前期間內所進行的通信狀態
- RELATED:新發起的但與已有連接相關聯的連接,如: ftp協議中的數據連接與命令連接之間的關系
- INVALID:無效的連接,如flag標記不正確
- UNTRACKED:未進行追蹤的連接,如raw表中關閉追蹤
已經追蹤到的並記錄下來的連接信息庫 /proc/net/nf_conntrack
調整連接追蹤功能所能夠容納的最大連接數量 /proc/sys/net/nf_conntrack_max
不同的協議的連接追蹤時長 /proc/sys/net/netfilter/
開放被動模式的ftp服務
modprobe nf_conntrack_ftp
iptables -F
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state -- state NEW -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
使用iptables命令定義的規則,手動刪除之前,其生效期限為 kernel存活期限
保存規則: 保存規則至指定的文件
CentOS 6 service iptables save 將規則覆蓋保存至/etc/sysconfig/iptables文件中
CentOS 7 可用下面方法保存規則 iptables -S > /PATH/TO/SOME_RULES_FILE 或:iptables-save > /PATH/TO/SOME_RULES_FILE
載入防火牆規則:
CentOS 6: service iptables restart 會自動從/etc/sysconfig/iptables 重新載入規則
CentOS 7 重新載入預存規則文件中規則: iptables-restore < /PATH/FROM/SOME_RULES_FILE
防火牆高級應用
網絡防火牆:
iptables/netfilter網絡防火牆: (1) 充當網關 (2) 使用filter表的FORWARD鏈
注意的問題:
(1) 請求-響應報文均會經由FORWARD鏈,要注意規則 的方向性
(2) 如果要啟用conntrack機制,建議將雙方向的狀態為 ESTABLISHED的報文直接放行
NAT: network address translation PREROUTING,INPUT,OUTPUT,POSTROUTING
- SNAT:source NAT POSTROUTING, INPUT 讓本地網絡中的主機通過某一特定地址訪問外部網絡,實 現地址偽裝 請求報文:修改源IP
- DNAT:, OUTPUT 把本地網絡中的主機上的某服務開放給外部網絡訪問(發 布服務和端口映射),但隱藏真實IP 請求報文:修改目標IP
- PNAT: port nat,端口和IP都進行修改
SNAT :nat表的target,固定IP iptables -t nat -A POSTROUTING - s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
示例: iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j SNAT --to-source 172.18.64.6- 172.18.64.9
SNAT :MASQUERADE:動態IP,如撥號網絡 iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
示例: iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j MASQUERADE
DNAT :iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
示例: iptables -t nat -A PREROUTING -s 0/0 -d 172.18.64.6 -p tcp --dport 22 -j DNAT --todestination 10.0.1.22
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --todestination 10.0.1.22:8080
轉發 :REDIRECT:通過改變目標IP和端口,將接受的包轉發至不同地址 --to-ports port[-port]
示例: iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIECT --to-ports 8080
CentOS 7.x補充
firewalld是CentOS 7.0新推出的管理netfilter的工具 ,firewalld是配置和監控防火牆規則的系統守護進程。可以實 現iptables,ip6tables,ebtables的功能,firewalld服務由firewalld包提供,firewalld支持划分區域zone,每個zone可以設置獨立的防火牆規則
歸入zone順序:
- 先根據數據包中源地址,將其納為某個zone
- 納為網絡接口所屬zone
- 納入默認zone,默認為public zone,管理員可以改為其它zone
網卡默認屬於public zone,lo網絡接口屬於trusted zone
firewalld zone分類:
三種配置方法
- firewall-config (firewall-config包)圖形工具
- firewall-cmd (firewalld包)命令行工具
- /etc/firewalld 配置文件,一般不建議
CentOS7.x使用firewalld同時兼容iptables,而firewalld的rich規則更加靈活,會一種即可,在此不做過多介紹。
一些常用的iptables規則樣例:
iptables -N clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 172.18.255.255 -p icmp -j DROP
iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 172.18.64.7 -j RETURN
iptables -A INPUT -d 172.16.100.7 -j clean_in
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth37 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
iptables -A INPUT -i eth37 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
iptables -A INPUT -i eth37 -p udp --dport 1026 -j DROP
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
總結:防火牆原理比較復雜,但真正實現起來非常簡單,iptables的一系列命令而已,非常靈活強大!平時多練習就能更好掌握其用法!