防火牆基礎入門

防火牆概念

安全技術

入侵檢測與管理系統(Intrusion Detection Systems):特 點是不阻斷任何網絡訪問,量化、定位來自內外網絡的威脅狀況,主要以提供報告和過後監督爲主,提供有針對性的指導措 施和安全決策依據。通常採用旁路部署方式前端

入侵防護系統(Intrusion Prevention System):以透明模式工做,分析數據包的內容如:溢出攻擊、拒絕服務攻擊、木 馬、蠕蟲、系統漏洞等進行準確的分析判斷,在斷定爲攻擊行爲後當即予以阻斷,主動而有效的保護網絡的安全,通常採用在線部署方式mysql

防火牆( FireWall ):隔離功能,工做在網絡或主機邊緣, 對進出網絡或主機的數據包基於必定的規則檢查,並在匹配某 規則時由規則定義的行爲進行處理的一組功能的組件,基本上 的實現都是默認狀況下關閉全部的經過型訪問,只開放容許訪問的策略linux

防火牆的分類

主機防火牆:服務範圍爲當前主機
網絡防火牆:服務範圍爲防火牆一側的局域網
硬件防火牆:在專用硬件級別實現部分功能的防火牆;另外一 個部分功能基於軟件實現,Checkpoint,NetScreen
軟件防火牆:運行於通用硬件平臺之上的防火牆的應用軟件
網絡層防火牆:OSI下面第三層 應用層防火牆/代理服務器:代理網關,OSI七層web

網絡防火牆

包過濾防火牆
網絡層對數據包進行選擇,選擇的依據是系統內設置的過濾邏輯 ,被稱爲訪問控制列表(ACL),經過檢查數據流中每一個數據的源地址,目的地址,所用端口號和協議狀態等因素,或他們的組合來肯定是否容許該數據包經過
優勢:對用戶來講透明,處理速度快且易於維護
缺點:沒法檢查應用層數據,如病毒等算法

應用層防火牆

應用層防火牆/代理服務型防火牆(Proxy Service)
將全部跨越防火牆的網絡通訊鏈路分爲兩段
內外網用戶的訪問都是經過代理服務器上的「連接」來實現
優勢:在應用層對數據進行檢查,比較安全
缺點:增長防火牆的負載
現實生產環境中所使用的防火牆通常都是兩者結合體
即先檢查網絡數據,經過以後再送到應用層去檢查sql

iptables的基本認識

iptables其實不是真正的防火牆,咱們能夠把它理解成一個客戶端代理,用戶經過iptables這個代理,將用戶的安全設定執行到對應的"安全框架"中,這個"安全框架"纔是真正的防 火牆,這個框架的名字叫netfilter
netfilter纔是防火牆真正的安全框架(framework),netfilter位於內核空間。 iptables實際上是一個命令行工具,位於用戶空間,咱們用這個工具操做真正的框架。
netfilter/iptables(下文中簡稱爲iptables)組成Linux平臺下的包過濾防火牆,與大多數的Linux軟件同樣,這個包過濾防火牆是免費的,它能夠代替昂貴的商業防火牆解決方案, 完成封包過濾、封包重定向和網絡地址轉換(NAT)等功能。
Netfilter是Linux操做系統核心層內部的一個數據包處理模塊,它具備以下功能: 網絡地址轉換(Network Address Translate) 數據包內容修改 以及數據包過濾的防火牆功能
因此說,雖然咱們使用service iptables start啓動iptables"服務",可是其實準確的來講,iptables並無一個守護進程,因此並不能算是真正意義上的服務,而應該算是內核提供的功能。shell

Netfilter組件

內核空間,集成在linux內核中
擴展各類網絡服務的結構化底層框架
內核中選取五個位置放了五個hook(勾子) function(INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING), 而這五個hook function向用戶開放,用戶能夠經過一個命令工 具(iptables)向其寫入規則
由信息過濾表(table)組成,包含控制IP包處理的規則集( rules),規則被分組放在鏈(chain)上
報文流向
數據庫

三種報文流向:

流入本機:PREROUTING --> INPUT-->用戶空間進程
流出本機:用戶空間進程 -->OUTPUT--> POSTROUTING
轉發:PREROUTING --> FORWARD --> POSTROUTINGvim

防火牆工具

iptables
命令行工具,工做在用戶空間
用來編寫規則,寫好的規則被送往netfilter,告訴內核如何去處理信息包 firewalld
CentOS 7引入了新的前端管理工具
管理工具:
firewall-cmd 命令行
firewall-config 圖形centos

