防火牆的幾個知識點
1、防火牆的概念
2、iptables的基本認識
3、iptables的組成
4、iptables的基本語法
5、iptables之forward的概念
6、iptables之地址轉換法則
7、SNAT源地址轉換的具體實現
8、DNAT目標地址轉換的具體實現
9、firewalld介紹
10、firewalld配置命令
11、rich規則
防火牆概念
防火牆一般分爲硬件防火牆和軟件防火牆。但實際上,不管是硬件和軟件防火牆,它們都需要使用硬件來作爲聯機介質,
也需要使用軟件來設定安全政策,嚴格來說,兩者間的差別並不太大,因此只能從使用的硬件與操作系統來加以區分:硬件防火牆使用專用的硬件,
而軟件式防火牆則使用一般的計算機硬件、硬件防火牆使用專有的操作系統,而軟件式防火牆則使用一般的操作系統。
根據工作方式,防火牆還是可以分爲封包過濾式防火牆,應用層網關防火牆兩種,其中廣爲採用的是封包過濾式防火牆,本次介紹的iptables防火牆就屬於這一種。
iptables是Linux系統內嵌的一個防火牆軟件,它集成在系統內核中,因此執行效率非常高。iptables通過設置一些封包過濾規則,來定義什麼數據可以接受,什麼數據需要拒絕,因此,用戶通過iptables可以對進出計算機的數據包進行IP過濾以達到保護主機的目的。
1、安全技術:
檢測與管理系統(Intrusion Detection Systems):
特點是不阻斷任何網絡訪問,量化、定位來自內外網絡的威脅情況,主要以提供報告和事後監督爲主,提供有針對性的指導措施和安全決策依據。一般採用旁路部署方式
防禦系統(Intrusion Prevention System):
以透明模式工作,分析數據包的內容如:溢出***、拒絕服務***、***、蠕蟲、系統漏洞等進行準確的分析判斷,在判定爲***行爲後立即予以阻斷,主動而有效的保護網絡的安全,一般採用在線部署方式
防火牆(FireWall):
隔離功能,工作在網絡或主機邊緣,對進出網絡或主機的數據包基於一定的規則檢查,並在匹配某規則時由規則定義的行爲進行處理的一組功能的組件,基本上的實現都是默認情況下關閉所有的通過型訪問,只開放允許訪問的策略
一般而然,對一臺主機來講網絡通信就是通過網絡通信接口設備,一般叫做網卡,通過報文交換來實現
而主機所謂的防火牆,無非就是對此類的報文通信的來回交換給它予以隔離,稱爲"防火牆"
防火牆功能本身是如何具體實施規則的,是需要用戶根據自己的實際需求進行設置的
防火牆防火是靠報文過濾實現的(Packet filter)
定義一些特殊的訪問行爲特徵
2、防火牆的分類:
防火牆的分類
主機防火牆:
服務範圍爲當前主機
網絡防火牆:
服務範圍爲防火牆一側的局域網
硬件防火牆:
在專用硬件級別實現部分功能的防火牆;另一個部分功能基於軟件實現,Checkpoint,NetScreen
軟件防火牆:
運行於通用硬件平臺之上的防火牆的應用軟件
網絡層防火牆:
OSI模型下四層
應用層防火牆/代理服務器:
代理網關,OSI模型七層
要想達到識別越透徹目的,所消耗的時間成本就越大,這是必然的
從平均的角度來講,因此應用層防火牆和網絡層防火牆的主要區別在於:
網絡層防火牆性能好、但是識別的精確度就沒有應用層那樣高,但是應用層的識別很顯然,它們對於時間的消耗或者對用戶的訪問帶來的延遲略大、越長
3、網絡型防火牆:
包過濾防火牆
網絡層對數據包進行選擇,選擇的依據是系統內設置的過濾邏輯,被稱爲訪問控制列表(ACL),通過檢查數據流中每個數據的源地址,目的地址,所用端口號和協議狀態等因素,或他們的組合來確定是否允許該數據包通過
優點:
對用戶來說透明,處理速度快且易於維護
缺點:
無法檢查應用層數據,如病毒等
4、應用層防火牆:
應用層防火牆/代理服務型防火牆(Proxy Service)
將所有跨越防火牆的網絡通信鏈路分爲兩段
內外網用戶的訪問都是通過代理服務器上的“鏈接”來實現
優點:在應用層對數據進行檢查,比較安全
缺點:增加防火牆的負載
現實生產環境中所使用的防火牆一般都是二者結合體
即先檢查網絡數據,通過之後再送到應用層去檢查
端口代表進程地址
iptables的基本認識
1、Netfilter組件:
內核空間,集成在linux內核中
擴展各種網絡服務的結構化底層框架
內核中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而這五個hook function向用戶開放,用戶可以通過一個命令工具(iptables)向其寫入規則
由信息過濾表(table)組成,包含控制IP包處理的規則集(rules),規則被分組放在鏈(chain)上
2、三種報文流向:
流入本機:
PREROUTING --> INPUT-->用戶空間進程
流出本機:
用戶空間進程-->OUTPUT--> POSTROUTING
轉發:
PREROUTING --> FORWARD --> POSTROUTING
3、防火牆工具
4、iptables
命令行工具,工作在用戶空間
用來編寫規則,寫好的規則被送往netfilter,告訴內核如何去處理信息包
5、firewalld
CentOS7 引入了新的前端管理工具
管理工具:
firewall-cmd命令行
firewall-config圖形
iptables的組成
iptables由五個表和五個鏈以及一些規則組成
五個表table:
filter、nat、mangle、raw、security
filter表:
過濾規則表,根據預定義的規則過濾符合條件的數據包
nat表:
network address translation 地址轉換規則表
mangle:
修改數據標記位規則表
raw:
關閉NAT表上啓用的連接跟蹤機制,加快封包穿越防火牆速度
security:
用於強制訪問控制(MAC)網絡規則,由Linux安全模塊(如SELinux)實現
優先級由高到低的順序爲:security -->raw-->mangle-->nat-->filter
conntrack
五個內置鏈chain:
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
表和鏈的對應關係:
不同的功能,實現位置是不一樣的
filter:
INPUT,FORWARD, OUTPUT
nat:
PREROUTING, INPUT, OUTPUT, POSTROUTING
mangle:
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw:
PREROUTING, OUTPUT
配置文件保存路徑
/etc/sysconfig/iptables
從指定目錄中讀取或加載配置文件
iptables-restore < /etc/sysconfig/iptables
Netfilter表和鏈對應關係
數據包過濾匹配流程
IPTABLES和路由
路由功能發生的時間點
報文進入本機後
判斷目標主機是否爲本機
是:INPUT
否:FORWARD
報文離開本機之前
判斷由哪個接口送往下一跳
內核中數據包的傳輸過程
內核中數據包的傳輸過程
當一個數據包進入網卡時,數據包首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去
如果數據包就是進入本機的,數據包就會沿着圖向下移動,到達INPUT鏈。數據包到達INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包經過OUTPUT鏈,然後到達POSTROUTING鏈輸出
如果數據包是要轉發出去的,且內核允許轉發,數據包就會向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出
進入,流出
進入本機:PREROUTING
目標爲本機IP:INPUT
目標非爲本機IP:FORWARD
流出本機:POSTROUTING
轉發:FORWARD
本機發出:OUTPUT
1、進入本機:從PREROUTING進來,然後到達INPUT
2、轉發:從PREROUTING進來,然後送給FORWARD,隨後再路由就從選定哪塊網卡發出以後,再由網卡離開的時候經由POSTROUTING
3、本機發出:進入OUTPUT,隨後進入POSTROUTING離開本機
連接追蹤機制;
判定一個出去的報文是不是跟某個進來的請求有關聯,如果對進來的某個請求進行響應,就是安全的,如果是本機莫名其妙的連接別人就因爲是不安全的,因此我們可以把出行的時候策略設置爲拒絕,而且我們也不明確放行任何出去的報文,也就是說跟進來的請求有關聯纔給予放行,要用到連接機制
連接追蹤,其實就是數據庫,在本地保存一個會話數據庫、每一次請求來了在數據庫裏面查下這個請求之前是否有請求記錄
連接追蹤是把雙刃劍,能幫我們識別連接,但也能夠消耗很多系統資源
面向互聯網服務的高併發支撐的服務器一定不要啓用連接追蹤,除非內存資源足夠大,mangle足夠寬,否則這個連接是致命的
iptables規則
規則rule:
根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作作出處理
匹配條件:
默認爲與條件,同時滿足
基本匹配:
IP,端口,TCP的Flags(SYN,ACK等)
擴展匹配:
通過複雜高級功能匹配
隱式擴展:
TCP, UDP, ICMP
顯示擴展:
必須明確指定擴展模塊進行的擴展
處理動作:
稱爲target,跳轉目標
內建處理動作:
ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...
自定義處理動作:
自定義chain,利用分類管理複雜情形
規則要添加在鏈上,才生效;
添加在自定義上不會自動生效
鏈chain:
內置鏈:
每個內置鏈對應於一個鉤子函數
自定義鏈:
用於對內置鏈進行擴展或補充,可實現更靈活的規則組織管理機制;只有Hook鉤子調用自定義鏈時,才生效
iptables添加要點
iptables規則添加時考量點
要實現哪種功能:
判斷添加在哪張表上
報文流經的路徑:
判斷添加在哪個鏈上
報文的流向:
判斷源和目的
匹配規則:
業務需要
實驗環境準備:
Centos7:
systemctl stop firewalld.service
systemctl disable firewalld.service
Centos6:
service iptables stop
chkconfig iptables off
擴展匹配又分爲兩類:
1、隱式擴展
端口、TCP屬於隱式擴展
2、顯示擴展:
我們自己必須明確手動指定如何擴展
iptables命令
1、man 8 iptables
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
2、規則格式:
iptables[-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname[per-target-options]
3、-t table:
raw, mangle, nat, [filter]默認
4、SUBCOMMAND:
1、鏈管理:
-N:new, 自定義一條新的規則鏈
-X:delete,刪除自定義的空的規則鏈
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
-E:重命名自定義鏈;引用計數不爲0的自定義鏈不能夠被重命名,也不能被刪除
2、查看:
-L:
list, 列出指定鏈上的所有規則,本選項須置後
-n:
numberic,以數字格式顯示地址和端口號
[root@node7 ~]#iptables -vnL
-v:
verbose,詳細信息
-vv更詳細
-x:
exactly,顯示計數器結果的精確值,而非單位轉換後的易讀值
--line-numbers:
顯示規則的序號
常用組合:
-vnL
-vvnxL--line-numbers
[root@node7 ~]#iptables -vnL --line-number
-S:
selected,以iptables-save 命令格式顯示鏈上規則
3、規則管理:
-A:
append,追加
-I:
insert, 插入,要指明插入至的規則編號,默認爲第一條
-D:
delete,刪除
(1) 指明規則序號
(2) 指明規則本身
-R:
replace,替換指定鏈上的指定規則編號
-F:
flush,清空指定的規則鏈
-Z:
zero,置零
iptables的每條規則都有兩個計數器
(1) 匹配到的報文的個數
(2) 匹配到的所有報文的大小之和
5、chain:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
6、匹配條件
基本:通用的,PARAMETERS
擴展:需加載模塊,MATCH EXTENTIONS
7、基本匹配條件:
無需加載模塊,由iptables/netfilter自行提供
[!] -s, --source address[/mask][,...]:源IP地址或範圍
[!] -d, --destination address[/mask][,...]:目標IP地址或範圍
[!] -p, --protocol protocol:指定協議,可使用數字如0(all)
protocol: tcp, udp, icmp, icmpv6,udplite,esp, ah, sctp, mhor“all“
參看:/etc/protocols
[!] -i, --in-interface name:報文流入的接口;只能應用於數據報文流入環節,只應用於INPUT、FORWARD、PREROUTING鏈
[!] -o, --out-interface name:報文流出的接口;只能應用於數據報文流出的環節,只應用於FORWARD、OUTPUT、POSTROUTING鏈
8、 擴展匹配條件:
需要加載擴展模塊(/usr/lib64/xtables/\*.so),方可生效
9、查看幫助man iptables-extensions
10、隱式擴展:
在使用-p選項指明瞭特定的協議時,無需再用-m選項指明擴展模塊的擴展機制,不需要手動加載擴展模塊
tcp協議的擴展選項
[!] --source-port, --sport port[:port]:匹配報文源端口,可爲端口範圍
[!] --destination-port,--dportport[:port]:匹配報文目標端口,可爲範圍
[!] --tcp-flags mask comp
mask 需檢查的標誌位列表,用,分隔
例如SYN,ACK,FIN,RST
comp 在mask列表中必須爲1的標誌位列表,無指定則必須爲0,用,分隔
udp
[!] --source-port, --sport port[:port]:匹配報文的源端口或端口範圍
[!] --destination-port,--dportport[:port]:匹配報文的目標端口或端口範圍
icmp
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-replyicmp應答
8/0 echo-request icmp請求
顯式擴展:
必須使用-m選項指明要調用的擴展模塊的擴展機制,要手動加載擴展模塊
[-m matchname[per-match-options]]
11、處理動作:
-j targetname[per-target-options]
簡單:
ACCEPT,DROP
擴展:
REJECT:
--reject-with:icmp-port-unreachable默認
RETURN:
返回調用鏈
REDIRECT:
端口重定向
LOG:
記錄日誌,dmesg
MARK:
做防火牆標記
DNAT:
目標地址轉換
SNAT:
源地址轉換
MASQUERADE:
地址僞裝
...
自定義鏈:
12、顯式擴展:
必須顯式地指明使用的擴展模塊進行的擴展
使用幫助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
12.1、multiport擴展
以離散方式定義多端口匹配,最多指定15個端口
[!] --source-ports,--sports port[,port|,port:port]...
指定多個源端口
[!] --destination-ports,--dportsport[,port|,port:port]...
指定多個目標端口
[!] --ports port[,port|,port:port]...多個源或目標端口
示例:
iptables -A INPUT -s 192.168.137.0/24 -d 192.168.137.56 -p tcp -m multiport --dports 20:22,80,445 -j ACCEPT
12.2、iprange擴展:
指明連續的(但一般不是整個網絡)ip地址範圍
[!] --src-range from[-to]源IP地址範圍
[!] --dst-range from[-to]目標IP地址範圍
示例:
iptables -A INPUT -d 192.168.137.56 -p tcp --dport 80 -m iprange --src-range 192.168.137.100-192.168.137.200 -j DROP
12.3、mac擴展
指明源MAC地址
適用於:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例:
iptables-A INPUT -s 192.168.137.56 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
iptables-A INPUT -s 192.168.137.56 -j REJECT
12.4、string擴展
對報文中的應用層數據做字符串模式匹配檢測
--algo{bm|kmp}字符串匹配檢測算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset 開始偏移
--to offset 結束偏移
[!] --string pattern要檢測的字符串模式
[!] --hex-string pattern要檢測字符串模式,16進制格式
示例:
iptables -A OUTPUT -s 192.168.137.56 -d 0/0 -p tcp --sport 80 -m string --algobm --string “google" -j REJECT
12.5、time擴展
根據將報文到達的時間與指定的時間範圍進行匹配
--datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestarthh:mm[:ss] 時間
--timestophh:mm[:ss]
[!] --monthdaysday[,day...] 每個月的幾號
[!] --weekdays day[,day...] 星期幾,1 –7 分別表示星期一到星期日
--kerneltz:內核時區,不建議使用,CentOS7系統默認爲UTC
注意:centos6 不支持kerneltz,--localtz指定本地時區(默認)
示例:
iptables -A INPUT -s 192.168.137.0/24 -d 192.168.137.56 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
12.6、connlimit擴展
根據每客戶端IP做併發連接數數量匹配
可防止CC(Challenge Collapsar挑戰黑洞)***--connlimit-upto#:連接的數量小於等於#時匹配
--connlimit-above #:連接的數量大於#時匹配
通常分別與默認的拒絕或允許策略配合使用
示例:
iptables -A INPUT -d 192.168.137.56 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
12.7、limit擴展
基於收發報文的速率做匹配
令牌桶過濾器
--limit #[/second|/minute|/hour|/day]
--limit-burst number
示例:
iptables -I INPUT -d 192.168.137.56 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
12.8、state擴展
根據”連接追蹤機制“去檢查連接的狀態,較耗資源
conntrack機制:
追蹤本機上的請求和響應之間的關係
狀態有如下幾種:
NEW:新發出請求;連接追蹤信息庫中不存在此連接的相關信息條目,因此,將其識別爲第一次發出的請求
ESTABLISHED:NEW狀態之後,連接追蹤信息庫中爲其建立的條目失效之前期間內所進行的通信狀態
RELATED:新發起的但與已有連接相關聯的連接,如:ftp協議中的數據連接與命令連接之間的關係
INVALID:無效的連接,如flag標記不正確
UNTRACKED:未進行追蹤的連接,如raw表中關閉追蹤
[!] --state state
示例:
iptables -A INPUT -d 192.168.137.56 -p tcp-m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.137.56 -p tcp-m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
已經追蹤到的並記錄下來的連接信息庫
/proc/net/nf_conntrack
調整連接追蹤功能所能夠容納的最大連接數量
/proc/sys/net/nf_conntrack_max
不同的協議的連接追蹤時長
/proc/sys/net/netfilter/
注意:
CentOS7 需要加載模塊:modprobenf_conntrack
iptables的鏈接跟蹤表最大容量爲/proc/sys/net/nf_conntrack_max,各種狀態的超時鏈接會從表中刪除;當模板滿載時,後續連接可能會超時
解決方法兩個:
(1) 加大nf_conntrack_max值
vi /etc/sysctl.conf
net.nf_conntrack_max= 393216
net.netfilter.nf_conntrack_max= 393216
(2) 降低nf_conntracktimeout時間
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established= 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait= 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait= 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait= 120
iptables-t nat-L -n
iptables整體命令大體上歸併成 iptables [-t table][subcommand][chain][rulenum][rule-specifiacation]
子命令當中簡單歸類:
subcommand
規則管理:
增加:-A -I
修改:-R
查看:-L
刪除:-D
鏈管理:
自定義:-N
刪:-X
查:-L
清空:-F
置零:-Z
重命名: -E
設定鏈的默認策略:-P
對於不同表來講,可用鏈不同,究竟把規則放在哪個表的哪個鏈上,則取決我們對報文請求如何響應發送方向的判別來決定,然後rulenum不同的選項支持不一樣
規則編寫時,定義rule-specifiacation時候是如何定義規則的
rule specifiacation
常見的兩類:
基本匹配表達式:
匹配報文源地址:-s
匹配報文目標地址:-d
匹配報文四層協議類型:-p
匹配報文流入和流出的接口: -i, -o
擴展匹配表達式:
隱式擴展
顯示擴展
target
tcp協議的擴展選項
示例:
--tcp-flags SYN,ACK,FIN,RST SYN 表示要檢查的標誌位爲SYN,ACK,FIN,RST四個,其中SYN必須爲1,餘下的必須爲0
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
--tcp-flags ALL ALL
--tcp_flagsALL NONE
[!] --syn:
用於匹配第一次握手
相當於:--tcp-flags SYN,ACK,FIN,RST SYN
iptables簡單示例
以下實驗的默認ACCEPT都被修改成DROP下進行的
白名單設置:
先把ssh遠程連接允許連接的IP添加進去
[root@node7 ~]#iptables -A INPUT -s 192.168.137.0/24 -d 192.168.137.57 -p tcp --dport 22 -j ACCEPT
[root@node7 ~]#iptables -A OUTPUT -d 192.168.137.0/24 -p tcp --sport 22 -j ACCEPT
然後把默認允許改成拒絕
[root@node7 ~]#iptables -P OUTPUT DROP
刪除規則用 -D
刪除INPUT和OUTPUT中的第二條規則,
[root@node7 ~]#iptables -D INPUT 2
[root@node7 ~]#iptables -D OUTPUT 2
只開放特定web80端口允許訪問
[root@node7 ~]#iptables -A INPUT -d 192.168.137.57 -p tcp --dport 80 -j ACCEPT
[root@node7 ~]#iptables -A OUTPUT -s 192.168.137.57 -p tcp --sport 80 -j ACCEPT
然後通過網頁測試或者Linux客戶端用curl來訪問
[root@node6 ~]#curl http://192.168.137.57
welcome dklwj.com
修改規則 -R
修改只從指定接口出去
[root@node7 ~]#iptables -R INPUT 2 -p tcp --dport 80 -i ens33 -j ACCEPT
[root@node7 ~]#iptables -R OUTPUT 2 -p tcp --sport 80 -o ens33 -j ACCEPT
只允許本機ping別的主機,不允許別的主機ping本機
[root@node7 ~]#iptables -A OUTPUT -s 192.168.137.57 -o ens33 -p icmp --icmp-type 8 -j ACCEPT
[root@node7 ~]#iptables -A INPUT -d 192.168.137.57 -i ens33 -p icmp --icmp-type 0 -j ACCEPT
開放多個零散端口
[root@node7 ~]#iptables -I INPUT -d 192.168.137.57 -i ens33 -p tcp -m multiport --dports 21:22,80,139,445 -j ACCEPT
[root@node7 ~]#iptables -I OUTPUT -s 192.168.137.57 -o ens33 -p tcp -m multiport --sports 21,22,80,139,445 -j ACCEPT
只允許網段中的其中哪些IP段
[root@node7 ~]#iptables -I INPUT 2 -d 192.168.137.57 -i ens33 -p tcp --dport 23 -m iprange --src-range 192.168.137.50-192.168.137.60 -j ACCEPT
[root@node7 ~]#iptables -I OUTPUT 2 -s 192.168.137.57 -o ens33 -p tcp --sport 23 -m iprange --dst-range 192.168.137.50-192.168.137.60 -j ACCEPT
[root@node7 ~]#iptables -vnL
過濾網頁中的某敏感字符
[root@node7 ~]#echo this is 1024 > /var/www/html/test.html
[root@node7 ~]#iptables -I OUTPUT -m string --string "1024" --algo kmp -j DROP
[root@node6 ~curl http://192.168.137.57
welcome dklwj.com
[root@node6 ~]#curl http://192.168.137.57/test.html
基於時間控制訪問:
[root@node7 ~iptables -I INPUT -d 192.168.137.57 -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DROP
不過這裏的時區是爲UTC時區,還得需要用其他模塊來控制
[root@node7 ~]#iptables -R INPUT 1 -d 192.168.137.57 -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --kerneltz --weekdays Mon,Tue,Wed,The,Fri -j DROP
[root@node7 ~]#
設置ssh連接的併發數爲2
[root@node7 ~]#iptables -I INPUT -d 192.168.137.57 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
連接追蹤示例:
先把默認規則改成drop
[root@node6 ~]#iptables -A INPUT -j DROP
[root@node6 ~]#iptables -A OUTPUT -j DROP
[root@node6 ~]#iptables -A INPUT -d 192.168.137.56 -p tcp -m multiport --dports 22,80,443,139,445 -m state --stete NEW,ESTABLISHED -j ACCEPT
[root@node6 ~]#iptables -A OUTPUT -s 192.168.137.56 -p tcp -m multiport --sports 22,80,443,139,445 -j ACCEPT
修改除本地接口lo除外其它都拒絕
[root@node6 ~]#iptables -R INPUT 3 ! -i lo -j DROP
[root@node6 ~]#iptables -R OUTPUT 2 ! -o lo -j DROP
放行ftp服務
[root@node6 ~]#iptables -I INPUT 1 -d 192.168.137.56 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@node6 ~]#iptables -I INPUT 2 -d 192.168.137.56 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@node6 ~]#iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
RELATED是個單獨的模塊,需要手動加載到內核中去
[root@node6 ~]#lsmod | grep conntrack
nf_conntrack_ipv4 15053 5
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
xt_conntrack 12760 5
nf_conntrack 133053 2 xt_conntrack,nf_conntrack_ipv4
libcrc32c 12644 2 xfs,nf_conntrack
[root@node6 ~]#modprobe nf_conntrack_ftp
[root@node6 ~lsmod | grep conntracktp
nf_conntrack_ftp 18638 0
nf_conntrack_ipv4 15053 5
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
xt_conntrack 12760 5
nf_conntrack 133053 3 xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
libcrc32c 12644 2 xfs,nf_conntrack
客戶端測試:
[root@node7 ~]#lftp 192.168.137.56
lftp 192.168.137.56:~> ls
drwxr-xr-x 2 0 0 19 Oct 22 12:26 pub
drwxr-xr-x 2 14 50 6 Oct 22 13:11 upload
lftp 192.168.137.56:/>
優化規則
[root@node6 ~]#iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@node6 ~]#iptables -R INPUT 2 -d 192.168.137.56 -p tcp -m multiport --dports 21:22,80,443,139,445 -m state --state N -j ACCEPT
[root@node6 ~]#iptables -D INPUT 3
[root@node6 ~]#iptables -D INPUT 3
放行自己出去請求別的服務器的80和443
[root@node6 ~iptables -R OUTPUT 2 -s 192.168.137.56 -p tcp -m multiport --dports 80,443 -m state --state NEW -j ACCEPT
保存和恢復規則:
先保存
[root@node6 ~]#iptables-save > /etc/sysconfig/iptables
然後清空規則
[root@node6 ~]#iptables -F
[root@node6 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 67 packets, 3568 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 53 packets, 3248 bytes)
pkts bytes target prot opt in out source destination
恢復之前保存的規則
[root@node6 ~]#iptables-restore < /etc/sysconfig/iptables
[root@node6 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
868 26292 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 192.168.137.56 multiport dports 21:22,80,443,139,445 state NEW
0 0 DROP all -- !lo * 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 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
852 27188 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
0 0 ACCEPT tcp -- * * 192.168.137.56 0.0.0.0/0 multiport dports 80,443 state NEW
0 0 DROP all -- * !lo 0.0.0.0/0 0.0.0.0/0
[root@node6 ~]#