Netfilter/Iptables(如下簡稱Iptables)是unix/linux自帶的一款優秀且開放源代碼的徹底自由的基於包過濾的防火牆工具linux Netfilter一個系統的內核模塊,經過netfilter內核控制硬件設備nginx Iptables至關因而一個控制軟件vim iptables+zebra+squid == 一臺硬件防火牆centos iptables主要工做在OSI七層的2、3、四層 實現應用層訪問控制:nginx WAF實現應用訪問控制安全 |
防火牆經過審查通過的每個數據包, 判斷它是否有相匹配的過濾規則, 根據規則的前後順序進行一一比較, 直到知足其中的一條規則爲止, 而後依據控制機制作出相應的動做. 若是都不知足, 則將數據包丟棄, 從而保護網絡的安全。服務器 |
容器:用來包裝或裝載物品的貯存器(如箱、罐、壇)或者成形或柔軟不成形的包覆材料cookie 第一個容器:iptables(表)網絡 第二個容器:表(鏈)併發 第三個容器:鏈(規則)tcp |
1. 防火牆是層層過濾的,實際是按照配置規則的順序從上到下,從前到後進行過濾的。 2. 若是匹配上規則,即明確表示是阻止仍是經過,數據包就再也不向下匹配新的規則。 3. 若是規則中沒有明確代表是阻止仍是經過的,也就是沒有匹配規則,向下進行匹配,直到匹配默認規則獲得明確的阻止仍是經過。 4. 防火牆的默認規則是全部規則執行完才執行的。 |
iptables包含4個表,5個鏈。其中表是按照對數據包的操做區分的,鏈是按照不一樣的Hook點來區分的,表和鏈其實是netfilter的兩個維度。 |
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 --- 顯示規則序號信息 |
iptables -F --- 清空全部規則信息 iptables -X --- 清空全部自定義鏈信息 iptables -Z --- 清空計數器信息 計數器1:記錄規則匹配了多少數據包 計數器2:記錄規則匹配了多少流量信息 說明:以上三個清空操做完成,表示防火牆初始化過程完畢 |
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 |
iptables -A INPUT -i eth1 -p tcp --dport 22 -j DROP -i --- 指定流量進入的接口信息(只能應用在INPUT鏈上) -o --- 指定流量出去的接口信息(只能應用在OUTPUT鏈上) |
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 --- 替換/修改 修改相應規則策略 |
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) ! --- 表示取反,或者排除 |
iptables -A INPUT -i eth0 -s 10.0.0.1 -p tcp --dport 23:80 -j DROP |
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 --- 指定匹配狀態擴展模塊 |
禁止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應答) 回來的信息 |
NEW |
表示新創建鏈接的數據包狀態 |
ESTABLISHED |
表示新創建鏈接數據包發送以後,回覆響應的數據包狀態 |
RELATED |
表示藉助已經創建的鏈路,發送新的鏈接數據包 |
INVALID |
無效沒法識別的數據包 |
防火牆服務配置在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 --- 防禦牆上配置的 |
# 限制指定時間包的容許經過數量及併發數 -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)保存防火牆配置文件信息 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 |
01. 去機房重啓系統或者登錄服務器刪除剛纔的禁止規則。 02. 讓機房人員重啓服務器或者讓機房人員拿用戶密碼登陸進去 03. 經過服務器的遠程管理卡管理(推薦) 04. 先寫一個定時任務,每5分鐘就中止防火牆 05. 測試環境測試好,寫成腳本,批量執行 |
iptables NAT:(配置NAT表示就是配置如下兩個鏈) 01. postrouting(內網---外網-NAT 源私網IP地址---源公網IP地址 端口轉化) 路由以後,進行地址映射轉換,把源地址進行轉換(源私網地址==>源公網地址) 02. prerouting(外網---內網-NAT 目標公網IP地址---目標私網IP地址 映射目標端口) 路由以前,進行地址映射轉換,把目標地址進行轉換(目標公網地址==>目標變爲私網地址) |
配置內網主機 第一個歷程:配置內網服務器,設置網關地址 /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地址 |
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 目的地址改寫。 |
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: 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 擴大子網,增長廣播風暴。 |
有關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 |