iptables組成

iptables由四個表和五個鏈以及一些規則組成
四個表table:filter、nat、mangle、raw
filter表:過濾規則表,根據預約義的規則過濾符合條件的數據包
nat表:network address translation 地址轉換規則表
mangle:修改數據標記位規則表
Raw:關閉NAT表上啓用的鏈接跟蹤機制,加快封包穿越防火牆速度
優先級由高到低的順序爲:raw-->mangle-->nat-->filter

五個內置鏈chain
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING

Netfilter表、鏈對應關係

raw     表中的規則能夠被哪些鏈使用:PREROUTING,OUTPUT
mangle  表中的規則能夠被哪些鏈使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat     表中的規則能夠被哪些鏈使用:PREROUTING,OUTPUT,POSTROUTING(centos7中還有INPUT,centos6中沒有)
filter  表中的規則能夠被哪些鏈使用:INPUT,FORWARD,OUTPUT

PREROUTING   的規則能夠存在於:raw表,mangle表,nat表。
INPUT        的規則能夠存在於:mangle表,filter表,(centos7中還有nat表,centos6中沒有)。
FORWARD      的規則能夠存在於:mangle表,filter表。
OUTPUT       的規則能夠存在於:raw表mangle表,nat表,filter表。
POSTROUTING  的規則能夠存在於:mangle表,nat表。

內核中數據包的傳輸過程

內核中數據包的傳輸過程
當一個數據包進入網卡時,數據包首先進入PREROUTING鏈, 內核根據數據包目的IP判斷是否須要轉送出去
若是數據包就是進入本機的,數據包就會沿着圖向下移動,到達 INPUT鏈。數據包到達INPUT鏈後,任何進程都會收到它。本機上運行的程序能夠發送數據包,這些數據包通過OUTPUT鏈 ,而後到達POSTROUTING鏈輸出
若是數據包是要轉發出去的,且內核容許轉發,數據包就會向右移動,通過FORWARD鏈,而後到達POSTROUTING鏈輸出

iptables規則

規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動做做出處理
匹配條件:默認爲與條件,同時知足基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
擴展匹配:經過複雜高級功能匹配

處理動做:稱爲target,跳轉目標內建處理動做:ACCEPT,DROP,REJECT,SNAT,DNAT MASQUERADE,MARK,LOG...
自定義處理動做:自定義chain,利用分類管理複雜情形
規則要添加在鏈上,才生效;添加在自定義上不會自動生效
鏈chain:
內置鏈:每一個內置鏈對應於一個鉤子函數
自定義鏈:用於對內置鏈進行擴展或補充,可實現更靈活的規則組織管理機制;只有Hook鉤子調用自定義鏈時,才生效

iptables添加要點

iptables規則添加時考量點
要實現哪一種功能:判斷添加在哪張表上
報文流經的路徑:判斷添加在哪一個鏈上
報文的流向:判斷源和目的
匹配規則:業務須要
鏈上規則的次序,即爲檢查的次序,所以隱含必定的法則
同類規則(訪問同一應用),匹配範圍小的放上面
不一樣類規則(訪問不一樣應用),匹配到報文頻率較大的放上面
將那些可由一條規則描述的多個規則合併爲一個
設置默認策略
實驗環境準備:
Centos7:
systemctl stop firewalld.service
systemctl disable firewalld. service
Centos6:
service iptables stop;
chkconfig iptables off

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]

規則格式:

iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-targetoptions]

-t table: raw, mangle, nat, [filter]默認

SUBCOMMAND:
一、鏈管理:
-N:new, 自定義一條新的規則鏈
-D:delete,刪除自定義的空的規則鏈
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
-E:重命名自定義鏈;引用計數不爲0的自定義鏈不可以被重命名, 也不能被刪除
二、查看:
-L:list, 列出指定鏈上的全部規則,本選項須置後
-n:numberic,以數字格式顯示地址和端口號
-v:verbose,詳細信息
-vv 更詳細
-x:exactly,顯示計數器結果的精確值,而非單位轉換後的
易讀值
--line-numbers:顯示規則的序號
經常使用組合:
--vnL
--vvnxL --line-numbers
-S selected,以iptables-save 命令格式顯示鏈上規則
三、規則管理:
-A:append,追加
-I:insert, 插入,要指明插入至的規則編號,默認爲第一條
-D:delete,刪除

