Iptables 網絡安全

第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、數據包從外網傳送到防火牆後, 防火牆搶在IP層向TCP層傳送前, 將數據包轉發給包檢查模塊進行處理.

2、首先與第一個過濾規則比較.

3、如果與第一個模塊相同, 則對它進行審覈, 判斷是否轉發該數據包, 這時審覈結果是轉發數據包, 則將數據包發送到TCP層進行處理, 否則就將它丟棄.

4、如果與第一個過濾規則不同, 則接着與第二個規則相比較, 如果相同則對它進行審覈, 過程與(3)相同.

5、如果與第二個過濾規則不同, 則繼續與下一個過濾規則比較, 直到與所有過濾規則比較完成. 要是所有過濾規則都不滿足, 就將數據包丟棄.

image

 

1.1 iptables服務表和鏈的概念

1.1.1 表和鏈

iptables包含4個表,5個鏈。其中表是按照對數據包的操作區分的,鏈是按照不同的Hook點來區分的,表和鏈實際上是netfilter的兩個維度。

1.1.2 filter表信息詳細介紹
image
1.1.1 NAT表詳細介紹
image
1.1.2 Mangle表詳細介紹
image

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章