防火牆:
netfilter/iptables是集成在Linux2.4.X版本內核中的包過濾防火牆系統。該架構可以實現數據包過濾,網絡地址轉換以及數據包管理功能。linux中防火牆分為兩部分:netfilter和iptables。netfilter位於內核空間,目前是Linux內核的組成部分。netfilter可以對本機所有流入,流出。轉發的數據包進行查看,修改,丟棄,拒絕等操作。netfilter位於內核空間中,用戶無法接觸內核和修改內核,需要使用iptables或Firewalld等工具。
防火牆模塊位於/lib/modules/`uname -r `/kernel/net/netfilter目錄下,需要某個模塊可以通過modprobe加載該模塊。
iptables是組成Linux平台下的包過濾防火牆,與大多數的Linux軟件一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網絡地址轉換(NAT)等功能。在日常Linux運維工作中,經常會設置iptables防火牆規則,用來加固服務安全。
CENTOS7中在原有netfilter/iptables架構基礎上添加了firewalld。iptables僅可以調整ipv4的防火牆規則。centos7中默認是用Firewalld作為用戶的防火牆工具,當用戶使用firewalld編寫ipv4防火牆規則時,firewalld依然調用底成的iptables實現具體功能。
傳統iptables如何使用。
iptables的規則表和鏈
表(tables):提供特定的功能,iptables內置了4個表,即
filter表(實現包過濾)
nat表(網絡地址轉換)
mangle表(修改數據標記位規則表)
raw表(跟蹤數據表規則表)
鏈(chains):當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的默認策略來處理數據包。
INPUT(入站數據過濾)
OUTPUT(出站數據過濾)
FORWARD(轉發數據過濾)
PREROUTING(路由前過濾)
POSTROUTING(路由后過濾)
-->PREROUTING-->路由決定----->FORWARD------------->POSTROUTING | ^ | | INPUT--->LOCAL PRECESS-->OUTPUT
1)外部主機發送到數據包給防火牆本機,數據經過PREROUTING鏈和INPUT鏈
2)防火牆本機發送數據包到外部主機,數據經過OUTPUT和POSTROUTING
3)防火牆作為路由負責轉發數據,數據經過PREROUTING,FORWARD,POSTROUTING.
1)當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
2)如果數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈后,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然后到達POSTROUTING鏈輸出。
3)如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然后到達POSTROUTING鏈輸出。
規則概念
規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息 包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。
當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept),拒絕(reject)和丟棄(drop)等。配置防火牆的主要工作是添加,修改和刪除等規則。
其中:
匹配(match):符合指定的條件,比如指定的 IP 地址和端口。
丟棄(drop):當一個包到達時,簡單地丟棄,不做其它任何處理。
接受(accept):和丟棄相反,接受這個包,讓這個包通過。
拒絕(reject):和丟棄相似,但它還會向發送這個包的源主機發送錯誤消息。這個錯誤消息可以指定,也可以自動產生。
目標(target):指定的動作,說明如何處理一個包,比如:丟棄,接受,或拒絕。
跳轉(jump):和目標類似,不過它指定的不是一個具體的動作,而是另一個鏈,表示要跳轉到那個鏈上。
規則(rule):一個或多個匹配及其對應的目標。
防火牆的語法格式
1)iptables的基本語法格式
iptables [-t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]
iptables -t 表名 <-A/I/D/R> 規則鏈名 [規則號] <-i/o 網卡名> -p 協議名 <-s 源IP/源子網> --sport 源端口 <-d 目標IP/目標子網> --dport 目標端口 -j 動作
說明:
表名、鏈名:用於指定iptables命令所操作的表和鏈;
命令選項:用於指定管理iptables規則的方式(比如:插入、增加、刪除、查看等;
條件匹配:用於指定對符合什么樣 條件的數據包進行處理;
目標動作或跳轉:用於指定數據包的處理方式(比如允許通過、拒絕、丟棄、跳轉(Jump)給其它鏈處理。
2)iptables命令的基本參數
-P 設置默認策略:iptables -P INPUT (DROP ACCEPT) -F 清空規則鏈 -L 查看規則鏈 -A 在規則鏈的末尾加入新規則 -I num 在規則鏈的頭部加入新規則 -D num 刪除某一條規則 -s 匹配來源地址IP/MASK,加嘆號"!"表示除這個IP外。 -d 匹配目標地址 -i 網卡名稱 匹配從這塊網卡流入的數據 -o 網卡名稱 匹配從這塊網卡流出的數據 -p 匹配協議,如tcp,udp,icmp --dport num 匹配目標端口號 --sport num 匹配來源端口號
常用命令: -A 追加規則-->iptables -A INPUT -D 刪除規則-->iptables -D INPUT 1(編號) -R 修改規則-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代現行規則,順序不變(1是位置) -I 插入規則-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一條規則,原本位置上的規則將會往后移動一個順位 -L 查看規則-->iptables -L INPUT 列出規則鏈中的所有規則,默認是filter表,如果列出nat表的規則需要添加-t,即iptables -t nat -L -N 新的規則-->iptables -N allowed 定義新的規則 通用參數: -p 協議 例:iptables -A INPUT -p tcp -s源地址 例:iptables -A INPUT -s 192.168.1.1 -d目的地址 例:iptables -A INPUT -d 192.168.12.1 -sport源端口 例:iptables -A INPUT -p tcp --sport 22 -dport目的端口 例:iptables -A INPUT -p tcp --dport 22 -i指定入口網卡 例:iptables -A INPUT -i eth0 -o指定出口網卡 例:iptables -A FORWARD -o eth0 -j 指定要進行的處理動作
常用的ACTION: DROP:丟棄 REJECT:明示拒絕 ACCEPT:接受 SNAT基於原地址的轉換 source--指定原地址
MASQUERADE:源地址偽裝
REDIRECT:重定向:主要用於實現端口重定向
MARK:打防火牆標記的
RETURN:返回 在自定義鏈執行完畢后使用返回,來返回原規則鏈
實例:
1.空當前的所有規則和計數
iptables -F # 清空所有的防火牆規則 iptables -X # 刪除用戶自定義的空鏈 iptables -Z # 清空計數
2.配置允許ssh端口連接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT # 22為你的ssh端口, -s 192.168.1.0/24表示允許這個網段的機器來連接,其它網段的ip地址是登陸不了你的機器的。 -j ACCEPT表示接受這樣的請求
3.允許本地回環地址可以正常使用
iptables -A INPUT -i lo -j ACCEPT #本地圓環地址就是那個127.0.0.1,是本機上使用的,它進與出都設置為允許 iptables -A OUTPUT -o lo -j ACCEPT
4.設置默認的規則
iptables -P INPUT DROP # 配置默認的不讓進 iptables -P FORWARD DROP # 默認的不允許轉發 iptables -P OUTPUT ACCEPT # 默認的可以出去
5.配置白名單
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允許機房內網機器可以訪問 iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允許機房內網機器可以訪問 iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允許183.121.3.7訪問本機的3380端口
6.開啟相應的服務端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 開啟80端口,因為web對外都是這個端口 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允許被ping iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已經建立的連接得讓它進來
保存規則到配置文件中
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改動之前先備份,請保持這一優秀的習慣 iptables-save > /etc/sysconfig/iptables cat /etc/sysconfig/iptables
列出已設置的規則
iptables -L [-t 表名] [鏈名] 四個表名 raw,nat,filter,mangle 五個規則鏈名 INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING filter表包含INPUT、OUTPUT、FORWARD三個規則鏈 iptables -L -t nat # 列出 nat 上面的所有規則 # ^ -t 參數指定,必須是 raw, nat,filter,mangle 中的一個 iptables -L -t nat --line-numbers # 規則帶編號 iptables -L INPUT iptables -L -nv # 查看,這個列表看起來更詳細
清除已有規則
iptables -F INPUT # 清空指定鏈 INPUT 上面的所有規則 iptables -X INPUT # 刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。 # 如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。 iptables -Z INPUT # 把指定鏈,或者表中的所有鏈上的所有計數器清零。
開放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允許本地回環接口(即運行本機訪問本機)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允許已建立的或相關連的通行
iptables -A OUTPUT -j ACCEPT #允許所有本機向外的訪問
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允許訪問22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允許訪問80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允許ftp服務的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允許FTP服務的20端口
iptables -A INPUT -j reject #禁止其他未允許的規則訪問
iptables -A FORWARD -j REJECT #禁止其他未允許的規則訪問
屏蔽IP
iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP # 屏蔽惡意主機(比如,192.168.0.8 iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽單個IP的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整個段即從123.0.0.1到123.255.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即從123.45.0.1到123.45.255.254的命令 iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即從123.45.6.1到123.45.6.254的命令是
指定數據包出去的網絡接口,只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起作用。
iptables -A FORWARD -o eth0
查看已添加的規則
iptables -L -n -v Chain INPUT (policy DROP 48106 packets, 2690K bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
啟動網絡轉發規則,
公網210.14.67.7
讓內網192.168.188.0/24
上網
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
端口映射,
本機的 2222 端口映射到內網 虛擬機的22 端口
iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22
字符串匹配
比如,我們要過濾所有TCP連接中的字符串test
,一旦出現它我們就終止這個連接,我們可以這么做:
iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset iptables -L # Chain INPUT (policy ACCEPT) # target prot opt source destination # REJECT tcp -- anywhere anywhere STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset # # Chain FORWARD (policy ACCEPT) # target prot opt source destination # # Chain OUTPUT (policy ACCEPT) # target prot opt source destination
阻止Windows蠕蟲的攻擊
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
防止SYN洪水攻擊
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEP
iptables防火牆規則的順序十分重要,內核按順序檢查這些規則,如果發現有匹配的規則條目,則立刻執行相關動作,停止繼續向下查找規則條目,如果所有的防火牆規則都未匹配成功,則按照默認的策略處理, -A添加防火牆規則追加到整個鏈的最后,-I默認會插入到鏈中作為第一條規則
iptables的用法:iptables [-t 表名] {-A|-D|-I|-F|-L|-R|-Z|-P} 鏈名 rule-specification
查看filter表的所有規則 iptables -nL
查看filter表防火牆規則並顯示規則編號 iptables -nL --line-number
查看net表的所有規則 iptables -t nat -nL
清空filter表的所有規則 iptables -F
在filter表中添加一條新的入站規則,丟棄192.168.1.0主機發送給防火牆本機的所有數據包 iptables -A INPUT -s 192.168.0.1 -j DROP
在filter表中,拒絕192.168.0.22ping防火牆本機 iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT
刪除filter表中INPUT鏈的第一條規則 iptables -D INPUT 1
替換filter表中第二條規則,拒絕192.168.1.254之外的任何主機連接到防火牆本機 iptables -R INPUT 2 ! -s 192.168.1.254 -j REJECT
修改filter表中INPUT的默認規則是接受數據包 iptables -t filter -P INPUT ACCEPT
將192.168.0.10主機發送給防火牆本機22端口的所有數據包信息記錄到messages日志: iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG
允許任何主機從eno16網絡接口訪問防火牆本機的80端口 iptables -I INPUT -i eno16 --p tcp --dport 80 -j ACCEPT
IPTABLES防火牆應用實例
案例一:允許任意客戶端訪問服務器主機提供的日常服務(http,https,ssh),在Linux系統中/etc/services文件可以找到各種服務對應的端口號
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
(如果你把OUTPUT 設置成DROP,就需要加上這個規則,否則SSH還是不能登錄,因為SSH服務職能進不能出.) iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -P INPUT DROP
(-P:設置鏈默認規則) iptables -P OUTPUT ACCEPT
案例二:公司擁有一個共有ip,使用防火牆實現局域網中所有主機通過SNAT共享上網,使用centos7作為公司軟路由,公司內部所有192.168.0.1/24網段內的主機連接到外網124.126.199.84時,防火牆自動將所有數據包的原地址修改為路由器上的公有IP,最后互聯網將信息返回路由后,由路由轉交給真正的后端主機。防火牆原地址轉換(SNAT)規則需寫入到NAT表中的POSTROUTING鏈。
在centos7軟路由配置:
vim /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84
案例三:公司對外有一個公有IP,內部有http,mail兩台核心的服務器,通過防火牆實現客戶可以從互聯網的任意位置訪問位於公司內部的兩台服務器資源,連接方向發生變化,案例二是SNAT,本例是DNAT.
該案例中0.100是http,0.101是postfix,124.126.199.84是作為軟路由使用的。
vim /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -d 124.126.199.84 -p tcp --dport 80 DNAT --to-destination 192.168.0.100 iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -d 124.126.199.84 -p tcp --dport 25 DNAT --to-destination 192.168.0.101
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -d 124.126.199.84 -p tcp --dport 110 DNAT --to-destination 192.168.0.101
案例四:目前網絡上攻擊手法多,很多攻擊采用發送大量無效的數據包給服務器,造成服務器無法正常響應正常的數據請求,iptables提供了一個limit擴展功能,可以限制單位時間內數據包的個數。下面是規則是當每秒數據包個數為500時接受入站連接,否則拒絕連接。
iptables -I INPUT -m limit --limit 500/sec -j ACCEPT iptables -P INPUT DROP
案例五:企業環境中,服務器面臨各種攻擊,iptables本身屬於三層過濾防火牆,也提供了string擴展功能,通過--string可以根據關鍵詞限制網絡連接。下面是記錄基於Linux軟路由服務器防火牆規則中,實現拒絕轉發包含有關鍵詞/etc/passwd 以及qq的數據包,防止將密碼文件復制出局域網,防止內部員工訪問QQ網站。
iptables -I FORWARD -m string --algo bm--string "/etc/passwd" -j REJECT iptables -I FORWARD -m string --algo bm--string "qq" -j REJECT
案例六:根據數據連接狀態設置防火牆規則,放行所有的出站數據包,拒絕入站的新連接請求與無效連接,放行入站的回應請求。
iptables -F iptables -A INPUT -m state --state NEW -j DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -P OUTPUT ACCEPT
案例七:公司基於Linux軟路由設備,要求在路由設備上設置防火牆,記錄192.168.0.1-192.168.0.11地址內所有主機發送給路由要求轉發的數據包,並允許轉發這些數據包
iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.11 -p tcp --dport 80 -j ACCEPT
案例八:減少不安全的端口連接
iptables -A OUTPUT -p tcp --sport 31337 -j DROP iptables -A OUTPUT -p tcp --dport 31337 -j DROP 有些特洛伊木馬會掃描端口31337到31340(即黑客語言中的 elite 端口)上的服務, 既然合法服務都不使用這些非標准端口來通信, 阻塞這些端口能夠有效地減少你的網絡上可能被感染的機器和它們的遠程主服務器進行獨立通信的機會。 還有其他端口:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也應被禁止
案例九:
場景一
開放 tcp 10-22/80 端口 開放 icmp 其他未被允許的端口禁止訪問
存在的問題: 本機無法訪問本機; 本機無法訪問其他主機
場景二
ftp: 默認被動模式(服務器產生隨機端口告訴客戶端, 客戶端主動連接這個端口拉取數據) vsftpd: 使 ftp 支持主動模式(客戶端產生隨機端口通知服務器, 服務器主動連接這個端口發送數據)
場景三
允許外網訪問: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp
內部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp
場景四
nat 轉發
場景五
防CC攻擊
iptables -L -F -A -D # list flush append delete
# 場景一
iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允許 tcp 80 端口
iptables -I INPUT -p tcp --dport 10:22 -j ACCEPT # 允許 tcp 10-22 端口
iptables -I INPUT -p icmp -j ACCEPT # 允許 icmp
iptables -A INPUT -j REJECT # 添加一條規則, 不允許所有
# 優化場景一
iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網
iptables -I INPUT -p tcp --dport 80 -s 10.10.188.233 -j ACCEPT # 只允許固定ip訪問80
# 場景二
vi /etc/vsftpd/vsftpd.conf # 使用 vsftpd 開啟 ftp 主動模式
port_enable=yes
connect_from_port_20=YES
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
vi /etc/vsftpd/vsftpd.conf # 建議使用 ftp 被動模式
pasv_min_port=50000
pasv_max_port=60000
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
# 還可以使用 iptables 模塊追蹤來自動開發對應的端口
# 場景三
iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網
iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允許內網訪問
iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允許端口, 80 -> http, 1723 -> vpn
iptables -A INPUT -j REJECT # 添加一條規則, 不允許所有
iptables-save # 保存設置到配置文件
# 場景四
iptables -t nat -L # 查看 nat 配置
iptables -t nat -A POST_ROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 # SNAT
vi /etc/sysconfig/network # 配置網關
iptables -t nat -A POST_ROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80 # DNAT
#場景五
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT # 限制並發連接訪問數
iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模塊; --limit-burst 默認為5
防火牆的備份和還原,如果不保存,計算機重啟后所有規則會丟失。
iptables-save > /etc/sysconfig/iptables iptables-save > firewall.bak iptables-restore < firewall.bak