Linux 的防火牆
防火牆的分類:
防火牆的分類 |
作用 |
優勢 |
劣勢 |
硬件防火牆 |
對數據的傳輸做限制,消除安全隱患。數據過濾 |
性能高 |
成本高 |
軟件防火牆 |
通過策略規范數據訪問連接,提高安全。數據過濾 |
防火牆是開源的,費用低。 |
性能不如硬件防火牆, |
數據過濾:
數據過濾: 通過防火牆的策略對數據進行規范,如下圖:防火牆允許1 2客戶機訪問服務器,3不能訪問服務器,這一過程叫數據過濾
數據過濾:
出方向:服務器允許那些數據可以發送出去
入方向:那些數據可以進入服務器
穿 :1.0網段進入網卡1通過網卡2轉發出去訪問2.0網段,中間服務充當路由器轉發的功能。
數據封裝:
網絡為了保證數據的正確傳輸,任何數據在外傳輸都會進行封裝。數據到達目的主機,會進行解封裝,
Osi七層模型
端口號是依賴單個IP地址存在的,如果有一個ip只能啟65535端口,兩個ip65535*2端口。 端口號:0-65535
源端口號一般情況 >1024
數據封裝的過程:
應用層:游覽器產生一個http請求 確保數據能到達目的地---傳輸層
傳輸層:進行封裝、添加TCP/UDP報頭 (TCP/UDP報頭:源端口號,目的端口號)
(傳輸層根據應用層協議確定添加的報頭) 到達網絡層
網絡層:對傳輸層的添加IP報頭(源ip,目的ip) (只知道大致的地址)
數據鏈路層:對網絡層的數據添加MAC幀頭(源mac地址、目的mac地址) (mac唯一確定具體的地址)
解封裝的過程:
源主機給目的主機發送數據
目的數據收到源主機的的數據進行解封裝
解封MAC幀頭,確認MAC的目的地址是不是目的主機的MAC
是接續解封裝
否丟棄數據包
解封IP 報頭,確認IP報頭的目的ip是目的主機的IP地址
是繼續解封裝
否丟棄數據包
解封TCP/IP, 檢測目的端口號由目的主機對應的端口號的進程去響應解決請求
沒有對應的目的端口會丟棄數據包
解封裝后收到請求后,目的主機會響應源主機的請求。響應請求的過程也是數據封裝
linux防火牆 四表五鏈
內核模塊:netfilter
實現數據過濾:
入方向
出方向
轉發
Linux防火牆有鈎子函數:
Input 截獲進入服務器的數據
Forward 截獲由服務器轉發的數據
Output 截獲由服務器發出的數據
Prerouting 截獲路由前的操作
Postrouting 截獲路由之后的操作
根據鈎子函數創建防火牆規則
Linux 存儲防火牆規則在鏈
五個鈎子函數對應的五個鏈(chain):用來存儲防火牆規則
INPUT
FORWARD
OUTPUT
PREROUTING
POSTROUTING
4張表
Filter 實現數據過濾
Nat 實現網絡地址轉換
Mangle 為數據打標記(一般通過數字標識)
Raw 數據跟蹤
五條鏈根據防火牆實現的規則不同,被分配在四張表里面
Filter 實現數據過濾
INPUT FORWARD OUTPUT 根據需求寫對應的鏈
Nat 實現網絡地址轉換
OUTPUT PREROUTING POSTROUTING 實現IP報頭源ip和目的ip的轉換
Mangle 為數據打標記(一般通過數字標識)
INPUT FORWARD OUTPUT PREROUTING POSTROUTING 都可以打標簽
Raw 數據跟蹤
OUTPUT (對發出去的數據跟蹤) prerouting(路由之前的數據跟蹤)
防火牆命令: iptables (firewalld 7.0版本之后)
防火牆規則匹配的順序:
默認自上而下匹配,當匹配到最先匹配的規則。后面的防火牆規則不執行。
在設置防火牆規則要將經常匹配的規則寫在上面。
防火牆順序不規范會拖慢服務器的訪問速度
防火情有默認規則,手寫的規則匹配不到數據,會匹配默認規則
iptables 的使用方法:
Iptables 子命令 鏈名 規則
Iptables 查看
Iptables -L 查看防火牆規則 默認查看filter表的規則
[root@44 ~]# iptables -L
Chain INPUT (policy ACCEPT) ACCEPT 默認規則允許
Iptables -t 表名 查看指定的表規則信息
[root@44 ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
Iptables -nL 規則用的服務顯示成端口號
Iptables --line-numbers 顯示防火牆規則帶有行號
Iptables -v 顯示規則的計數器,數據包個數,大小。只要規則匹配到數據>0 如果一直為0考慮檢測防火牆規則是否寫錯
Iptables 的刪除
Iptables -F 清空防火牆規則,默認清除filter表
Iptables -t 表名 -F 清除指定表名的防火牆
Iptables -D 鏈 【序號】 刪除指定的iptables
iptables 的添加
Iptables -A 鏈 在鏈追加規則
Iptables -I 鏈 插入規則,默認插入到最上 iptables -I chain 【序列】 指定位置插入
防火牆的規則組成:
匹配的數據條件
操作行為
操作行為:
-j < 操作行為> 只針對數據過濾的表 filter
ACCEPT 允許
DROP 丟棄 客戶端請求進不到服務器
REJECT 拒絕 客戶端進入服務器,服務器不響應
匹配數據的條件:
源IP 、目的IP、 源端口 、目的端口 、 協議 (五元組)
{-s } { -d } { -p 協議{tcp|udp|icmp} --sport --dport }
-s IP地址 : 可匹配ip地址、ip的網段
-s 192.168.20.1 配置源ip !-s 192.168.20.1 匹配源ip不是
-s 192.16.20.0/24
-p tcp --dport 22 匹配數據包目的端口號22 -p tcp --dport 22:100 表示連續的范圍
-s 1.1.1.1 -d 2.2.2.2 -p --dport 80 1.1.1.1 訪問2.2.2.2 的80端口
-d 2.2.2.2 -p tcp --dport 80 匹配所有的客戶端訪問2.2.2.2的80 端口的請求
-i 匹配網卡名 從網卡進來的數據
-o 匹配網卡名 從網卡發出的數據
-P I許改鏈的默認狀態
-p icmp --icmp-type 8 ping請求
--icmp-type 0 ping回應
事例: 拒絕ssh
測試45 訪問192.168.20.139是可以ssh的
[root@45 ~]# ssh 192.168.20.139
root@192.168.20.139's password:
在進入的數據中設置拒絕源地址是192.168.20.140通過ssh22端口訪問192.168.20.139的
[root@44 ~]# iptables -A INPUT -s 192.168.20.140 -d 192.168.20.139 -p tcp --dport 22 -j REJECT
[root@45 ~]# ssh 192.168.20.139
ssh: connect to host 192.168.20.139 port 22: Connection refused
拒絕http
通過45訪問44的httpd的web
[root@45 ~]# curl 192.168.20.139
web iptable
拒絕所有訪問44httpd的web服務
[root@44 ~]# iptables -A INPUT -d 192.168.20.139 -p tcp --dport 80 -j REJECT
[root@46 ~]# curl 192.168.20.139
curl: (7) Failed connect to 192.168.20.139:80; Connection refused
查看iptables的配置
[root@44 ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 REJECT tcp -- 192.168.20.140 192.168.20.139 tcp dpt:22 reject-with icmp-port-unreachable
2 REJECT tcp -- 0.0.0.0/0 192.168.20.139 tcp dpt:80 reject
拒絕任何ipping 44
[root@45 ~]# ping -c1 192.168.20.139
PING 192.168.20.139 (192.168.20.139) 56(84) bytes of data.
64 bytes from 192.168.20.139: icmp_seq=1 ttl=64 time=0.968 ms
[root@44 ~]# iptables -A INPUT -d 192.168.20.139 -p icmp -j REJECT
[root@45 ~]# ping -c1 192.168.20.139
PING 192.168.20.139 (192.168.20.139) 56(84) bytes of data.
From 192.168.20.139 icmp_seq=1 Destination Port Unreachable
保存iptables規則
[root@44 ~]# iptables-save > 1.txt
恢復規則
[root@44 ~]# iptables-restore < 1.txt
修改規則:
Iptables -R 鏈 修改信息
-m 補充模塊
Iptables -m 模塊名 -- help 查模塊的幫助信息
Multiport 模塊: 支持多個端口,多個端口用,隔開
EG:
[root@44 ~]# iptables -A INPUT -s 192.168.20.140 -p tcp -m multiport --dport 22,80 -j REJECT
Iprange 模塊 : 支持多個IP地址
[root@44 ~]# iptables -A INPUT -m iprange --src-range 192.168.20.140 192.168.20.141 -p tcp -j REJECT
Iptables 實現數據過濾:
基本條件: (五元組)
源ip、目的ip 、源地址、目的地址 、 協議
連接狀態進行的數據過濾:
-m state-state <狀態>
狀態值: NEW 首次訪問
ESTABLISHED 完成 服務的后續訪問、服務器的響應
RELATED 相關聯
Iptables---NAT表的使用
Nat -----網絡地址轉換
主要實現更換換源IP 與目的IP
主要在PREROUTING路由前 和 POSTROUTING 路后 寫規則
路由前:主機收到一個數據在主機對數據操作路由之前發生的事情
路由后:主機收到一個數據對數據進行了路由的查找之后的操作
-j <操作>
-j SNAT 轉換數據的源IP地址
-j MASQUERADE 轉換數據里面的源IP地址
-j DNAT 轉換數據里的目的IP地址
NAT轉化的原理:
源主機訪問目的主機
snat可以讓本地ip地址偽裝成其他機器的ip地址,或者是公網IP,
源主機會封裝自己數據請求{源ip 、目的ip 、請求}
數據請求到達NAT上,NAT會查路由確認能不能連接到目的主機IP
(1) 如果查看路由表不能,會返回目的ip不可達
(2) 如果查看自己的路由表能,會把源ip轉換成目的ip網段的ip(同時NAT會記錄這條NAT轉換的數據){轉換的網絡:1單獨公網ip 2.NAT設備上現有的IP }
通過轉換后的源IP數據請求會把數據請求發送到目的IP上
目的IP對源IP發出的請求做出響應
-s SNAT <公網IP)> 手動指定單獨的公網ip
-s MASQUERADE 會自動把源ip轉換成NAT上自身的公網ip
-s DNAT 目的ip轉換 路由前
dnat是用來做目的網絡地址轉換的,就是重寫包的目的IP地址。
發布服務:把服務從私有地址發布到公網上
- web的私有ip換為固定的公網ip
- 互聯網用戶會發送請求到NAT
- NAT接受請求會把目的ip 轉化為web的私有ip
- NAT查看路由,把請求發送到轉換后的目的IP
實現:
[root@44 ~]# iptables -t nat -A POSTROUTING -s 192.168.20.141 -d 192.168.20.139 -p tcp --dport 80 -j SNAT --to-source 192.168.20.139:8888
Iptables ----mangle表實現數據標記
數據打標記的目的:為了把想要的數據區分,分類標記出來。
Mangle 一般在路由前PREROUTING打標記。
操作命令事例:
把相同的數據打成一個標記,對同一標記的數據做相同的處理
將對目的主機執行icmp的數據打標記為88
[root@44 ~]# iptables -t mangle -A PREROUTING -d 192.168.20.139 -p icmp -j MARK --set-mark 88
打標記對數據區分分類,並不改動數據本身
[root@45 ~]# ping 192.168.20.139
PING 192.168.20.139 (192.168.20.139) 56(84) bytes of data.
64 bytes from 192.168.20.139: icmp_seq=1 ttl=64 time=2.03 ms
64 bytes from 192.168.20.139: icmp_seq=2 ttl=64 time=0.418 ms
64 bytes from 192.168.20.139: icmp_seq=3 ttl=64 time=0.545 ms
把標記名為88的蘇數據丟棄
[root@44 ~]# iptables -A INPUT -m mark --mark 88 -j DROP
[root@45 ~]# ping 192.168.20.139
PING 192.168.20.139 (192.168.20.139) 56(84) bytes of data.
Iptables----forward鏈實現數據過濾
[root@44 juben]# yum install iptables-services.x86_64
導出防火牆規則,做保存
[root@44 juben]# iptables-save > /etc/sysconfig/iptables