iptables防火牆基本概念及用法
前端
-------------------------------------------------------------------------------------------------------------------------------------------
linux
◆***檢測與管理系統(Intrusion Detection Systems):特色是不阻斷任何網絡訪問,量化、定位來自內外網絡的威脅狀況,主要以提供報告和過後監督爲主,提供有針對性的指導措施和安全決策依據。通常採用旁路部署方式vim
◆***防護系統(Intrusion Prevention System):以透明模式工做,分析數據包的內容如:溢出***、拒絕服務***、***、蠕蟲、系統漏洞等進行準確的分析判斷,在斷定爲***行爲後當即予以阻斷,主動而有效的保護網絡的安全,通常採用在線部署方式centos
◆防火牆(FireWall):隔離功能,工做在網絡或主機邊緣(網絡進出的邊緣),對進出網絡或主機的數據包基於必定的規則檢查,並在匹配某規則時由規則定義的行爲進行處理的一組功能的組件,基本上的實現都是默認狀況下關閉全部的經過型訪問,只開放容許訪問的策略。防火牆是經過包過濾(packet filter)方式進行防禦的安全
面向某些特定的ip鏈接,設置白名單;面向全網絡訪問,只不容許某些ip訪問設置黑名單 服務器
●硬件防火牆:在專用硬件級別實現部分功能的防火牆;另外一個部分功能基於軟件實現,Checkpoint,NetScreen
●網絡層防火牆:OSI模型下四層,傳輸層如下,效果好,但識別精度不高
應用層防火牆/代理服務器:代理網關,OSI模型七層,識別精度高,但實現防火牆的延遲高
●網絡層對數據包進行選擇,選擇的依據是系統內設置的過濾邏輯,被稱爲訪問控制列表(ACL),經過檢查數據流中每一個數據的源地址,目的地址,所用端口號和協議狀態等因素,或他們的組合來肯定是否容許該數據包經過
◆應用層防火牆/代理服務型防火牆(Proxy Service)
●內核中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而這五個hook function向用戶開放,用戶能夠經過一個命令工具(iptables)向其寫入規則
●由信息過濾表(table)組成,包含控制IP包處理的規則集(rules),規則被分組放在鏈(chain)上
●流入本機:PREROUTING --> INPUT-->用戶空間進程
●流出本機:用戶空間進程-->OUTPUT--> POSTROUTING
●轉發:PREROUTING --> FORWARD --> POSTROUTING
●用來編寫規則,寫好的規則被送往netfilter,告訴內核如何去處理信息包
●iptables規則存放在文件/etc/sysconfig/iptables,編寫腳本開機運行iptables-restore < /etc/sysconfig/iptables,可實現開機啓動設置好的防火牆規則
◆firewalld(目前爲止只有rhel 七、centos7使用firewalld,其他大部分linux系統使用的是iptables,因此能夠不使用firewalld,卸載firewalld後安裝iptables,yum -y install iptables-services)
◆iptables由五個表和五個鏈以及一些規則組成,規則放在鏈上,鏈傳送給表上
◆五個表table:filter、nat、mangle、raw、security
filter表:過濾規則表,根據預約義的規則過濾符合條件的數據包
nat表:network address translation 地址轉換規則表
raw:關閉NAT表上啓用的鏈接跟蹤(conntrack)機制,加快封包穿越防火牆速度
security:用於強制訪問控制(MAC)網絡規則,由Linux安全模塊(如SELinux)實現
優先級由高到低的順序爲:security -->raw-->mangle-->nat-->filter
◆nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
◆mangele:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
◆規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動做做出處理
基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
內建處理動做:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...
注意:規則執行順序從上而下,第一個規則處理完後有可能不用向下繼續執行,所以把匹配條件更加精確,範圍更小的規則放到上面
自定義鏈:用於對內置鏈進行擴展或補充,可實現更靈活的規則組織管理機制;只有Hook鉤子調用自定義鏈時,才生效
Centos7:systemctl stop firewalld.service
systemctl disable firewalld.service
◆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] -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],j是jump的意思
注意:圖片摘自紅帽官網,格式有錯誤,圖中input應該是INPUT
◆規則格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
raw, mangle, nat, [filter]默認,其他項不能省
◆一、基本匹配條件:無需加載模塊,由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「
[!] -i, --in-interface name:報文流入的接口;只能應用於數據報文流入環節,只應用於INPUT、FORWARD、PREROUTING鏈,只匹配報文前半段
[!] -o, --out-interface name:報文流出的接口;只能應用於數據報文流出的環節,只應用於FORWARD、OUTPUT、POSTROUTING鏈,只匹配報文後半段
◆2 、擴展匹配條件:須要加載擴展模塊(/usr/lib64/xtables/*.so),方可生效
●(1)隱式擴展:在使用-p選項指明瞭特定的協議時,無需再用-m選項指明擴展模塊的擴展機制,不須要手動加載擴展模塊
[!] --source-port, --sport port[:port]:匹配報文源端口,可爲端口範圍
[!] --destination-port,--dportport[:port]:匹配報文目標端口,可爲範圍
mask 需檢查的標誌位列表,用,分隔,例如SYN,ACK,FIN,RST
comp 在mask列表中必須爲1的標誌位列表,無指定則必須爲0,用,分隔
至關於:--tcp-flags SYN,ACK,FIN,RST SYN
iptables -t filter -I INPUT -p --syn --deport 21 -j ACCEPT
用處:維護系統以前能夠設置iptables -A INPUT -tcp-flags SYN -j REJECT,這麼設置使得已經處於鏈接的用戶不會被踢下線,並且新用戶也鏈接不了,等待全部用戶(who查看鏈接的主機)都不鏈接了再維護系統
[!] --source-port, --sport port[:port]:匹配報文的源端口或端口範圍
[!] --destination-port,--dportport[:port]:匹配報文的目標端口或端口範圍
•icmp:網絡通信探測協議,icmp和ip都屬於第三層網絡層,但在該層的子層中,icmp位於ip層的上面
[!] --icmp-type {type[/code]|typename}
●(2)顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制,要手動加載擴展模塊
[-m matchname[per-match-options]]
•-j targetname[per-target-options]
擴展:REJECT:--reject-with:icmp-port-unreachable默認
CentOS 7: man iptables-extensions
以離散方式定義多端口匹配,最多指定15個端口,一個,隔開的算一個端口,可是好比20:23此樣的算一個端口
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dportsport[,port|,port:port]...
[!] --ports port[,port|,port:port]...多個源或目標端口
示例:iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
[!] --src-range from[-to]源IP地址範圍
[!] --dst-range from[-to]目標IP地址範圍
示例:iptables -A INPUT -d 172.16.1.100 -p tcp --dport80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
適用於:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例:iptables-A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
iptables-A INPUT -s 172.16.0.100 -j REJECT
[!] --hex-string pattern要檢測字符串模式,16進制格式
示例:iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
[!] --monthdays day[,day...] 每月的幾號
[!] --weekdays day[,day...] 星期幾,1 –7 分別表示星期一到星期日
--kerneltz:內核時區,不建議使用,CentOS7系統默認爲UTC
注意:centos6 不支持kerneltz,--localtz指定本地時區(默認)
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
可防止CC(Challenge Collapsar挑戰黑洞)***--connlimit-upto#:鏈接的數量小於等於#時匹配
--connlimit-above #:鏈接的數量大於#時匹配
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
令牌桶過濾器:勻速放行,每一個時間段存放固定數量的報文,以致於發送報文是勻速放行
--limit #[/second|/minute|/hour|/day]
iptables-I INPUT -d 172.16.100.10 -p icmp--icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables-I INPUT 2 -p icmp-j REJECT
NEW:新發出請求;鏈接追蹤信息庫中不存在此鏈接的相關信息條目,所以,將其識別爲第一次發出的請求,三次握手第一次
ESTABLISHED:NEW狀態以後,鏈接追蹤信息庫中爲其創建的條目失效以前期間內所進行的通訊狀態
RELATED:新發起的但與已有鏈接相關聯的鏈接,如:ftp協議中的數據鏈接與命令鏈接之間的關係
iptables-A INPUT -d 172.16.1.10 -p tcp-m multiport --dports22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables-A OUTPUT -s 172.16.1.10 -p tcp-m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
●調整鏈接追蹤功能所可以容納的最大鏈接數量,此值能夠修改,建議必要時調整到足夠大
/proc/sys/net/nf_conntrack_max
●注意:CentOS7 須要加載模塊:modprobenf_conntrack
舉例:iptables的連接跟蹤表最大容量爲/proc/sys/net/nf_conntrack_max,各類狀態的超時連接會從表中刪除;當模板滿載時,後續鏈接可能會超時,解決方法兩個:
net.netfilter.nf_conntrack_max= 393216
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
跟蹤模塊路徑:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config配置文件
IPTABLES_MODULES=「nf_conntrack_ftp"
iptables–I INPUT -d LocalIP-p tcp-m state --state ESTABLISHED,RELATED -j ACCEPT
iptables-A INPUT -d LocalIP-p tcp--dport21 -m state --state NEW -j ACCEPT
iptables-I OUTPUT -s LocalIP-p tcp-m state --state ESTABLISHED -j ACCEPT
iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables-A INPUT -p tcp--dport21 -m state --state NEW -j ACCEPT
iptables-A OUTPUT -m state --state ESTABLISHED -j ACCEPT
●LOG,SNAT,DNAT,REDIRECT,MASQUERADE,..
●LOG:非中斷target,自己不拒絕和容許,放在拒絕和容許規則前,並將日誌記錄在/var/log/messages系統日誌中
--log-level level 級別:debug,info,notice, warning, error, crit, alert,emerg
--log-prefix prefix 日誌前綴,用於區別不一樣的日誌,最多29個字符
iptables-I INPUT -s 10.0.1.0/24 -p tcp-m multiport --dports80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: "
● 安全放行全部入站和出站的狀態爲ESTABLISHED狀態鏈接
● 同類規則(訪問同一應用),匹配範圍小的放在前面,用於特殊處理
使用iptables命令定義的規則,手動刪除以前,其生效期限爲kernel存活期限
將規則覆蓋保存至/etc/sysconfig/iptables文件中
iptables-save > /etc/sysconfig/iptables
會自動從/etc/sysconfig/iptables從新載入規則
iptables-restore < /PATH/FROM/SOME_RULES_FILE
◆(1) 用腳本保存各iptables命令;讓此腳本開機後自動運行
◆(2) 用規則文件保存各規則,開機時自動載入此規則文件中的規則
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
◆(3)自定義Unit File,進行iptables-restore
(1) 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性
(2) 若是要啓用conntrack機制,建議將雙方向的狀態爲ESTABLISHED的報文直接放行
NAT:network address translation
PREROUTING,INPUT,OUTPUT,POSTROUTING
SNAT:source NAT POSTROUTING,INPUT
讓本地網絡的主機經過某一特定地址訪問外部網絡,實現地址假裝,好比說在公司內部訪問外部網站,使用的ip是通過SNAT轉換過的公司外網IP
DNAT:destination NAT PREROUTING,OUTPUT
把本地網絡中的主機上的某服務開放給外部網絡訪問(發佈服務和端口映射),但隱藏真實IP,好比說內部服務器開放了80端口,外網訪問公司的httpd服務是訪問開放80端口的服務器
PNAT:port nat,端口和IP都進行修改,通常咱們說的NAT就是指PNAT
--to-source [ipaddr[-ipaddr]][:port[-port]]
三、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.1.6-172.18.1.9