第1章 Iptables 網絡安全
1.1 Iptables 防火牆介紹
Netfilter/Iptables(以下簡稱Iptables)是unix/linux自帶的一款優秀且開放源代碼的完全自由的基於包過濾的防火牆工具 Netfilter一個系統的內核模塊,通過netfilter內核控制硬件設備 Iptables相當於是一個控制軟件 iptables+zebra+squid == 一臺硬件防火牆 iptables主要工作在OSI七層的二、三、四層 實現應用層訪問控制:nginx WAF實現應用訪問控制 |
1.1.1 防火牆的基本工作原理
防火牆通過審查經過的每一個數據包, 判斷它是否有相匹配的過濾規則, 根據規則的先後順序進行一一比較, 直到滿足其中的一條規則爲止, 然後依據控制機制做出相應的動作. 如果都不滿足, 則將數據包丟棄, 從而保護網絡的安全。 |
1.1.2 iptables名詞術語說明
容器:用來包裝或裝載物品的貯存器(如箱、罐、壇)或者成形或柔軟不成形的包覆材料 第一個容器:iptables(表) 第二個容器:表(鏈) 第三個容器:鏈(規則) |
1.1.3 iptable工作流程(規則)
1. 防火牆是層層過濾的,實際是按照配置規則的順序從上到下,從前到後進行過濾的。 2. 如果匹配上規則,即明確表示是阻止還是通過,數據包就不再向下匹配新的規則。 3. 如果規則中沒有明確表明是阻止還是通過的,也就是沒有匹配規則,向下進行匹配,直到匹配默認規則得到明確的阻止還是通過。 4. 防火牆的默認規則是所有規則執行完才執行的。 |
1.1.4 Iptables數據包過濾匹配流程
1.1 iptables服務表和鏈的概念
1.1.1 表和鏈
iptables包含4個表,5個鏈。其中表是按照對數據包的操作區分的,鏈是按照不同的Hook點來區分的,表和鏈實際上是netfilter的兩個維度。 |
1.1.2 filter表信息詳細介紹
1.1.1 NAT表詳細介紹
1.1.2 Mangle表詳細介紹
1.1 iptables防火牆實踐配置
1.1.1 iptables命令相關參數介紹
iptables -L -n -v --line-number -L --- 顯示防火牆規則信息,以列表形式顯示 -n --- 顯示防火牆規則信息,以數字形式顯示 -v --- 以更詳細的形式顯示防火牆規則信息(排錯時候有用) --line-number --- 顯示規則序號信息 iptables -L --- 以列表顯示所有規則信息 iptables -L -n --- 以數字形式顯示IP地址和端口號信息 iptables -nL iptables -nL -v --- 顯示詳細規則信息 iptables -nL --line-number --- 顯示規則序號信息 |
1.1.2 iptables防火牆策略清空處理
iptables -F --- 清空所有規則信息 iptables -X --- 清空所有自定義鏈信息 iptables -Z --- 清空計數器信息 計數器1:記錄規則匹配了多少數據包 計數器2:記錄規則匹配了多少流量信息 說明:以上三個清空操作完成,表示防火牆初始化過程完畢 |
1.1.3 實踐配置01. 阻止用戶訪問22端口服務
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP -t --- 指定表的信息 -A --- 在指定鏈上,添加規則信息 -p --- 指定協議信息(tcp udp icmp) --dport -- 指定目標端口信息 --sport -- 指定源端口信息 -j -- 對數據包要做什麼處理(ACCEPT DROP REJECT) |
恢復連接方式: 01. 重啓iptables,/etc/init.d/iptables restart 02. iptables -F 簡單粗暴(企業中不推薦) 03. 刪除指定有問題規則策略 iptables -t filter -D INPUT -p tcp --dport 22 -j DROP iptables -t filter -D INPUT 1 |
1.1.4 實踐配置02:只讓eh0進來的流量可以訪問22端口
iptables -A INPUT -i eth1 -p tcp --dport 22 -j DROP -i --- 指定流量進入的接口信息(只能應用在INPUT鏈上) -o --- 指定流量出去的接口信息(只能應用在OUTPUT鏈上) |
1.1.5 實踐配置03:只讓10.0.0.0/24網段可以訪問22端口
iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 22 -j DROP -s --- 指定源地址或源網段信息 -d --- 指定目標地址或目標網段信息 |
允許172.16.1.9主機可以訪問172.16.1.8這個地址上的22端口服務 iptables -A INPUT -s 172.16.1.9 -d 172.16.1.8 -p tcp --dport 22 -j ACCEPT iptables -I INPUT -s 172.16.1.9 -d 172.16.1.8 -p tcp --dport 22 -j ACCEPT -A --- 追加/附加 將新設置的規則放在已有的規則後面 -I --- 插入 將新設置的規則插入到規則列表中(默認放在所有規則最前面) -D --- 刪除 刪除指定規則信息 -R --- 替換/修改 修改相應規則策略 |
1.1.6 實踐配置04:只允許10.0.0.1主機可以訪問10.0.0.8服務器22端口
iptables -A INPUT -i eth0 -s 10.0.0.1 -d 10.0.0.8 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -i eth0 -s 0.0.0.0/0 -d 10.0.0.8 -p tcp --dport 22 -j DROP |
iptables -A INPUT -i eth0 ! -s 10.0.0.1 -d 10.0.0.8 -p tcp --dport 22 -j DROP (centos6) iptables -A INPUT -i eth0 -s !10.0.0.1 -d 10.0.0.8 -p tcp --dport 22 -j DROP (centos5) ! --- 表示取反,或者排除 |
1.1.7 實踐案例05:禁止23到80端口,都不允許10.0.0.1主機進行訪問
iptables -A INPUT -i eth0 -s 10.0.0.1 -p tcp --dport 23:80 -j DROP |
1.1.8 實踐案例06:禁止23,24,30,80端口,都不允許10.0.0.1主機進行訪問
iptables -A INPUT -i eth0 -s 10.0.0.1 -p tcp -m multiport --dport 23,24,30,80 -j DROP -m extended match (may load extension) 指定加載擴展功能參數 multiport --- 不連續的多端口配置,擴展參數 icmp --- 進行icmp協議訪問控制 state --- 指定匹配狀態擴展模塊 |
1.1.9 實踐案例07:匹配ICMP類型
禁止ping策略原則 iptables -A INPUT -p icmp --icmp-type 8 -j DROP iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP iptables服務器是ping命令發起者或是接受者 發起者: input鏈: 禁止icmp-type 0 iptables -A INPUT -i eth0 -p icmp --icmp-type 0 -j DROP output鏈: 禁止icmp-type 8 iptables -A OUTPUT -o eth0 -p icmp --icmp-type 8 -j DROP 接受者: input鏈: 禁止icmp-type 8 iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP output鏈: 禁止icmp-type 0 iptables -A OUTPUT -o eth0 -p icmp --icmp-type 0 -j DROP 簡化配置: iptables -A INPUT -i eth0 -p icmp --icmp-type any -j DROP iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type any -j DROP iptables -A INPUT -p icmp --icmp-type 8 iptables -A INPUT -p icmp --icmp-type 8 -j DROP iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT 說明:只有類型8是真正會影響ping,或者也可以採用any;瞭解很多icmp類型iptables -p icmp -h |
icmp type8:Echo request——回顯請求(Ping請求) 出去的信息 icmp type0: Echo Reply——回顯應答(Ping應答) 回來的信息 |
1.1.10 實踐案例08:狀態機制配置
NEW | 表示新建立連接的數據包狀態 |
ESTABLISHED | 表示新建立連接數據包發送之後,回覆響應的數據包狀態 |
RELATED | 表示藉助已經建立的鏈路,發送新的連接數據包 |
INVALID | 無效無法識別的數據包 |
1.1.11 實踐案例09:FTP服務器配置防火牆策略
防火牆服務配置在FTP服務器上時,需要配置以下策略 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
實現發現sent_syn狀態 iptables -A INPUT -m state --state NEW -j DROP --- 防火牆所連接客戶端上配置 |
實現發現sent_rcvd狀態 iptables -I INPUT -i eth0 -s 10.0.0.201 -m state --state ESTABLISHED -j DROP --- 防護牆上配置的 |
1.1.12 實踐案例10:對數據包進行限速處理
# 限制指定時間包的允許通過數量及併發數 -m limit --limit n/{second/minute/hour}: --limit 6/min 解釋:指定時間內的請求速率”n”爲速率,後面爲時間分別爲:秒 分 時 --limit-burst [n] 解釋:在同一時間內允許通過的請求”n”爲數字,不指定默認爲5 |
實現策略命令: iptables -A INPUT -s 10.0.0.9 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT iptables -A INPUT -s 10.0.0.9 -j DROP |
1.1.13 實踐案例11:企業防火牆應用案例
項目:部署一個最安全的企業級防火牆(案例) 兩種思想:針對默認規則而言。 1、默認規則默認是允許的狀態。 2、默認規則默認是不允許的狀態。更安全。 |
1)保存防火牆配置文件信息 cp /etc/sysconfig/iptables{,.bak} |
2)清除配置規則 iptables -F <- 清空iptables所有規則信息(清除filter) iptables -X <- 清空iptables自定義鏈配置(清除filter) iptables -Z <- 清空iptables計數器信息(清除filter) |
3)別把自己踢出到門外 iptables -A INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT |
4)配置防火牆filter上各個鏈的默認規則 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT -P --- 指定相應鏈的默認規則策略,是允許還是阻止 |
5)允許iptables服務端ping自己的網卡地址 iptables -A INPUT -i lo -j ACCEPT --- 讓自己可以ping自己 |
指定外網可以訪問的端口信息 iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT |
企業中內網之間不要配置防火牆策略 iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT |
企業之間有合作關係的,不要將友商的網絡禁止(主要經常改動) iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT iptables -A INPUT -s 10.0.2.0/24 -j ACCEPT |
如果防火牆上配置了FTP服務,需要配置網絡狀態機制(允許相應流量返回) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
實現iptables策略配置永久保存 ①. 利用防火牆啓動腳本命令參數,實現永久保存 /etc/init.d/iptables save ②. 利用防火牆配置信息保存命令,實現永久保存 iptables-save >/etc/sysconfig/iptables |
1.1.14 實例拓展:避免自己被踢出門外
01. 去機房重啓系統或者登陸服務器刪除剛纔的禁止規則。 02. 讓機房人員重啓服務器或者讓機房人員拿用戶密碼登錄進去 03. 通過服務器的遠程管理卡管理(推薦) 04. 先寫一個定時任務,每5分鐘就停止防火牆 05. 測試環境測試好,寫成腳本,批量執行 |
1.2 防火牆NAT表配置說明
1.2.1 NAT表的作用
iptables NAT:(配置NAT表示就是配置以下兩個鏈) 01. postrouting(內網---外網-NAT 源私網IP地址---源公網IP地址 端口轉化) 路由之後,進行地址映射轉換,把源地址進行轉換(源私網地址==>源公網地址) 02. prerouting(外網---內網-NAT 目標公網IP地址---目標私網IP地址 映射目標端口) 路由之前,進行地址映射轉換,把目標地址進行轉換(目標公網地址==>目標變爲私網地址) |
1.2.2 iptables實現共享上網方法(postrouting)
配置內網主機 第一個歷程:配置內網服務器,設置網關地址 /etc/init.d/iptables stop --- 內網服務器停止防火牆服務 ifdown eth0 --- 模擬關閉內網服務器外網網卡 setup --- 修改內網網卡網關和DNS地址信息 [root@oldboyedu42-lnb-02 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 0.0.0.0 172.16.1.7 0.0.0.0 UG 0 0 0 eth1 說明:內網服務器網關地址指定爲共享上網服務器內網網卡地址 |
配置iptables服務器 第一個歷程:配置共享上網服務器,開啓共享上網服務器路由轉發功能 [root@oldboyedu42-lnb-02 ~]# vim /etc/sysctl.conf [root@oldboyedu42-lnb-02 ~]# sysctl -p net.ipv4.ip_forward = 1 第三個歷程:配置共享上網服務器,實現內網訪問外網的NAT映射 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8 -s 172.16.1.0/24 --- 指定將哪些內網網段進行映射轉換 -o eth0 --- 指定在共享上網哪個網卡接口上做NAT地址轉換 -j SNAT --- 將源地址進行轉換變更 -j DNAT --- 將目標地址進行轉換變更 --to-source ip地址 --- 將源地址映射爲什麼IP地址 --to-destination ip地址 --- 將目標地址映射爲什麼IP地址 擴展如果開啓:forward默認drop策略,如果配置forward鏈 iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE <- 僞裝共享上網 說明:在企業中如何沒有固定外網IP地址,可以採取以上僞裝映射的方式進行共享上網 |
總結:配置映射方法 01. 指定哪些網段需要進行映射 -s 172.16.1.0/24 02. 指定在哪做映射 -o eth0 03. 用什麼方法做映射 -j SNAT/DNAT 04. 映射成什麼地址 --to-source ip地址/--to-destination ip地址 |
1.2.3 iptables實現外網IP的端口映射到內網IP的端口
10.0.0.8 9000 === 172.16.1.9 22 需求:將網關的IP和9000端口映射到內網服務器的22端口 端口映射 10.0.0.7:9000 -->172.16.1.8:22 實現命令: iptables -t nat -A PREROUTING -d 10.0.0.7 -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.201:22 iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 9000 -i eth0 -j DNAT --to-destination 172.16.1.8:22 (1)-d 10.0.0.8目標地址。 (2)-j DNAT 目的地址改寫。 |
1.2.4 IP一對一映射
172.16.1.10 == 10.0.0.10 輔助IP: ip addr add 10.0.0.81/24 dev eth0 label eth0:0 #<==輔助IP iptables -t nat -I PREROUTING -d 10.0.0.81 -j DNAT --to-destination 172.16.1.51 iptables -t nat -I POSTROUTING -s 172.16.1.51 -o eth0 -j SNAT --to-source 10.0.0.81 檢查: ping 10.0.0.81 -t tcpdump|grep -i icmp(兩臺機器上分別監測) telnet 10.0.0.81 873(51上提前配好) |
1.2.5 映射多個外網IP上網
方法1: iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.240.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16 三層交換機或路由器,劃分VLAN。 |
方法2: iptables -t nat -A POSTROUTING -s 10.0.1.0/22 -o eth0 -j SNAT --to-source 124.42.60.11 iptables -t nat -A POSTROUTING -s 10.0.2.0/22 -o eth0 -j SNAT --to-source 124.42.60.12 擴大子網,增加廣播風暴。 |
1.3 系統防火牆與網絡內核優化標準參數
有關iptables的內核優化 調整內核參數文件/etc/sysctl.conf 以下是我的生產環境的某個服務器的配置: ------------解決time-wait過多------------- net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_max_tw_buckets = 36000 ---------------------------------- net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 ---------------------------------- #dmesg裏面顯示 ip_conntrack: table full, dropping packet.的錯誤提示,什麼原因?如何解決? #iptables優化 net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 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 |