iptables
一、基礎概念
1、防火墻概念
Firewall:隔離工具;Packets Filter Firewall;工作于主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,對于能夠被規則匹配到的報文實行某預定義的處理機制的一套組件;
如果沒有防火墻,你的本機的所有端口都會被別人訪問到!
2、分類
- 硬件防火墻:在硬件級別實現部分功能的防火墻;另一個部分功能基于軟件實現;
5 - 軟件防火墻:應用軟件處理邏輯運行于通用硬件平臺之上的防火墻;
- 主機防火墻:服務范圍為當前主機;
- 網絡防火墻:服務范圍為防火墻被的局域網;
3、防火墻的兩個層面 — iptables/netfilter:
netfilter:防火墻框架,framework;位于內核空間;
iptables:命令行工具程序,位于用戶空間;規則管理工具;
-
netfilter:防火墻框架
hooks function prerouting 路由之前 input 入棧 forward 轉發 output 出棧 postrouting 路由之后
-
iptables:為了驅動內核防火墻框架創造5條鏈
CHAINS:鏈 PREROUTING INPUT FORWARD OUTPUT POSTROUTING
4、Linux下防火墻如何實現?
1、iptables,這個只是方便用戶編寫各類規則交由netfilter處理執行。
2、一部分是基于TCP/IP協議棧的netfilter安全框架,通過“數據報文進入主機,內核處理完成,交由用戶空間處理,在由內核處理完成并響應給客戶”, 數據報文的處理路徑設置了各種規則鏈,根據規則鏈的順序或者特點, 又在規則鏈中增加功能表,通過在不同的功能表中設置具體的規則,來達到安全訪問。
那么netfilter的規則定義是如何來達到安全訪問的效果呢?
首先我們應該知道主機之間的通信是數據流,是參考OSI七層模型來包裝用戶的數據,OSI七層包括了應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層,物理層,每一層都有其自己的功能,netfilter就是通過識別每一層功能中的數據是否符合我們定義的規則,從而達到監控,修改,丟棄,轉發的目錄。
–
5、報文流向:
到本機某進程的報文:PREROUTING –> INPUT
由本機轉發的報文:PREROUTING –> FORWARD –> POSTROUTING
由本機的某進程發出報文:OUTPUT –> POSTROUTING
6、tables:
- filter:過濾,防火墻;
- nat:network address translation,網絡地址轉換;
- mangle:拆解報文,做出修改,并重新封裝;蓋戳
- raw:關閉nat表上啟用的連接追蹤機制;
優先級次序(由高而低):
raw –> mangle –> nat –> filter
功能<–>鉤子:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
7、iptables規則的組成部分:
匹配條件:
-
網絡層首部:Source IP, Destination IP
-
傳輸層首部:Source Port, Destination Port
-
擴展檢查機制:拓展了可以檢查應用層首部,需要指明使用了那些擴展
處理動作:target
- ACCEPT:允許
- DROP :丟棄
- REJECT:拒絕后并回應
二、安裝:
1、內核要確保安裝netfilter這個協議框架
netfilter:位于內核中的tcp/ip協議棧報文處理框架;對于任何發行版來說這都是必備的功能
2、iptables 工具:
iptables并不是一個服務,它只是內核中的一個功能而已,只要內核在,這個功能就在。我們并不需要啟動!雖然我們在centos 6上會用到service但只是用它來加載配置文件的!
CentOS 5/6:iptables命令編寫規則;
# iptables -t filter -F
# service iptables save
CentOS 7:firewalld,firewall-cmd, firewall-config
# systemctl disable firewalld
注意:firewalld 我們并不建議使用,因為這只是在redhat這一個分支上使用并不能通用!
由于這個應用,centos7就沒有unit file文件,這需要我們自己加載配置的防火墻規則!
程序包:iptables, iptstate
三、iptables命令:
規則:根據指定的匹配條件來嘗試匹配每個流經此處的報文,一旦匹配成功,則由規則后面指定的處理動作進行處理;
匹配條件:
- 基本匹配條件:源地址,目標地址,傳輸層協議
- 擴展匹配條件:需要借助于擴展模塊進行指定的匹配條件
- 隱式擴展:已經在基本匹配條件中指明的協議相關的擴展;
- 顯式擴展:隱式擴展之外的其它擴展匹配條件;
處理動作:
- 基本動作:ACCEPT,DROP,REJECT…
- 擴展動作:需要借助于擴展模塊進行,但無須顯式指定,僅需指明動作;
添加規則時需要考量的問題:
- 報文流經的位置:用于判斷將規則添加至哪個鏈;
- 實現的功能:用于判斷將規則添加至哪個表;
- 報文的方向:用于判斷哪個為“源”,哪個為“目標”;
- 匹配條件:用于編寫能夠正確匹配目標報文的規則;
四、iptabls命令的使用格式:
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]
規則管理格式:
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
-t table:指明要管理的表; 默認為filter;
iptables [-t table] COMMANDS:
鏈管理:
-
-P chain target
定義鏈的默認策略;其target一般可使用ACCEPT或DROP; -
-N chain
自定義規則鏈;僅在默認鏈通過某規則進行調用方可生效;因此,每個自定義鏈都有其引用記數; -
-X [chain]
刪除自定義的空的引用計數為0的鏈;如果后邊不加名的話就會刪除所有符合的自定義鏈 -
-F [chain [rulenum]] [options…]
清空指定的鏈,或刪除指定鏈上的規則,不指名就會刪除所在表上的所有鏈 -
-E old-chain-name new-chain-name
重命名自定義的引用計數為0的鏈; -
-Z [chain [rulenum]] [options…]
清零,置零規則計數器;
規則:
-
-A:append, iptables [-t table] -A chain rule-specification,
追加規則到指定的鏈尾部; -
-I:insert, iptables [-t table] -I chain [rulenum] rule-specification,
插入規則到指定的鏈中的指定位置,默認為鏈首; -
-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum
刪除指定的鏈上的指定規則;指明規則的條件來刪除那條規則,或直接刪除規則所對應的額號碼 -
-R:replace,iptables [-t table] -R chain rulenum rule-specification,
將指定的鏈上的指定規則替換為新的規則;
查看:-vnL
-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
-n:數字格式;
-v:verbose,詳細格式信息;
-vv, -vvv
--line-numbers:顯示鏈上的規則的編號;
-x:exactly,顯示計數器的精確值;
計數器:
每條規則以及鏈的默認策略分別有各自的兩個計數器:
(1) 匹配到的報文的個數:pkts
(2) 匹配到的所有報文的大小之積:bytes
總結
iptables/netfilter
四表:raw, mangle, nat, filter
五鏈:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
iptables命令:
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
COMMANDS:
鏈管理:-P,-N,-X,-E,-F,-Z
規則管理:-A,-I,-D,-R
查看:-L,-n, -x, -v, --line-numbers
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
匹配條件
基本匹配條件
擴展匹配條件
隱式擴展
顯式擴展
注意:多重條件之間的隱含邏輯為“與”操作;
1.基本匹配條件:
- [!] -s –source address[/mask][,…]:檢查報文中的源IP地址是否符合此處指定的地址或地址范圍;
-
[!] -d, –destination address[/mask][,…]:檢查報文中的目標IP地址是否符合此處指定的地址或地址范圍;
-
[!] -p, –protocol protocol:檢查報文中傳輸層的協議類型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 “all”;
-
[!] -i, –in-interface name:檢查報文進入本機時的接口是否符合本處指定的接口;INPUT, FORWARD and PREROUTING ;
-
[!] -o, –out-interface name:檢查報文即將離開本機時經由的接口是否符合本處指定的接口;FORWARD, OUTPUT and POSTROUTING;
-m, –match match:顯式指明要使用的擴展模塊;
-j, –jump target:跳轉目標;
我們設置防火墻規則時 一般都是要把入棧進程阻斷!不過最好INPUT OUTPUT都要阻斷最好
練習1.設置防火墻規則為默認禁止所有人訪問,只允許自10.1.250.28主機進行訪問
練習2、在上提基礎上加上允許10.1.0.0/16網絡上的主機都能訪問但10.1.249.175不能訪問
練習3、刪除練習1的記錄條目兩種方法
練習4、僅允許10.1.0.0/16網段對本機(10.1.6.72)tcp開放
2.擴展匹配條件:
隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展;此處主要指使用-p {tcp|udp|icmp}給定協議后可直接對給定的協議所進行的擴展;
- -p tcp:可直接使用tcp協議對應的擴展選項;
[!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口;
[!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;
[!] --tcp-flags mask(所有標志位) comp(標志位為1)
SYN,ACK,FIN,RST,URG,PSH;
mask:要檢查的標志位列表,以逗號分隔,例如SYN,ACK,FIN,RST
comp:mask給定的眾標志位中,其值必須為1的標志位列表,余下的必須為0;
--tcp-flags SYN,ACK,FIN,RST SYN
[!] --syn:相當于--tcp-flags SYN,ACK,FIN,RST SYN
表示匹配 tcp標志位中的SYN,ACK,FIN,RST,且其中只有SYN為1其他為0的位
TCP握手的第一次,初次連接
- -p udp:可直接使用udp協議對應的擴展選項;
[!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口;
[!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;
- -p icmp:可直接使用icmp協議對應的擴展選項;
[!] --icmp-type {type[/code]|typename}
--icmp-type 0/0:匹配對ping請求的響應報文
--icmp-type 8/0:匹配ping請求報文
例1.:僅開放本機(10.1.6.72)tcp 22號端口給本網段
–
例2、在1的基礎上允許別人ping本地主機
例3、在此基礎上允許自己ping其他主機
(2)顯式擴展:必須使用-m選項給出matchname的擴展,而且有些擴展都還存在專用選項;
1、multiport
以離散或連續的方式定義的多端口匹配條件; Up to 15 ports can be specified.
[!] --source-ports,--sports port[,port|,port:port]...‘:’指定多個源端口;
[!] --destination-ports,--dports port[,port|,port:port]...‘:’指定多個目標端口;
[!] --ports port[,port|,port:port]...‘:’匹配此處指定的源或目標端口;
2、iprange
以連續的ip地址范圍指明多地址匹配條件;
[!] --src-range from[-to]
[!] --dst-range from[-to]
3、string
對報文中的應用層數據做字符串匹配檢測;
[!] --string pattern
[!] --hex-string pattern
--algo {bm|kmp}:字符串匹配檢查算法;
--from offset 不檢查from之前的字符
--to offset 到達的to字符之后的字符
iptables -I OUTPUT -s 10.1.0.6 -p tcp --sport 80 -m string --string "haha" --algo bm -j REJECT
表示定義到達本機(10.1.0.6)上的tcp 80端口用 bm算法匹配到含有字符為 “haha” 的就拒絕并回
例:服務端對 “haha“字符做了限制
–
客戶端也可以對請求的網頁做限制
–
4、time
根據報文到達的時間與指定的時間范圍進行匹配度檢測;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]:只給定起始表示從這時開始一直有效
--timestop hh:mm[:ss]:表示到此就完了
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
iptables -I INPUT -d 10.1.6.72 -p tcp –dport 23 -m time –timestart 1600 –timestop 09
00 ! –weekdays Sat,Sun -j REJECT
5、connlimit
根據每客戶端IP做并發連接數限制,即限制單IP可同時發起連接請求;
--connlimit-upto n:連接數小于等于閾值;
--connlimit-above n:連接數超出閾值;
~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
單個ip的請求的連接請求大于 2個就REJECT
6、limit
基于收發報文的速率進行匹配;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT
設置令牌桶為3 每分鐘20個
7、state *重要
狀態檢測:連接追蹤機制(conntrack)
相當于在連接前建立了一個表,每次連接前都要與這個表中的ip匹配,這張表中的內容會有默認的保存時間! 不要隨意打開這個連接追蹤器,因為如果訪問并發數非常大的話就會導致某些請求相應不了!
NEW:新連接
ESTABLISHED:已建立的連接,
NEW狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信的狀態
RELATED:相關聯的連接
如ftp協議的命令連接與數據連接之間的關系;
modprobe nf_conntrack_ftp 要先打開這個
INVALID:無法識別的連接
UNTRACKED:未被追蹤連接;
[!] --state state
相關的內核模塊:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp
-
已經追蹤到并記錄下的連接:
/proc/net/nf_conntrack
-
能追蹤的最大連接數量定義在:
/proc/sys/net/nf_conntrack_max 建議調整至足夠大;和內存空間有關系
-
不同的協議的連接追蹤時長:
/proc/sys/net/netfilter/ [!] --state state
–
如何開放被動模式的ftp服務:
(1) 裝載追蹤ftp協議的模塊;
# modprobe nf_conntrack_ftp
這個模塊是Netfilter專門用來處理FTP這個復雜協議的模塊,它能夠將FTP的數據包標識為RELATED狀態,從而允許使用被動模式訪問。
使用命令: modprobe nf_conntrack_ftp 加載該模塊,之后客戶端就能以被動模式連接至FTP服務器了。
(2) 放行入站命令連接
# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
(3) 放行入站數據連接
# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(4) 放行出站的ESTABLISHED連接
# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
1.處理動作(跳轉目標):
-j tagetname [per-target-options]
-
簡單target:
ACCEPT,DROP -
擴展target:
REJECT:
–reject-with type
默認為icmp-port-unreachable;
icmp-net-unreachable, 網絡不可達
icmp-host-unreachable, 主機不可達
icmp-port-unreachable, 端口不可達
icmp-proto-unreach‐able, 協議不可達
icmp-net-prohibited, 網絡被禁止
icmp-host-prohibited, 主機被禁止
icmp-admin-prohibited, 管理禁止
* 表示所有
LOG: 要在拒絕之前使用
Turn on kernel logging of matching packets.
--log-level level
--log-prefix prefix:日志信息的前導信息;
-j LOG --log-prefix prefix "內容表示 日志信息的前綴"
規則優化的思路:
- (1) 優先放行雙方向狀態為ESTABLISHED的報文;
- (2) 服務于不同類別的功能的規則,匹配到報文可能性更大的放前面;
- (3) 服務于同一類別的功能的規則,匹配條件較為嚴格的放前面;
- (4) 設置默認策略:白名單機制
- (a) 可使用iptables -P設定默認策略;
- (b) 建議在規則鏈的最后定義規則做為默認策略;
保存和載入規則:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE 注意默認會清空原有的表!
-n, --noflush:不清除原有規則
-t, --test:僅分析生成規則集,但不予提交;
注意:重載文件中的規則,會清除已有規則;
CentOS 6:要先要有這個文件
保存規則:service iptables save
保存規則于/etc/sysconfig/iptables,保存操作會清除文件中原有的內容;
重載規則:server iptables restart
默認重載/etc/sysconfig/iptables文件中的規則
腳本配置文件:/etc/sysconfig/iptables-config
用于指明要裝載的模塊;
IPTABLES_MODULES="nf_conntrack_ftp"就會把依賴的模塊裝載,先要touch 一個/etc/sysconfig/iptables 就能裝載此文件了
CentOS 7開機自動生效規則:
(1) firewalld服務;
(2) shell腳本,直接記錄iptables命令;
(3) 自定義unit file或init script;
自動生效規則文件中的規則:
把iptables命令放在腳本文件中,讓腳本文件開機自動運行
/etc/rc.d/rc.local
iptables-restore < /PATH/TO/SOME_RULE_FILE
或者此文件內寫上腳本的路徑 /usr/bin/iptables.sh
練習:
基于狀態放行telnet, ftp, ssh, http, samba, icmp等服務;
- (1) 對本機的ping請求每分鐘不得超出20個;
- (2) 每客戶端對本機的ssh的并發連接數不得超過3個;
- (3) 本機的telnet服務僅允許工作時間內訪問;
iptables -I INPUT -d 10.1.6.72 -p icmp --icmp-type 8 -m limit --limit-burst 1 --limit 20/minute
設置對本機的ping請求不超過20/min
~]# iptables -I INPUT -d 10.1.6.72 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
設置22端口 ssh的連接數不能大于3個
iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --weekdays Sat,Sun --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
設置周六周天拒絕telnet服務
iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --timestart 10:00:00 --timestop 00:00:00 --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
設置非工作時間禁止使用telnet
iptables -A INPUT -d 10.1.6.72 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
設置允許RELATED ESTABLISHED
~]# iptables -A INPUT -d 10.1.6.72 -p tcp -m multiport --dport 21:23,80,139,445 -m state --state NEW -j ACCEPT
設置對21:22:80:139:445第一次請求不限制
iptables -A INPUT -d 10.1.6.72 -p udp -m multiport --dport 138,139 -m state --state NEW -j ACCEPT
設置對138,139號udp端口的第一次相應不限制
iptables -A INPUT -d 10.1.6.72/32 -j REJECT
禁止其他對端口的訪問
iptables -A OUTPUT -s 10.1.6.72 -p udp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 10.1.6.72 -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 10.1.6.72 -p icmp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 10.1.6.72/32 -j REJECT
原創文章,作者:qzx,如若轉載,請注明出處:http://www.www58058.com/54715