目錄
一:iptables的用法
1.iptables簡介
iptables的主要功能是實現對網絡數據包進出設備及轉發的控制。當數據包需要進入設備、從設備中流出或者經該設備轉發、路由時,都可以使用iptables進行控制。
二:Iptables鏈的概念
1.那四個表,有哪些作用?
具備某種功能的集合叫做表。
filter: 負責做過濾功能呢 : INPUT、OUTPUT、FORWARD
nat: 網絡地址轉換 PREROUTING、INPUT、OUTPUT、POSTROUTING
mangle: 負責修改數據包內容 PREROUTING、INPUT、OUTPUT、POSTROUTING、FORWARD
raw: 負責數據包跟蹤 PREROUTING、OUTPUT
2、那五條鏈,運行在那些地方?
1) PREROUTING: 主機外報文進入位置,允許的表mangle, nat(目標地址轉換,把本機地址轉換為真正的目標機地址,通常指響應報文)
2) INPUT:報文進入本機用戶空間位置,允許的表filter, mangle
3) OUTPUT:報文從本機用戶空間出去的位置,允許filter, mangle, nat
4) FOWARD:報文經過路由並且發覺不是本機決定轉發但還不知道從哪個網卡出去,允許filter, mangle
5) POSTROUTING:報文經過路由被轉發出去,允許mangle,nat(源地址轉換,把原始地址轉換為轉發主機出口網卡地址)
###### 五鏈
PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING
3.Iptables流程圖
流入本機: A ---> PREROUTING ---> INPUT ---> B
流出本機:OUTPUT ---> POSTROUTING ---> B
經過本機: A ---> OUTPUT ---> POSTROUTING | ---> PREROUTING ---> FORWARD ---> POSTROUTING ---> C ---> PREROUTING ---> INPUT ---> B
表包含鏈
filter : INPUT 、FORWARD、 OUTPUT
nat : PREROUTING 、 INPUT、 OUTPUT、 POSTROUTING
raw : PREROUTING、 OUTPUT
mangle : PREROUTING INPUT FORWARD OUTPUT POSTROUTING
三:iptables的安裝
1、安裝Iptables
[root@m01 ~]# yum install iptables*
2、啟動Iptables
[root@m01 ~]# systemctl start iptables
3、關閉firewalld
[root@m01 ~]# systemctl disable --now firewalld
4 查看iptables狀態
systemctl status iptables
四:iptables命令
1.iptables命令格式
格式:iptables -t 表名 選項 鏈名稱 條件 動作
2.參數
-t: 指定操作的表
-L, --list 列出當前的規則
-v 顯示數據包和數據包大小
-n 顯示不反解地址
-A, --append 追加一條規則到鏈中
-I, --insert 插入一條規則,插入到頂部
-F, --flush 清空(使用前清空)
-Z, --zero 清空計數器( 包數量 、包大小)
-D, --delete 刪除鏈中的規則
-R, --replace 修改
-S, --list-rules 列出所有的規則
-N, --new-chain 創建一個自定義 鏈
-X, --delete-chain 刪除一個自定義鏈
-P, --policy 指定鏈的默認策略
五:iptables動作
ACCEPT 將數據包放行,進行完此處理動作后,將不再比對其它規則,直接跳往下一個規則鏈(允許通過)
REJECT 攔阻該數據包,並傳送數據包通知對方(阻攔訪問/告知禁止)
DROP 丟棄包不予處理,進行完此處理動作后,將不再比對其它規則,直接中斷過濾程序(直接禁止)
REDIRECT 將包重新導向到另一個端口,進行完此處理動作后,將會繼續比對其它規則
(轉換地址)
六:Iptables基本的條件匹配
1.協議
TCP(http)
UDP
ICMP(ping)
ALL
傳輸層協議
3、原因:應用層需要可靠的連接,但是IP層沒有這樣的流機制
4、面向連接,即在客戶端和服務器之間發送數據之間,必須先建立連接
圖‘’‘
TCP是一種傳輸控制協議,是面向連接的、可靠的、基於字節流之間的傳輸層通信協議
2.源地址 目標地址
源地址:發送請求的地址
-s
目標地址 : 訪問的地址
-d
導向另外一個端口
--to-port
七:-i、-o、-m、-j 動作
-i : 進來的網卡
-o : 出去的網卡
-m : 指定模塊
-j : 轉發動作
-p :指定協議
八:安裝端口nginx
1.安裝nginx
yum install nginx -y
2.啟動nginx
systemctl start nginx
注:
安裝nginx 關閉防火牆
清空 iptables規則
nginx端口默認尾部前加一個冒號:80
是一個程序
九:內網
1.什么是內網?內網的作用?
內網與外網只是相對概念問題,我們平時所說的內網一般指公司、學校、機關等一個單位的內部網絡,外網指整個互聯網。
2.ip地址
IP協議中還有一個非常重要的內容,那就是給因特網上的每台計算機和其它設備都規定了一個唯一的地址,叫做“IP地址”。由於有這種唯一的地址,才保證了用戶在連網的計算機上操作時,能夠高效而且方便地從千千萬萬台計算機中選出自己所需的對象來。
十:內網鏈接用戶
1.原用戶沒清除的規則清空
iptables -F
2.復制用戶(D)
3.輸入原用戶內網鏈接
ssh root@172.16.1.81
十一:iptables實戰案例
案例1:只允許22端口可以訪問,其他端口全部無法訪問。
案例1:只允許22端口可以訪問,其他端口全部無法訪問。
iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
解析:
-t : 指定操作的表
-A : 追加一條規則到鏈中
-p : 關聯協議
--dport : 訪問端口
-j : 動作
ACCEPT : 允許通過
作用:
允許22端口訪問
iptables -t filter -A INPUT -p TCP -j DROP
解析:
-j : 動作
DROP : 直接禁止
作用:
拒絕所有端口訪問
總結:
1.只遇到22端口才通過
2.其他端口全部拒絕訪問
案例2:只允許22,80,443端口可以訪問,其他端口全部無法訪問。
iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p TCP --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
案例4:要求使用192.168.15.81能夠通過22端口鏈接,但是其他的不行
iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
192.168.15.81 : 目標地址
-d : 訪問地址
--dport : 訪問端口
1.允許使用訪問192.168.15.81地址能通過22端口鏈接
2.其他地址端口拒絕
案例5:只允許192.168.15.71能夠通過22端口鏈接,其他的不行。
iptables -t filter -A INPUT -p TCP -s 192.168.15.71 -d 192.168.15.81 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
解析:
192.168.15.71
-s : 源地址
只允許ip地址為192.168.15.71的主機(普羅米修斯) 訪問目標地址
192.168.15.81
-d : 目標地址
只允許源地址 訪問目標地址(192.168.15.81)
其他地址端口拒絕
案例6:要求192.168.15.71對外部不可見
iptables -t filter -A INPUT -p TCP -d 192.168.15.71 -j DROP
解析:
1.源地址為192.168.15.71
2.直接禁止外部訪問
3.可更換主機 進行內網訪問,外部是不可見。
案例7:要求使用eth0網卡的所有請求全部拒絕
iptables -t filter -A INPUT -p TCP -i eth0 -j DROP
解析:
-i : 進來的網卡
1.拒絕使用eth0網卡訪問該地址
2.只能通過內網eth1訪問該地址
(只允許進,不允許出)
使用172.16.1.71登錄進來的窗口,不允許訪問百度。
iptables -t filter -I OUTPUT -p TCP -o eth1 -j DROP
解析:
-o : 出去的網卡
1.拒絕使用eth1訪問該地址
2.只能通過eth0訪問該地址
(只允許出,不允許進)
案例8:要求訪問服務器的8080端口轉發至80端口
iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80
解析:
-t : 指定操作的表
net : 網絡地址轉換
-A : 追加一條規則到鏈中
PREROUTING : (標地址轉換,把本機地址轉換為真正的目標機地址,通常指響應報文)
-p : 協議
TCP : TCP是一種傳輸控制協議,是面向連接的、可靠的、基於字節流之間的傳輸層通信協議
--dport :目標端口
-j : 動作
REDIRECT : (轉換地址)
--to-port : 導向另外一個端口
總結:
1.由8080端口導向80端口
2.在訪問地址端口默認8080
案例9:要求只允許windows通過ssh連接192.168.15.81,其他的拒絕
iptables -t filter -A INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP --dport 22 -j DROP
1.cmd輸入ipconfig 復制ipv4地址
192.168.15.1
-s : 源地址
只允許ip地址為192.168.15.1的主機 訪問目標地址
192.168.15.81
-d : 目標地址
只允許源地址 訪問目標地址(192.168.15.81)
其他地址端口拒絕
知識儲備:
查看本機端口占用的命令:
netstat -nutlp
十二:iptables模塊
拓展iptables的功能的。
-m : 指定模塊
1、連續匹配多個端口(multiport)
--dports : 指定多個端口(不同端口之間以逗號分割,連續的端口使用冒號分割)。
2、指定一段連續的ip地址范圍(iprange)
--src-range from[-to]: 源地址范圍
--dst-range from[-to] 目標地址范圍
3、匹配指定字符串(string)
--string pattern # 指定要匹配的字符串
--algo {bm|kmp} # 匹配的查詢算法
4、根據時間段匹配報文(time)
--timestart hh:mm[:ss] # 開始時間
--timestop hh:mm[:ss] # 結束時間
--monthdays day[,day...] # 指定一個月的某一天
--weekdays day[,day...] # 指定周 還是 周天
5、禁ping, 默認本機無法ping別人 、別人無法ping自己
--icmp-type {type[/code]|typename}
echo-request (8) 請求
echo-reply (0) 回應
6、限制鏈接數,並發連接數(connlimit)
--connlimit-upto n # 如果現有連接數小於或等於 n 則 匹配
--connlimit-above n # 如果現有連接數大於n 則匹配
7、針對 報文速率 進行限制。 秒、分鍾、小時、天(limit)
--limit rate[/second|/minute|/hour|/day] # 報文數量
--limit-burst number # 報文數量(默認:5)
十三:iptables模塊實戰
1、要求將22,80,443以及30000-50000之間所有的端口向外暴露,其他端口拒絕
iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT
iptables -f filter -A INPUT -p TCP -j DROP
解析:
-m : 指定模塊
--dports : 指定多個端口
2、要求訪問數據包中包含HelloWorld的數據不允許通過。
iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP
解析流程:
1.寫入數據包內容
echo "HelloWorld" >> index.html
echo "Hello" >> demo.html
2.輸入代碼
iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP
3.訪問(包含禁止數據不允許訪問)
curl http://192.168.15.81/demo.html
curl http://192.168.15.81/
3、要求192.168.15.1 - 192.168.15.10之間的所有IP能夠連接192.168.15.81,其他拒絕
iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
解析:
指定一段連續的ip地址范圍(iprange)
--src-range from[-to]: 源地址范圍
192.168.15.1 - 192.168.15.10
-s : 源地址
只允許ip地址為192.168.15.1 - 192.168.15.10的主機 訪問目標地址
192.168.15.81
-d : 目標地址
只允許源地址 訪問目標地址(192.168.15.81)
其他地址端口拒絕
4、要求每天的12到13之間,不允許訪問
iptables -t filter -A INPUT -p TCP -m time --timestart 4:00 --timestop 5:00 -j DROP
必須使用UTC時間
1.UTC 東零區
2.UTC+8 東八區
3.我們比UTC快了八個小時
4.所以需要減8才得到我們現在時間
1.根據時間段匹配報文(time)
--timestart hh:mm[:ss] # 開始時間
--timestop hh:mm[:ss] # 結束時間
5、要求別人不能ping本機,但是本機可以ping別人
iptables -t filter -A INPUT -p ICMP -m icmp --icmp-type "echo-request" -j DROP
解析:
8 : 我可以ping別人
0 : 別人也可以ping我
ICMP : 只針對ping的協議
1.禁ping, 默認本機無法ping別人 、別人無法ping自己
--icmp-type {type[/code]|typename}
echo-request (8) 請求
echo-reply (0) 回應
2.別人不能拼我
ping 192.168.15.81
6、要求主機連接最多有2個
iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP
1.目標端口:訪問的端口
--dport
2.限制鏈接數,並發連接數(connlimit)
--connlimit-above 2 # 如果現有連接數大於2則匹配
總結:
如果主機連接數量大於2則禁止
7、要求限制速率在500k/s左右
iptables -t filter -A OUTPUT -p TCP -m limit --limit 333/s -j ACCEPT
iptables -t filter -A OUTPUT -p TCP -j DROP
解析執行流程:
1.生成文件(指定數據量文件)
dd if=/dev/zero of=1.txt bs=20M count=100
-m : 指定模塊
limit :報文數量
333/s : 每秒控制在333k
2.輸入代碼
iptables -t filter -A OUTPUT -p TCP -m limit --limit 333/s -j ACCEPT
iptables -t filter -A OUTPUT -p TCP -j DROP
3.執行傳輸數據
scp 1.txt root@192.168.15.71:/root
scp : scp 與 cp 差不多 只不過cp可以遠程傳輸
txt: : 文件數據包
root@192.168.15.71 : 傳輸目標
:/root : 傳輸到該主機root目錄下
注:
報文控制是非常不准確的