安全技術
***檢測與管理系統(Intrusion Detection Systems)IDS:特點是不阻斷任何網絡訪問,量化、定位來自內外網絡的威脅情況,主要以提供報告和事後監督爲主,提供有針對性的指導措
施和安全決策依據。一般採用旁路部署方式
v ***防禦系統(Intrusion Prevention System)IPS:以透明模式工作,分析數據包的內容如:溢出***、拒絕服務***、***、蠕蟲、系統漏洞等進行準確的分析判斷,在判定爲***行爲後立即予以阻斷,主動而有效的保護網絡的安全,一般採用在線部署方式
v 防火牆( FireWall ):隔離功能,工作在網絡或主機邊緣,對進出網絡或主機的數據包基於一定的規則檢查,並在匹配某規則時由規則定義的行爲進行處理的一組功能的組件,基本上的實現都是默認情況下關閉所有的通過型訪問,只開放允許訪問的策略
防火牆的分類
主機防火牆:服務範圍爲當前主機網絡防火牆:服務範圍爲防火牆一側的局域網
硬件防火牆:在專用硬件級別實現部分功能的防火牆;另一個部分功能基於軟件實現,Checkpoint,NetScreen
軟件防火牆:運行於通用硬件平臺之上的防火牆的應用軟件
網絡層防火牆:OSI下面第三層(數據鏈路層mac地址,網絡層ip協議,傳輸層tcp,udp端口 做策略,但是有缺陷,應用層的數據病毒不能被發現)
優點:對用戶來說透明,處理速度快且易於維護
缺點:無法檢查應用層數據,如病毒等
應用層防火牆/代理服務器:代理網關,OSI七層(全部可以做策略)
優點:在應用層對數據進行檢查,比較安全
缺點:增加防火牆的負載
現實生產環境中所使用的防火牆一般都是二者結合,即先檢查網絡數據,通過之後再送到應用層去檢查
iptables的基本認識
v Netfilter組件
內核空間,集成在linux內核中
擴展各種網絡服務的結構化底層框架
內核中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而這五個hook function向用戶開放,用戶可以通過一個命令工具(iptables)向其寫入規則
由信息過濾表(table)組成,包含控制IP包處理的規則集(rules),規則被分組放在鏈(chain)上
v 三種報文流向:
流入本機:PREROUTING --> INPUT-->用戶空間進程
流出本機:用戶空間進程 -->OUTPUT--> POSTROUTING
轉發:PREROUTING --> FORWARD --> POSTROUTING
在每個鏈chain上定義規則:
防火牆工具
Iptables(工作流程如下)
命令行工具,工作在用戶空間()
ü 用來編寫規則,被送往netfilter,告訴內核如何去處理信息包
內核級功能: grep -i iptables /boot/config-3.10.0-514.e17.x86_64
firewalld
寫好的規則
CentOS 7引入了新的前端管理工具
管理工具:
firewall-cmd 命令行
firewall-config 圖形
iptables的組成
四個表table:filter、nat、mangle、raw
filter表:過濾規則表,根據預定義的規則過濾符合條件的數據包
nat表:network address translation 地址轉換規則表(內網與外部網絡相連時,nat來完成地址轉換作用,實現聯通。SNAT由內到外 DNAT由外到內)
mangle:修改數據標記位規則表(打標籤)
Raw:關閉NAT表上啓用的連接跟蹤機制,加快封包穿越防火牆速度
優先級由高到低的順序爲:raw-->mangle-->nat-->filter
ü 五個內置鏈chain
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
IPTABLES和路由
路由功能發生的時間點
ü 報文進入本機後
判斷目標主機是否爲本機
是:INPUT
否:FORWARD
ü 報文離開本機之前
判斷由哪個接口送往下一跳
iptables規則
規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作作出處理
ü 匹配條件:默認爲與條件,同時滿足
基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
擴展匹配:通過複雜高級功能匹配
ü 處理動作:稱爲target,跳轉目標
內建處理動作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...
自定義處理動作:自定義chain,利用分類管理複雜情形
規則要添加在鏈上,才生效;添加在自定義上不會自動生效(關聯到鏈上才生效)
v 鏈chain:
內置鏈:每個內置鏈對應於一個鉤子函數
自定義鏈:用於對內置鏈進行擴展或補充,可實現更靈活的規則組織管理機制;只有Hook鉤子調用自定義鏈時,才生效
iptables規則添加時考量點
ü 要實現哪種功能:判斷添加在哪張表上
ü 報文流經的路徑:判斷添加在哪個鏈上
ü 報文的流向:判斷源和目的
ü 匹配規則:業務需要
鏈上規則的次序,即爲檢查的次序,因此隱含一定的法則
ü 同類規則(訪問同一應用),匹配範圍小的放上面
ü 不同類規則(訪問不同應用),匹配到報文頻率較大的放上面
ü 將那些可由一條規則描述的多個規則合併爲一個
ü 設置默認策略
Iptables命令:(添加策略時注意別把自己禁止訪問了,注意流向,源地址(端口)和目標地址(端口))
規則格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-targetoptions]
v -t table:
raw, mangle, nat, [filter]默認
v SUBCOMMAND:
1、鏈管理:
-N:new, 自定義一條新的規則鏈
-X:delete,刪除自定義的空的規則鏈
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
-E:重命名自定義鏈;引用計數不爲0的自定義鏈不能夠被重命名,也不能被刪除
2、查看:
-L:list, 列出指定鏈上的所有規則,本選項須置後
-n:numberic,以數字格式顯示地址和端口號
-v:verbose,詳細信息
-vv 更詳細
-x:exactly,顯示計數器結果的精確值,而非單位轉換後的易讀值
--line-numbers:顯示規則的序號
常用組合:
--vnL
--vvnxL --line-numbers
-S selected,以iptables-save 命令格式顯示鏈上規則
3、規則管理:
-A:append,追加
-I:insert, 插入,要指明插入至的規則編號,默認爲第一條
-D:delete,刪除
(1) 指明規則序號
(2) 指明規則本身
-R:replace,替換指定鏈上的指定規則編號
-F:flush,清空指定的規則鏈
-Z:zero,置零
iptables的每條規則都有兩個計數器
(1) 匹配到的報文的個數
(2) 匹配到的所有報文的大小之和
v chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
匹配條件
基本:通用的,PARAMETERS
擴展:需加載模塊,MATCH EXTENTIONS
v 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, mh or “all“ 參看:/etc/protocols
[!] -i, --in-interface name:報文流入的接口;只能應用於數據報文流入環節,只應用於INPUT、FORWARD、PREROUTING鏈
[!] -o, --out-interface name:報文流出的接口;只能應用於數據報文流出的環節,只應用於FORWARD、OUTPUT、POSTROUTING鏈
2 擴展匹配條件:需要加載擴展模塊(/usr/lib64/xtables/*.so),方可生效
v 查看幫助 man iptables-extensions
v (1)隱式擴展:在使用-p選項指明瞭特定的協議時,無需再用-m選項指明擴展模塊的擴展機制,不需要手動加載擴展模塊
tcp協議的擴展選項(根據tcp連接三次握手和四次揮手的標記位來做策略,SYN=1,第一次握手,SYN=1,ACK=1 第二次握手,ACK=1 第三次握手)
[!] --source-port, --sport port[:port]:匹配報文源端口,可爲端口範圍
[!] --destination-port,--dport port[:port]:匹配報文目標端口,可爲範圍
[!] --tcp-flags mask compmask 需檢查的標誌位列表,用,分隔
例如 SYN,ACK,FIN,RST comp 在mask列表中必須爲1的標誌位列表,無指定則必須爲0,用,分隔
示例:
--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
v [!] --syn:用於匹配第一次握手 相當於:--tcp-flags SYN,ACK,FIN,RST SYN
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請求
示例:
Iptables -A INPUT -s 192.168.37.106 -p icmp --icmp-type 8 -j REJECT(這個實現的是拒絕了106機器的請求包,實現106不能ping本機,但是本機可以ping106)
v (2)顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制,要手動加載擴展模塊
[-m matchname [per-match-options]]
Man iptables-extention
示例:-m multiport 多端口
處理動作:
v -j targetname [per-target-options]
簡單: ACCEPT,DROP
擴展: REJECT:--reject-with:icmp-port-unreachable默認
RETURN:返回調用鏈
REDIRECT:端口重定向
LOG:記錄日誌,dmesg
MARK:做防火牆標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址僞裝
...
自定義鏈
顯式擴展:必須顯式地指明使用的擴展模塊進行的擴展
v 使用幫助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
v 1、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
2、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
3、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
4、string擴展(關鍵字擴展,根據首部報文裏的信息來匹配,要在OUTPUT鏈上定義)
對報文中的應用層數據做字符串模式匹配檢測
--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
5、time擴展(注意時區問題,cenos7上默認是UTC時區,定義時間要減去8小時)
根據將報文到達的時間與指定的時間範圍進行匹配
--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 (centos7上也不好使),--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 -j DROP
6、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
7、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
iptables -I INPUT 2 -p icmp -j REJECT
Sysctl -a |grep nf_conntrack_buckets
Vim /etc/sysctl.conf
Sysctl -p
Sysctl -w 臨時修改
Lsmod | grep nf
8、state擴展
根據”連接追蹤機制“去檢查連接的狀態,較耗資源
conntrack機制:追蹤本機上的請求和響應之間的關係
狀態有如下幾種:
NEW:新發出請求;連接追蹤信息庫中不存在此連接的相關信息條目,因此,將其識別爲第一次發出的請求
Iptables -A INPUT -p icmp -m state --state NEW -j REJECT(正在ping 的不影響,但是第一次ping的就拒絕)
ESTABLISHED:NEW狀態之後,連接追蹤信息庫中爲其建立的條目失效之前期間內所進行的通信狀態
RELATED:新發起的但與已有連接相關聯的連接,如:ftp協議中的數據連接與命令連接之間的關係(ftp命令通道與數據通道使用的端口號不一致,打開21端口時也要把相關RELATED,ESTABLISHED打開)
Iptables -i INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
INVALID:無效的連接,如flag標記不正確(SYN ACK等標記位全爲1或全爲0)
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/
v 注意:CentOS7 需要加載模塊: modprobe nf_conntrack
iptables的鏈接跟蹤表最大容量爲/proc/sys/net/nf_conntrack_max,各種狀態的超時鏈接會從表中刪除;當模板滿載時,後續連接可能會超時
v 解決方法兩個:
(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
v 開放被動模式的ftp服務
(1) 裝載ftp連接追蹤的專用模 跟蹤模塊路徑:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=" nf_conntrack_ftp "
modproble nf_conntrack_ftp
v (2) 放行請求報文:
命令連接:NEW, ESTABLISHED
數據連接:RELATED, ESTABLISHED
iptables –I INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
v (3) 放行響應報文:
iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
示例:
yum install vsftpd
v systemctl start vsftpd
v modprobe nf_conntrack_ftp
v iptables -F
v iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
v iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
v iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
v iptables -P INPUT DROP
v iptables -P OUTPUT DROP
v 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: "
任何不允許的訪問,應該在請求到達時給予拒絕
v 規則在鏈接上的次序即爲其檢查時的生效次序
v 基於上述,規則優化
ü 1 安全放行所有入站和出站的狀態爲ESTABLISHED狀態連接
ü 2 謹慎放行入站的新請求
ü 3 有特殊目的限制訪問功能,要在放行規則之前加以拒絕
ü 4 同類規則(訪問同一應用),匹配範圍小的放在前面,用於特
殊處理
ü 5 不同類的規則(訪問不同應用),匹配範圍大的放在前面
ü 6 應該將那些可由一條規則能夠描述的多個規則合併爲一條
ü 7 設置默認策略,建議白名單(只放行特定連接)
1) iptables -P,不建議
2) 建議在規則的最後定義規則做爲默認策略
規則有效期限:
使用iptables命令定義的規則,手動刪除之前,其生效期限爲
kernel存活期限
v 保存規則:
保存規則至指定的文件
CentOS 6
service iptables save
將規則覆蓋保存至/etc/sysconfig/iptables文件中
CentOS 7 可用下面方法保存規則
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:僅分析生成規則集,但不提交
開機自動重載規則文件中的規則:
v (1) 用腳本保存各iptables命令;讓此腳本開機後自動運行/etc/rc.d/rc.local文件中添加腳本路徑/PATH/TO/SOME_SCRIPT_FILE
v (2) 用規則文件保存各規則,開機時自動載入此規則文件中的規則/etc/rc.d/rc.local文件添加iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
v (3)自定義Unit File,進行iptables-restore
Iptables -vnL -t 表名(默認filter)
Iptables -A INPUT -s sourceIP -j REJECT|ACCEPT 添加一個策略
Iptables -I INPUT 2 -s sourceIP -j REJECT|ACCEPT 插入一個策略(INPUT鏈上的第二條)
Iptables -vnL --line-numbers 查看規則行號
Iptables -D INPUT #|1|2|3|4....刪除鏈中的某條
Iptables -R INPUT 1 -s sourceIP -j REJECT 修改鏈中的某條
Iptables -S 命令格式顯示鏈上規則 ipyables -S > /data/iptables
Iptables -P INPUT DROP 修改默認爲drop 之前爲ACCEPT(不建議使用,如果清空策略,自己也連不上了。)
如果有多個網卡多個IP實現不同的策略命令
Iptables -A INPUT -s 192.168.37.105 -d 192.168.37.117,192.168.37.107 -j REJECT(表現爲兩條策略)
Iptables -A INPUT -s 192.168.37.105 -p tcp --dport 22 -j REJECT(拒絕別人連接你,在INPUT鏈上 ,目標端口爲本機的22端口,源端口爲客戶端的隨機端口 --sport INPUT鏈上源端口爲客戶端的22端口,發給客戶端22端口的數據可以到達,但是回來的時候源端口爲22,被拒絕了,所以有去無回。)
Iptables -A INPUT -s 192.168.37.105 -i eth0 -j REJECT(指定進入時走的網卡)
Iptables -N ACCOUNT (創建一個新鏈,新鏈要關聯到具體的一個鏈上)
Iptables -I INPUT 2 -j ACCOUNT(把ACCOUNT鏈上的策略插入到INPUT的鏈上)
網絡防火牆:
iptables/netfilter網絡防火牆:
(1) 充當網關
(2) 使用filter表的FORWARD鏈
v 注意的問題:
(1) 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性
(2) 如果要啓用conntrack數據跟蹤機制,建議將雙方向的狀態爲ESTABLISHED的報文直接放行
NAT
NAT: network address translation
PREROUTING,INPUT,OUTPUT,POSTROUTING
請求報文:修改源/目標IP,由定義如何修改
響應報文:修改源/目標IP,根據跟蹤機制自動實現
v SNAT:source NAT POSTROUTING, INPUT
讓本地網絡中的主機通過某一特定地址訪問外部網絡,實現地址僞裝
請求報文:修改源IP
v DNAT:destination NAT PREROUTING , OUTPUT
把本地網絡中的主機上的某服務開放給外部網絡訪問(發佈服務和端口映射),但隱藏真實IP
請求報文:修改目標IP
v PNAT: port nat,端口和IP都進行修改 這樣響應時,不會分配到不對應的機器上
SNAT
實現原理:內部私有網絡去訪問外部公有網絡,在NAT上配置策略,(允許端口轉發)
過程就是把請求報文裏的源IP地址變成了NAT上的公有地址,然後再去訪問公有地址。回來時再把目標地址轉換爲內部的私有地址
問題:如果內部多個主機都要訪問外部公有地址的話,要在NAT上添加公有地址的數量(公有地址池)不過這樣不好,太浪費 可以採取PAT來解決,就是轉換地址時綁定的端口變一下,如200機器的端口變爲23456 這樣就實現了一一對應,回來的數據包會依據端口號返回到對應的主機
nat表的target:
v SNAT:固定IP
--to-source [ipaddr[-ipaddr]][:port[-port]] --random
v iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
v 示例:
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,如撥號網絡
--to-ports port[-port]
--random
v iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
v 示例:
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! -d 10.0.1.0/24 -j MASQUERADE (這個參數就是把內部的私有地主僞裝成對外網卡當時的公有地址,這樣就實現了通訊)
DNAT
實現過程:
外部主機想要訪問內部主機的特定主機(如郵件服務器),還是地址映射,修改的是請求報文的目標地址(與SNAT不同的點)返回時再轉化爲外部公有地址,這樣就實現了通訊(不能當調度器,只能針對一個機器)
--to-destination [ipaddr[-ipaddr]][:port[-port]]
v iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp--dport PORT -j DNAT --to-destination
InterSeverIP[:PORT]
v 示例:
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
轉發
REDIRECT:
NAT表
可用於:PREROUTING OUTPUT 自定義鏈
通過改變目標IP和端口,將接受的包轉發至不同地址
--to-ports port[-port]
示例:
iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIECT --to-ports 8080(本機實際提供服務的是8080端口,如果外部訪問我的默認80端口就轉發到本機的8080端口)
實驗環境準備:
ü Centos7: systemctl stop firewalld.service systemctl disable firewalld. service
ü Centos6:service iptables stop; chkconfig iptables off
firewalld服務
firewalld是CentOS 7.0新推出的管理netfilter的工具
firewalld是配置和監控防火牆規則的系統守護進程。可以實現iptables,ip6tables,ebtables的功能
firewalld服務由firewalld包提供
firewalld支持劃分區域zone,每個zone可以設置獨立的防火牆規則
v 歸入zone順序:
ü 先根據數據包中源地址,將其納爲某個zone
ü 納爲網絡接口所屬zone
ü 納入默認zone,默認爲public zone,管理員可以改爲其它zone
v 網卡默認屬於public zone,lo網絡接口屬於trusted zone
默認的是public zone
firewalld配置
firewall-cmd --get-services 查看預定義服務列表
/usr/lib/firewalld/services/*.xml預定義服務的配置
三種配置方法
ü firewall-config (firewall-config包)圖形工具
ü firewall-cmd (firewalld包)命令行工具
ü /etc/firewalld 配置文件,一般不建議
firewall-cmd 命令選項
v --get-zones 列出所有可用區域
v --get-default-zone 查詢默認區域
v --set-default-zone=<ZONE> 設置默認區域
v --get-active-zones 列出當前正使用的區域
v --add-source=<CIDR>[--zone=<ZONE>] 添加源地址的流量到指定區域,如果無--zone= 選項,使用默認區域
v --remove-source=<CIDR> [--zone=<ZONE>] 從指定區域中刪除源地址的流量,如果無--zone= 選項,使用默認區域
v --add-interface=<INTERFACE>[--zone=<ZONE>] 添加來自於指定接口的流量到特定區域,如果無--zone= 選項,使用默認區域
--change-interface=<INTERFACE>[--zone=<ZONE>]改變指定接口至新的區域,如果無--zone= 選項,使用默認區域
v --list-all [--zone=<ZONE>] 列出指定區域的所有配置信息,包括接口,源地址,端口,服務等,如果無--zone= 選項,使用默認區域
v --add-service=<SERVICE> [--zone=<ZONE>] 允許服務的流量通過,如果無--zone= 選項,使用默認區域
v --add-port=<PORT/PROTOCOL>[--zone=<ZONE>] 允許指定端口和協議的流量,如果無--zone= 選項,使用默認區域
v --remove-service=<SERVICE> [--zone=<ZONE>] 從區域中刪除指定服務,禁止該服務流量,如果無--zone= 選項,使用默認區域
v --remove-port=<PORT/PROTOCOL>[--zone=<ZONE>]從區域中刪除指定端口和協議,禁止該端口的流量,如果無--zone= 選項,使用默認區域
v --reload 刪除當前運行時配置,應用加載永久配置
查看默認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
v systemctl mask iptables
v systemctl mask ip6tables
v systemctl status firewalld
v systemctl enable firewalld
v systemctl start firewalld
v firewall-cmd --get-default-zone
v firewall-cmd --set-default-zone public
v firewall-cmd --permanent --zone=public --list-all
v firewall-cmd --permanent --zone=public --addport 8080/tcp
v firewall-cmd ---reload
Firewall-cmd --list-all 列出支持的服務
Firewall-cmd --add-service=http 增加支持http訪問
Firewall-cmd --get-default-zones 查看現在使用的區域zone
Firewwall-cmd --remove-service http 刪除http服務
Firewall-cmd --set-default-zones trusted 設置區域
其他規則
v 當基本firewalld語法規則不能滿足要求時,可以使用以下更復雜的規則
v rich-rules 富規則,功能強,表達性語言
v Direct configuration rules 直接規則,靈活性差
幫助:man 5 firewalld.direct
管理rich 規則
rich規則比基本的firewalld語法實現更強的功能,不僅實現允許/拒絕,還可以實現日誌syslog和auditd,也可以實現端口轉發,僞裝和限制速率
規則實施順序:
ü 該區域的端口轉發,僞造規則
ü 該區域的日誌規則
ü 該區域的允許規則
ü 該區域的拒絕規則
v 每個匹配的規則生效,所有規則都不匹配,該區域默認規則生效
rich規則示例
拒絕從192.168.0.11的所有流量,當address 選項使用
source 或 destination時,必須用family= ipv4 |ipv6.
firewall-cmd --permanent --zone=cla***oom --add-richrule='rule family=ipv4 source address=192.168.0.11/32 reject‘
v 限制每分鐘只有兩個連接到ftp服務
firewall-cmd --add-rich-rule=‘rule service name=ftp limit value=2/m accept’
v 拋棄esp( IPsec 體系中的一種主要協議)協議的所有數據包
firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'
v 接受所有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=7900-7905 protocol=tcp accept
僞造和端口轉發
v NAT網絡地址轉換,firewalld支持僞造和端口轉發兩種NAT方式
v 僞造NAT
v firewall-cmd --permanent --zone=<ZONE> --addmasquerade
vfirewall-cmd --permanent --zone=<ZONE> --addrich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
端口轉發(和iptables的轉發相比,firewall的端口轉發支持轉發到不同主機上的特定端口)
端口轉發:將發往本機的特定端口的流量轉發到本機或不同機器的另一個端口。通常要配合地址僞造才能實現
firewall-cmd--permanent--zone=<ZONE>--add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
說明:toport= 和toaddr= 至少要指定一個
v 示例:
轉發傳入的連接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