(1) 指明規則序號

(2) 指明規則自己
-R:replace,替換指定鏈上的指定規則編號
-F:flush,清空指定的規則鏈
-Z:zero,置零
iptables的每條規則都有兩個計數器

(1) 匹配到的報文的個數

(2) 匹配到的全部報文的大小之和
chain:PREROUTING,INPUT,FORWARD,OUTPUT, POSTROUTING

匹配條件

基本:通用的,PARAMETERS
擴展:需加載模塊,MATCH EXTENTIONS
一、基本匹配條件:無需加載模塊,由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, mh or 「all「 參看:/etc/protocols
[!] -i, --in-interface name:報文流入的接口;只能應用於數據報文流入環節,只應用於INPUT、FORWARD、PREROUTING鏈
[!] -o, --out-interface name:報文流出的接口;只能應用於數據報文流出的環節,只應用於FORWARD、OUTPUT、POSTROUTING鏈
2 擴展匹配條件:須要加載擴展模塊(/usr/lib64/xtables/*.so) ,方可生效
查看幫助 man iptables-extensions
(1)隱式擴展:在使用-p選項指明瞭特定的協議時,無需再用-m選項指明擴展模塊的擴展機制,不須要手動加載擴展模塊
tcp協議的擴展選項
[!] --source-port, --sport port[:port]:匹配報文源端口, 可爲端口範圍
[!] --destination-port,--dport port[:port]:匹配報文目標 端口,可爲範圍
[!] --tcp-flags mask comp
mask 需檢查的標誌位列表,用,分隔
例如 SYN,ACK,FIN,RST
comp 在mask列表中必須爲1的標誌位列表,無指定則必須 爲0,用,分隔

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_flags ALL NONE
[!] --syn:用於匹配第一次握手
至關於:--tcp-flags SYN,ACK,FIN,RST SYN

udp、icmp拓展選項

udp
[!] --source-port, --sport port[:port]:匹配報文的 源端口;能夠是端口範圍
[!] --destination-port,--dport port[:port]:匹配報 文的目標端口;能夠是端口範圍

icmp
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp應答
8/0 echo-request icmp請求
(2)顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制,要手動加載擴展模塊

[-m matchname [per-match-options]]

處理動做

-j targetname [per-target-options]
簡單: ACCEPT,DROP
擴展: REJECT:--reject-with:icmp-port-unreachable默認
RETURN:返回調用鏈
REDIRECT:端口重定向
LOG:記錄日誌,dmesg
MARK:作防火牆標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址假裝 ...
自定義鏈:

規則擴展

顯式擴展:必須顯式地指明使用的擴展模塊進行的擴展
使用幫助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
一、multiport擴展
以離散方式定義多端口匹配,最多指定15個端口
[!] --source-ports,--sports port[,port|,port:port]... 指定多個源端口
[!] --destination-ports,--dports port[,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

二、iprange擴展
指明連續的(但通常不是整個網絡)ip地址範圍
[!] --src-range from[-to] 源IP地址範圍
[!] --dst-range from[-to] 目標IP地址範圍
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP

三、mac擴展
指明源MAC地址
適用於:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例:
iptables -A INPUT -s 172.16.0.100 -m mac --macsource 00:50:56:12:34:56 -j ACCEPT
iptables -A INPUT -s 172.16.0.100 -j REJECT

四、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 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string 「google" -j REJECT

五、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...] 星期幾
--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

六、connlimit擴展
根據每客戶端IP作併發鏈接數數量匹配
可防止CC(Challenge Collapsar挑戰黑洞)攻擊
--connlimit-upto n:鏈接的數量小於等於n時匹配
--connlimit-above n:鏈接的數量大於n時匹配
一般分別與默認的拒絕或容許策略配合使用
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

七、limit擴展
基於收發報文的速率作匹配
令牌桶過濾器
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
示例:

iptables -I INPUT -d 172.16.100.10 -p icmp --icmptype 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT 
#在默認filter表中插入規則,目標地址爲172.16.100.10的icmp協議的請求報文數量達到5個之後限制沒分鐘接受3個

iptables -I INPUT 2 -p icmp -j REJECT

八、state擴展
根據」鏈接追蹤機制「去檢查鏈接的狀態,較耗資源
conntrack機制:追蹤本機上的請求和響應之間的關係
狀態有以下幾種:
NEW:新發出請求;鏈接追蹤信息庫中不存在此鏈接的相關信息條目,所以,將其識別爲第一次發出的請求
ESTABLISHED:NEW狀態以後,鏈接追蹤信息庫中爲其創建的條目失效以前期間內所進行的通訊狀態
RELATED:新發起的但與已有鏈接相關聯的鏈接,
如: ftp協議中的數據鏈接與命令鏈接之間的關係
INVALID:無效的鏈接,如flag標記不正確
UNTRACKED:未進行追蹤的鏈接,如raw表中關閉追蹤
[!] --state state
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport -dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.10 -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 須要加載模塊:
modprobe nf_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_conntrack timeout時間

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

開放被動模式的ftp服務

(1) 裝載ftp鏈接追蹤的專用模塊:
跟蹤模塊路徑:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=" nf_conntrack_ftp "
modproble nf_conntrack_ftp #加載模塊命令

(2) 放行請求報文:
命令鏈接:NEW, ESTABLISHED
數據鏈接:RELATED, ESTABLISHED

iptables –I INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 
#加入規則,容許目標端口爲本機的TCP協議已經創建連接,和相關的數據
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state -state NEW -j ACCEPT
#開放本機TCP21端口的請求數據

(3) 放行響應報文:
iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT

開放被動模式的ftp服務示例:
yum install vsftpd
systemctl start vsftpd
modprobe nf_conntrack_ftp
iptables -F
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state -state NEW -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -vnL

Target

ACCEPT, DROP, REJECT, RETURN
LOG, SNAT, DNAT, REDIRECT, MASQUERADE,..
LOG: 非中斷target,自己不拒絕和容許,放在拒絕和容許規則前
並將日誌記錄在/var/log/messages系統日誌中
--log-level level 級別: emerg, alert, crit, error, warning, notice, info or debug
--log-prefix prefix 日誌前綴,用於區別不一樣的日誌,最多29個字符
示例:
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multimport -dports 80,21,22,23 -m state --state NEW -j LOG -log-prefix "new connections: "

規則優化

任何不容許的訪問,應該在請求到達時給予拒絕
規則在連接上的次序即爲其檢查時的生效次序
基於上述,規則優化
1 安全放行全部入站和出站的狀態爲ESTABLISHED狀態鏈接
2 謹慎放行入站的新請求
3 有特殊目的限制訪問功能,要在放行規則以前加以拒絕
4 同類規則(訪問同一應用),匹配範圍小的放在前面,用於特 殊處理
5 不一樣類的規則(訪問不一樣應用),匹配範圍大的放在前面
6 應該將那些可由一條規則可以描述的多個規則合併爲一條
7 設置默認策略,建議白名單(只放行特定鏈接)
1) iptables -P,不建議(系統默認規則)
2) 建議在規則的最後定義規則作爲默認策略

規則有效期限

使用iptables命令定義的規則,手動刪除以前,其生效期限爲 kernel存活期限(和內存同樣,關機就丟失了)
保存規則:
保存規則至指定的文件
CentOS 6
service iptables save
將規則覆蓋保存至/etc/sysconfig/iptables文件中

[root@Centos6 ~]#iptables -I INPUT -s 172.18.45.6 -p icmp -j REJECT
#在INPUT鏈中添加規則拒絕源IP地址爲172.18.45.6的icmp協議數據
[root@Centos6 ~]#service iptables save
iptables: Saving firewall rules to
/etc/sysconfig/iptables:[  OK  ]
#將現有的防火牆策略覆蓋到/etc/sysconfig/iptables 文件中
[root@Centos6 ~]#cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Fri Oct 20 07:16:46 2017
*filter
:INPUT ACCEPT [147:11915]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [49:5736]
-A INPUT -s 172.18.45.6/32 -p icmp -j REJECT --reject-with icmp-port-unreachable 
COMMIT
# Completed on Fri Oct 20 07:16:46 2017

CentOS 7
在CentOS7中,已經再也不使用init風格的腳本啓動服務,而是使用unit文件,就不能再使用service命令了,因此在CentOS7中並不支持service iptables save命令。同時在CentOS7中,使用了firewalld替代了原來的iptables service。CentOS7中仍然默認安裝了iptables,可是沒有iptables-service包,在yum安裝iptables-service以後,仍然可使用原有的命令service iptables save來保存iptables規則,並且文件保存的位置一樣在/etc/sysconfig/iptables文件中。
CentOS7中默認使用的防火牆控制工具是firewalld,若是要繼續使用iptables來控制防火牆的話,最好先把firewalld服務禁掉。

yum install -y iptables-service
#安裝iptables服務包
systemctl stop firewalld
#禁用firewalld服務
systemctl disable firewalld
#禁止firewalld服務開機自動啓動
systemctl start iptables
systemctl enable iptables
#開啓iptables服務,設置iptables服務開機啓動

CentOS的防火牆規則可用下面方法保存規則
iptables -S > /PATH/TO/SOME_RULES_FILE
iptables-save > /PATH/TO/SOME_RULES_FILE

規則載入

CentOS 6:
service iptables restart
會自動從/etc/sysconfig/iptables 從新載入規則
CentOS 7
從新載入預存規則文件中規則:
iptables-restore < /PATH/FROM/SOME_RULES_FILE
-n, --noflush:不清除原有規則
-t, --test:僅分析生成規則集,但不提交
開機自動重載規則文件中的規則:

(1) 用腳本保存各iptables命令;讓此腳本開機後自動運行
/etc/rc.d/rc.local文件中添加腳本路徑 /PATH/TO/SOME_SCRIPT_FILE

(2) 用規則文件保存各規則,開機時自動載入此規則文件中的規則 /etc/rc.d/rc.local文件添加
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
(3)自定義Unit File,進行iptables-restore

網絡防火牆

iptables/netfilter網絡防火牆:

(1) 充當網關

(2) 使用filter表的FORWARD鏈

注意的問題:

(1) 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性

(2) 若是要啓用conntrack機制,建議將雙方向的狀態爲ESTABLISHED的報文直接放行

NAT

NAT: network address translation,網絡地址轉換,通俗來說就是修改報文的IP地址,NAT功能一般會被集成到路由器、防火牆、或者獨立的NAT設備中。
PREROUTING,INPUT,OUTPUT,POSTROUTING
請求報文:修改源/目標IP,由定義如何修改
響應報文:修改源/目標IP,根據跟蹤機制自動實現

SNAT原理

SNAT:source NAT POSTROUTING, INPUT(網絡源地址轉換)
讓本地網絡中的主機經過某一特定地址訪問外部網絡,實現地址假裝
請求報文:修改源IP,發生在POSTROUTING鏈

假設,網絡內部有10臺主機,它們有各自的IP地址,當網絡內部的主機與其餘網絡中的主機通信時,則會暴露本身的IP地址,若是咱們想要隱藏這些主機的IP地址,該怎麼辦呢?能夠這樣辦,以下。
當網絡內部的主機向網絡外部主機發送報文時,報文會通過防火牆或路由器,當報文通過防火牆或路由器時,將報文的源IP修改成防火牆或者路由器的IP地址,當其餘網絡中的主機收到這些報文時,顯示的源IP地址則是路由器或者防火牆的,而不是那10臺主機的IP地址,這樣,就起到隱藏網絡內部主機IP的做用,當網絡內部主機的報文通過路由器時,路由器會維護一張NAT表,表中記錄了報文來自於哪一個內部主機的哪一個進程(內部主機IP+端口),當報文通過路由器時,路由器會將報文的內部主機源IP替換爲路由器的IP地址,把源端口也映射爲某個端口,NAT表會把這種對應關係記錄下來。
因而,外部主機收到報文時,源IP與源端口顯示的都是路由的IP與端口,當外部網絡中的主機進行迴應時,外部主機將響應報文發送給路由器,路由器根據剛纔NAT表中的映射記錄,將響應報文中的目標IP與目標端口再改成內部主機的IP與端口號,而後再將響應報文發送給內部網絡中的主機。整個過程當中,外部主機都不知道內部主機的IP地址,內部主機還能與外部主機通信,因而起到了隱藏網絡內主機IP的做用。
上述整個過程當中,就用到了NAT功能,準確的說是用到了NAPT功能,NAPT是NAT的一種,全稱爲Network Address Port Translation,說白了就是映射報文IP地址的同時還會映射其端口號,就像剛纔描述的過程同樣。
剛纔描述的過程當中,"IP地址的轉換"一共發生了兩次。
內部網絡的報文發送出去時,報文的源IP會被修改,也就是源地址轉換:Source Network ddress Translation,縮寫爲SNAT。
外部網絡的報文響應時,響應報文的目標IP會再次被修改,也就是目標地址轉換:estinationnetwork address translation,縮寫爲DNAT。
可是,上述"整個過程"被稱爲SNAT,由於"整個過程"的前半段使用了SNAT,若是上述"整個過程"的前半段使用了DNAT,則整個過程被稱爲DNAT,也就是說,整個過程被稱爲SNAT仍是DNAT,取決於整個過程的前半段使用了SNAT仍是DNAT。
其實剛纔描述的場景不只僅可以隱藏網絡內部主機的IP地址,還可以讓局域網內的主機共享公網IP,讓使用私網IP的主機可以訪問互聯網。
好比,整個公司只有一個公網IP,可是整個公司有10臺電腦,咱們怎樣能讓這10臺電腦都訪問互聯網呢?咱們能夠爲這10臺電腦都配置上各自的私網IP,好比"192.168"這種私網IP,可是互聯網是不會路由私網IP的,若是想要訪問互聯網,則必須使用公網IP,那麼,咱們就須要想辦法,能讓這10臺主機共享公司僅有的一個公網IP,沒錯,這與剛纔描述的場景其實徹底一致,咱們只要在路由器上配置公網IP,在私網主機訪問公網服務時,報文通過路由器,路由器將報文中的私網IP與端口號進行修改和映射,將其映射爲公網IP與端口號,這時,內網主機便可共享公網IP訪問互聯網上的服務了。
寫法:
nat表的target:
SNAT:固定IP
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
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.100.6,172.18.100.9

MASQUERADE:有些公司的具備外網的主機的IP地址爲動態IP,如撥號網絡,撥號網絡每次斷開重連主機的IP地址都會變化,那麼就意味着每次IP地址發生變化就要手動的去進行上文中SANT的防火牆配置。MASQUERADE能夠解決這個問題。
--to-ports port[-port]
--random
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
示例:

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j MASQUERADE

DNAT原理

DNAT:destination NAT PREROUTING , OUTPUT 把本地網絡中的主機上的某服務開放給外部網絡訪問(發佈服務和端口映射),但隱藏真實IP
請求報文:修改目標IP,發生在PREROUTING鏈

場景1中,咱們描述的過程爲SNAT的過程,雖然其過程當中也牽扯到DNAT,可是因爲整個過程的前半段使用了SNAT,因此整個過程稱之爲SNAT,那麼在什麼狀況下,整個過程能稱之爲DNAT呢?
沒錯,當整個過程的前半段使用了DNAT時,整個過程被稱爲DNAT,具體場景以下。
公司有本身的局域網,網絡中有兩臺主機做爲服務器,主機1提供web服務,主機2提供數據庫服務,可是這兩臺服務器在局域網中使用私有IP地址,只能被局域網內的主機訪問,互聯網沒法訪問到這兩臺服務器,整個公司只有一個可用的公網IP,怎樣經過這個公網IP訪問到內網中的這些服務呢?咱們能夠將這個公網IP配置到公司的某臺主機或路由器上,而後對外宣稱,這個IP地址對外提供web服務與數據庫服務,因而互聯網主機將請求報文發送給這公網 IP地址,也就是說,此時報文中的目標IP爲公網IP,當路由器收到報文後,將報文的目標地址改成對應的私網地址,好比,若是報文的目標IP與端口號爲:公網IP+3306,咱們就將報文的目標地址與端口改成:主機2的私網IP+3306,同理,公網IP+80端口映射爲主機1的私網IP+80端口,當私網中的主機迴應對應請求報文時,再將回應報文的源地址從私網IP+端口號映射爲公網IP+端口號,再由路由器或公網主機發送給互聯網中的主機。
上述過程也牽扯到DNAT與SNAT,可是因爲整個過程的前半段使用了DNAT,因此上述過程被稱爲DNAT
其實,無論是SNAT仍是DNAT,都起到了隱藏內部主機IP的做用。
寫法:
DNAT
--to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
示例:

iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --todestination 10.0.1.22
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --todestination 10.0.1.22:8080

PNAT: port nat,端口和IP都進行修改

轉發

REDIRECT:
NAT表
可用於:PREROUTING OUTPUT 自定義鏈
經過改變目標IP和端口,將接受的包轉發至不一樣地址 --to-ports port[-port]
示例:

iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080

firewalld服務

firewalld是CentOS 7.0新推出的管理netfilter的工具
firewalld是配置和監控防火牆規則的系統守護進程。能夠實 現iptables,ip6tables,ebtables的功能
firewalld服務由firewalld包提供
firewalld支持劃分區域zone,每一個zone能夠設置獨立的防火牆 規則

納入zone順序:
先根據數據包中源地址,將其納爲某個zone
納爲網絡接口所屬zone
歸入默認zone,默認爲public zone,管理員能夠改成其它zone
網卡默認屬於public zone,lo網絡接口屬於trusted zone

firewalld zone分類

zone名稱 默認配置
trusted 容許全部流量
home 拒絕除和傳出流量相關的,以及ssh,,mdsn,ipp-client,samba-client,dhcpv6-client預約義服務以外 其它全部傳入流量
internal 和home相同
work 拒絕除和傳出流量相關的,以及ssh,ipp-client,dhcpv6-client預約義服務以外其餘全部傳入流量
public 拒絕除和傳出流量相關的,以及ssh,dhcp6-client預約義服務以外的其餘全部流量,新加的網卡默認屬於public zone
external 拒絕除和傳出流量相關的,以及shh預約義服務以外的其餘全部傳入流量,屬於external zone的傳出ipv4流量源地址將被假裝爲傳出網卡的地址
dmz 拒絕和傳出流量相關的,以及ssh預約義服務以外的其餘全部傳入流量
block 拒絕和傳出流量相關的全部傳入流量
drop 拒絕除和傳出流量相關的全部傳入流量(甚至不宜ICMP錯誤進行迴應)

預約義服務

服務名稱 配置
ssh Local SSH server. Traffic to 22/tcp
dhcpv6-client Local DHCPv6 client. Traffic to 546/udp on the fe80::/64 IPv6 network
ipp-client Local IPP printing. Traffic to 631/udp
samba-client Local Windows file and print sharing client. Traffic to 137/udp and 138/udp.
mdns Multicast DNS (mDNS) local-link name resolution. Traffic to 5353/udp to the 224.0.0.251 (IPv4) or ff02::fb (IPv6) multicast addresses.

firewalld配置

firewall-cmd --get-services 查看預約義服務列表
/usr/lib/firewalld/services/*.xml預約義服務的配置
三種配置方法
firewall-config (firewall-config包)圖形工具
firewall-cmd (firewalld包)命令行工具
/etc/firewalld 配置文件,通常不建議

firewalld-cmd命令選項

--get-zones 列出全部可用區域
--get-default-zone 查詢默認區域
--set-default-zone=<ZONE> 設置默認區域
--get-active-zones 列出當前正使用的區域
--add-source=<CIDR>[--zone=<ZONE>] 添加源地 址的流量到指定區域,若是無--zone= 選項,使用默認區域
--remove-source=<CIDR> [--zone=<ZONE>] 從指定區 域中刪除源地址的流量,若是無--zone= 選項,使用默認區 域
--add-interface=<INTERFACE>[--zone=<ZONE>] 添 加來自於指定接口的流量到特定區域,若是無--zone= 選項 ,使用默認區域
--change-interface=<INTERFACE>[--zone=<ZONE>] 改變指定接口至新的區域,若是無--zone= 選項,使用 默認區域
--list-all [--zone=<ZONE>] 列出指定區域的全部配置信 息,包括接口,源地址,端口,服務等,若是無--zone= 選 項,使用默認區域
--add-service=<SERVICE> [--zone=<ZONE>] 容許服務 的流量經過,若是無--zone= 選項,使用默認區域
--add-port=<PORT/PROTOCOL>[--zone=<ZONE>] 允 許指定端口和協議的流量,若是無--zone= 選項,使用默認 區域
--remove-service=<SERVICE> [--zone=<ZONE>] 從 區域中刪除指定服務,禁止該服務流量,若是無--zone= 選 項,使用默認區域
--remove-port=<PORT/PROTOCOL>[--zone=<ZONE>] 從區域中刪除指定端口和協議,禁止該端口的流量,若是 無--zone= 選項,使用默認區域
--reload 刪除當前運行時配置,應用加載永久配置

firewalld-cmd命令示例

查看默認
zone firewall-cmd --get-default-zone
默認zone設爲dmz
firewall-cmd --set-default-zone=dmz
在internal zone中增長源地址192.168.0.0/24的永久規則
firewall-cmd --permanent --zone=internal -add-source=192.168.0.0/24
在internal zone中增長協議mysql的永久規則
firewall-cmd --permanent –zone=internal --addservice=mysql
加載新規則以生效
firewall-cmd --reload

實驗:配置firewalld

systemctl mask iptables #使用umask取消屏蔽
systemctl mask ip6tables
systemctl status firewalld
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone public
firewall-cmd --permanent --zone=public --list-all
firewall-cmd --permanent --zone=public --addport 8080/tcp
firewall-cmd ---reload

其餘規則

當基本firewalld語法規則不能知足要求時,可使用如下更 複雜的規則
rich-rules 富規則,功能強,表達性語言
Direct configuration rules 直接規則,靈活性差
幫助:man 5 firewalld.direct

管理rich規則

rich規則比基本的firewalld語法實現更強的功能,不只實現 容許/拒絕,還能夠實現日誌syslog和auditd,也能夠實現端 口轉發,假裝和限制速率
rich語法:
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
man 5 firewalld.richlanguage

規則

規則實施順序:
該區域的端口轉發,僞造規則
該區域的日誌規則
該區域的容許規則
該區域的拒絕規則
每一個匹配的規則生效,全部規則都不匹配,該區域默認規則 生效

選項 描述
--add-rich-rule='<RULE>' Add <RULE> to the specified zone, or the default zone if no zone is specified.
--remove-rich-rule='<RULE>' Remove <RULE> to the specified zone, or the default zone if no zone is specified.
--query-rich-rule='<RULE>' Query if <RULE> has been added to the specified zone, or the default zone if no zone is specified. Returns 0 if the rule is present, otherwise 1.
--list-rich-rules Outputs all rich rules for the specified zone, or the default zone if no zone is specified.

rich規則示例

拒絕從192.168.0.11的全部流量,當address 選項使用
source 或 destination時,必須用family= ipv4 |ipv6.
firewall-cmd --permanent --zone=classroom --add-richrule='rule family=ipv4 source address=192.168.0.11/32 reject'
限制每分鐘只有兩個鏈接到ftp服務
firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
拋棄esp( IPsec 體系中的一種主要協議)協議的全部數據包
firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'
接受全部192.168.1.0/24子網端口範置7900-7905的TCP流量
firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=79007905 protocol=tcp accept'

rich日誌規則

log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>]
[limit value="<RATE/DURATION>"]
<LOGLEVEL> 能夠是 emerg,alert, crit, error, warning, notice, info, debug.
<DURATION> s:秒, m:分鐘, h:小時, d:天
audit [limit value="<RATE/DURATION>"]
示例:
接受ssh新鏈接,記錄日誌到syslog的notice級別,每分鐘最多三條信息
firewall-cmd --permanent --zone=work --add-richrule='rule service name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept
從2001:db8::/64子網的DNS鏈接在5分鐘內被拒絕,並記 錄到日誌到audit,每小時最大記錄一條信息。
firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300
示例:
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.X.10/32 service name="http" log level=notice prefix="NEW HTTP " limit value="3/s" accept'
firewall-cmd --reload
tail -f /var/log/messages
curl http://serverX.example.com

僞造和端口轉發

NAT網絡地址轉換,firewalld支持僞造和端口轉發兩種NAT 方式
僞造NAT
firewall-cmd --permanent --zone=<ZONE> --addmasquerade
firewall-cmd --permanent --zone=<ZONE> --addrich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'

端口轉發

端口轉發:將發往本機的特定端口的流量轉發到本機或不一樣 機器的另外一個端口。一般要配合地址僞造才能實現
firewall-cmd --permanent --zone=<ZONE> --addforwardport=port=<PORTNUMBER>:proto=<PROTOCOL>[:topor t=<PORTNUMBER>][:toaddr=]
說明:toport= 和toaddr= 至少要指定一個
示例:
轉發傳入的鏈接513/TCP,到訪火牆的132/TCP到public zone 的192.168.0.254
firewall-cmd --permanent --zone=public --addforward-port=port=513:proto=tcp:toport=132:toaddr= 192.168.0.254

rich規則

rich規則語法: forward-port port=<PORTNUM> protocol=tcp|udp [toport=<PORTNUM>][to-addr= 示例: 轉發從192.168.0.0/26來的,發往80/TCP的流量到防火牆的 端口8080/TCP firewall-cmd --permanent --zone=work --add-richrule='rule family=ipv4 source address=192.168.0.0/26 forward-port port=80 protocol=tcp to-port=8080' 示例: firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=172.25.X.10/32 forwardport port=443 protocol=tcp to-port=22' firewall-cmd --reload ssh -p 443 serverX.example.com

相關文章
相關標籤/搜索