iptables防火牆基本概念及用法
iptables防火牆基本概念及用法
-------------------------------------------------------------------------------------------------------------------------------------------
◆***檢測與管理系統(Intrusion Detection Systems):特點是不阻斷任何網路訪問,量化、定位來自內外網路的威脅情況,主要以提供報告和事後監督為主,提供有針對性的指導措施和安全決策依據。一般採用旁路部署方式
◆***防禦系統(Intrusion Prevention System):以透明模式工作,分析資料包的內容如:溢位***、拒絕服務***、***、蠕蟲、系統漏洞等進行準確的分析判斷,在判定為***行為後立即予以阻斷,主動而有效的保護網路的安全,一般採用線上部署方式
◆防火牆(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 7、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:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作作出處理
內建處理動作: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]預設,其餘項不能省
◆1、基本匹配條件:無需載入模組,由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]]
3、iptables -t nat -A POSTROUTING -s LocalNET! -d LocalNet -j SNAT --to-source ExtIP
4、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