現在防火墻主要分以下三種類型:包過濾、應用代理、狀態檢測 萌萌的IT人
包過濾防火墻:現在靜態包過濾防火墻市面上已經看不到了,取而代之的是動態包過濾技術的防火墻哈~
代理防火墻:因一些特殊的報文攻擊可以輕松突破包過濾防火墻的保護,比如大家知道的SYN攻擊、ICMP洪水攻擊,所以以代理服務器作為專門為用戶保密或者突破訪問限制的數據轉發通道的應用代理防火墻出現了哈~其使用了一種應用協議分析的新技術。
狀態檢測防火墻:其基于動態包過濾技術發展而來,加入了一種狀態檢測的模塊,進一點發展了會話過濾功能,會話狀態的保留是有時間限制的,此防火墻還可以對包的內容進行分析,從而避免開放過多的端口。
netfilter/iptables IP數據包過濾系統實際上由netfilter和iptables兩個組件構成。netfilter是集成在內核中的一部分,其作用是定義、保存相應的規則,而iptables是一種工具,用來修改信息的過濾規則及其他配置,我們可以通過iptables來設置一些適合我們企業需求環境的規則哈~,而這些規則會保存在內核空間之中。
netfilter是Linux核心中的一個通用架構,其提供了一系列的表(tables),每個表由若干個鏈(chains)組成,而每條鏈可以由一條或若干條規則(rules)組成。實際上netfilter是表的容器,表是鏈的容器,而鏈又是規則的容器。
iptables內置鏈
PREROUTING:數據包進入本機,進入路由器之前
INPUT:通過路由表后目的地為本機
FORWARDING:通過路由表后,目的地不為本機
OUTPUT:由本機產生,向外轉發
POSTROUTIONG:通過路由表后,發送到網卡接口之前
以下是表和鏈的對應關系
二、iptables的基本用法
基本語法:
iptables [-t table] COMMAND CHAIN CRETIRIA -j TARGET
-t table:
net,mangle,raw,filter
默認為filter
COMMAND:
鏈:
-F:(flush)清空規則鏈
-N:(new)自建一條鏈
-X:(delete)刪除一條自定義的空鏈
-Z:(zero)計數器歸零
-P:(policy)設置默認策略,對filter表來講,默認規則為ACCEPT或DROP
-E:重命名自定義鏈
CHAIN:指定你接下來的規則到底是在哪個鏈上操作的
CRETIRIA:指定匹配標準
ACTION :指定如何進行處理
常用指令
DROP:悄悄丟棄;一般我們多用DROP來隱藏我們的身份,以及隱藏我們的鏈表
REJECT:明示拒絕
ACCEPT:接受
DNAT:明確申明要做的是目的地地址轉換操作
SNAT:明確申明要做的是源地址轉換操作
MASQUERADE:源地址偽裝
REDIRECT:重定向:主要用于實現端口重定向
MARK:打防火墻標記的
RETURN:返回在自定義鏈執行完畢后使用返回,來返回原規則鏈
鏈中的規則
-A:(append)在所選擇的鏈末添加一條或更多規則
-I: (insert) 根據給出的規則序號向所選鏈中插入一條或更多規則
-D:(delete)從所選鏈中刪除一條或更多規則
-R:(replace)從選中的鏈中取代一條規則
常用查詢命令
-L
-n :數字格式顯示主機地址端口
-v:顯示詳細格式信息
-vv
-vvv:越多顯示的越詳細
--line-numbers:顯示規則編號
-x: exactly,不要對計數器的計數結果做單位換算,而顯示其精確值
pkts bytes target prot opt in out source destination
pkts: packets, 被本規則所匹配到的報文的個數
bytes: 被本規則所匹配到的所有報文的大小之和,會執行單位換算
target: 目標,即處理機制
prot: 協議,一般為{TCP|UDP|ICMP}
opt: 可選項
in: 數據包的流入接口
out: 數據包的流出接口
source: 源地址
destination: 目標地址
三、 匹配標準
通用匹配
-s 地址:指定報文源IP地址的匹配的范圍;可以是IP,也可以是網絡地址;可使用!取反
--src, --source
-d 地址:指定報文目標IP地址匹配的范圍
--dst, --destination
-p 協議:指定匹配報文的協議類型,一般有三種tcp,udp,icmp
-i ethX :數據報文流入的接口:PREROUTING,INPUT,FORWARD
-o ethX :數據報文流入的接口:OUTPUT,FORWARD,POSTROUTING
擴展匹配
隱式匹配: 當使用-p{tcp|udp|icmp}中的一種時,可以直接使用擴展專用選項
-p tcp
--sport PORT[-PORT]:指定源端口,可以是多個端口
--dport PORT[-PORT]:指定目標端口,可以是連續的多個端口
--tcp-flag:TCP的標志位列表(用逗號分隔)
必須為1 的標志位列表
eg:--tcp-flags syn,ack,rst,fin syn
-p udp
--sport PORT[-PORT]:指定源端口,可以是多個端口
--dport PORT[-PORT]:指定目標端口,可以是連續的多個端口
-p icmp
--icmp-type:
echo-request(請求回顯),一般用8 來表示
echo-reply (響應的數據包)一般用0來表示
顯示擴展 -m 必須要指定要擴展的擴展模塊名稱
multiport: 多端口匹配
可用于匹配非連續或連續端口;最多指定15個端口;用冒號分隔
eg:
iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange: 匹配指定范圍內的地址
匹配一段連續的地址而非整個網絡時有用;
專用選項:
[!] --src-ragne IP[-IP]
[!] --dst-range
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
string: 字符串匹配,能夠檢測報文應用層中的字符串
字符匹配檢查高效算法
kmp, bm
專用選項:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING": HEX_STRING為編碼成16進制格式的字串;
eg:
iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP
time: 基于時間做訪問控制
專用選項:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]Mon, Tue,
eg:
iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 連接數限制,對每IP所能夠發起并發連接數做限制;
專用選項:
[!] --connlimit-above [n]
eg:
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
limit: 速率限制
專用選項:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
eg:
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state: 狀態檢查
專用選項:
--state
連接追蹤中的狀態:
NEW: 新建立一個會話
ESTABLISHED:已建立的連接
RELATED: 有關聯關系的連接
INVALID: 無法識別的連接
調整連接追蹤功能所能容納的連接的最大數目:
/proc/sys/net/nf_conntrack_max
當前追蹤的所有連接
/proc/net/nf_conntrack
不同協議或連接類型追蹤時的屬性:
/proc/sys/net/netfilter目錄:
放行被動模式下的FTP服務:
1、裝載模塊/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模塊:nf_conntrack_ftp
2、放行請求報文:
(1)放行NEW狀態對21端口請求的報文;
(2) 放行ESTABLISHED以及RELATED狀態的報文
3、旅行響應報文:
(1) 放行ESTABLISHED以及RELATED狀態的報文
四、寫規則
先確定功能(表),確定報文流向,確定要實現的目標,確定匹配條件
流向
與本機進程通信:
流入:-->PREROUTING-->INPUT
流出:-->OUTPUT-->POSTROUTING
經由本機轉發:
請求:-->PREROUTING-->FORWARD-->POSTROUTING
響應:-->PREROUTING-->FORWARD-->POSTROUTING
寫規則時要注意:
服務端:先進后出
客戶端:先出后進
客戶端端口是隨機的,因此大多數場景下無須限定
規則文件:/etc/sysconfig/iptables
保存啟用中的規則于規則文件中:
1、iptables-save > /etc/sysconfig/iptables
2、service iptables save
生效規則文件中的規則:
1、iptables-restore < /etc/sysconfig/iptables
2、service iptables restart
執行的操作:清空現有規則,讀取并生效規則文件中的規則
常用語法
刪除規則:
iptables [-t table] -D chain rulenum
設置策略:
iptables [-t table] -P chain target
修改規則:
iptables [-t table] -R chain rulenum rule-specification
插入規則:
iptables [-t table] -I chain [rulenum] rule-specification
創建自定義鏈:
iptables [-t table] -N chain
刪除自定義且0引用的空鏈
iptables [-t table] -X chain
重命名自定義鏈:
iptables [-t table] -E old_name new_name
五、例子
1、SNAT基于原地址的轉換
基于原地址的轉換一般用在我們的許多內網用戶通過一個外網的口上網的時候,這時我們將我們內網的地址轉換為一個外網的IP,我們就可以實現連接其他外網IP的功能。
比如我們現在要將所有192.168.10.0網段的IP在經過的時候全都轉換成172.16.100.1這個假設出來的外網地址:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.200.1
這樣,只要是來自本地網絡的試圖通過網卡訪問網絡的,都會被統統轉換成172.16.100.1這個IP.
我們都知道當我們使用聯通或者電信上網的時候,一般它都會在每次你開機的時候隨機生成一個外網的IP,意思就是外網地址是動態變換的。這時我們就要將外網 地址換成 MASQUERADE(動態偽裝):它可以實現自動尋找到外網地址,而自動將其改為正確的外網地址。所以,我們就需要這樣設置:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
這里要注意:地址偽裝并不適用于所有的地方。
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
2、DNAT目標地址轉換
對于目標地址轉換,數據流向是從外向內的,外面的是客戶端,里面的是服務器端
通過目標地址轉換,我們可以讓外面的ip通過我們對外的外網ip來訪問我們服務器不同的服務器,而我們的服務卻放在內網服務器的不同的服務器上。
iptables -t nat -A PREROUTING -d 192.168.1.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.200.7
目標地址轉換要做在到達網卡之前進行轉換,所以要做在PREROUTING這個位置上
3、只允許192.168.1.3訪問服務器的SSH
iptables -A INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT
4、屏蔽IP即從192.168.1.0到192.168.1.1254
iptables -I INPUT -s 192.168.1.0/24 -j DROP
5、丟棄非法連接
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables-A FORWARD -m state --state INVALID -j DROP
6、允許ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
7、預防DOS攻擊
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT