1.1 企業中安全優化配置原則
盡可能不給服務器配置外網ip ,可以通過代理轉發或者通過防火牆映射.並發不是特別大情況有外網ip,可以開啟防火牆服務.
大並發的情況,不能開iptables,影響性能,利用硬件防火牆提升架構安全
1.1.1 生產中iptables的實際應用
主要應用方向
1、主機防火牆(filter表的INPUT鏈)。
2、局域網共享上網(nat表的POSTROUTING鏈)。半個路由器,NAT功能。
3、端口及IP映射(nat表的PREROUTING鏈),硬防的NAT功能。
4、IP一對一映射。
其他說明:
①iptables是基於內核的防火牆,功能非常強大,基於數據包的過濾!特別是可以在一台非常低的硬件配置下跑的非常好。
注:iptables主要工作在OSI七層的2.3.4層。七層的控制可以使用squid代理+iptables。
②iptabes:生產中根據具體情況,一般,內網關閉,外網打開。大並發的情況不能開iptables,影響性能,iptables是要消耗CPU的,所以大並發的情況下,我們使用硬件防火牆的各方面做的很仔細。selinux:生產中也是關閉的。可以做ids的入侵檢測。
③實際生產中盡可能不給服務器配置外網IP。可以通過代理轉發。比如,nagios就不需要外網。
④並發不是很大的情況下,再外網的IP環境,開防火牆。
⑤第一次直接默認規則生成配置文件,以后就在配置文件中進行修改(編輯添加刪除)。
⑥封掉IP:根據IP地址和網絡連接數進行封殺。(定時任務,定時封掉,判斷,存在就不再進行二次封殺)
1.1.2 企業常用案例功能小結:
1)linux主機防火牆,單機作為防火牆(表filter)。
2)局域網共享上網(表nat postrouting)。
3)外部地址映射為內部地址和端口(表nat prerouting)
1.2 iptables防火牆簡介
Netfilter/Iptables(以下簡稱Iptables)是unix/linux自帶的一款優秀且開放源代碼的完全自由的基於包過濾的防火牆工具,它的功能十分強大,使用非常靈活,可以對流入和流出服務器的數據包進行很精細的控制.特別是它可以在一台非常低的硬件配置服務器上跑的非常好(賽揚500HZ cpu 64M 內存的惲況下部署網關防火牆),提供近400人的上網服務絲毫不遜色企業級專業路由器防火牆。 iptables + zebra + squid (企業常用網絡開源產品)。
iptables是linux2.4及2.6內核中集成的服務,其功能與安全性比其老一蜚ipfwadm,ipchains 強大的多,iptables主要工作在0SI七層的二、三、四層,如果重新編譯內核,iptables也可以支持 7 層控制(squid代理+iptables)。
1.2.1 iptables名詞和術語
不少剛接觸到iptables的朋友可能會對iptables防火牆的相關名詞搞的很暈,不知道其所雲的具體意思,而是就最基本的能讓大家容易快速理解和掌握的思路來描述:
容器:包含或者說屬於的關系
1.2.2 什么是容器
誰不知道啊,容器就是裝東西的,如(箱、包、壇)。沒錯,恭喜你答對了.詞典里解釋說,容器就是用來包裝或裝載物品的貯存器(如箱、罐、壇)或者成形或柔軟不成形的包覆材料.
在iptables里的呢,就是用來描述這種包含或者說屬於的關系。
1.2.3 什么是 Netfilter/iptables ?
Netfilter是表(tables)的容器,這樣解釋大家肯定還是暈。舉個例子,如果把Netfilter看成是某個小區的一棟樓。那么表(tables)就是樓里的其中的一套房子。這套房子"表(tables)"屬於這棟“Netfilter”。
1.2.4 什么是表(tables)?
表(tables)是鏈的容器,即所有的鏈(chains)都屬於其對應的表(tables).如上,如果把Netfilter看成是某個小區的一棟樓.那么表(tables)就是樓里的其中的一套房子。
1.2.5 什么是鏈(chains)?
鏈(chains)是規則(Policys)的容器。接上,如果把表(tables)當作有一套房子,那么鏈(chains)就可以說是房子里的家具(櫃子等)。
1.2.6 什么是規則(Policy)?
規則(Policy)就比較容易理解了,就是iptables系列過濾信息的規范和具體方法條款了.可以理解為櫃子如何增加並擺放櫃子東西等。
基本術語如下表格所示:
Netfilter |
表(tables) |
鏈(chains) |
規則(Policy) |
一棟樓 |
按里的房子 |
房子里的櫃子 |
櫃子里衣服,擺放規則 |
1.3 iptables 表和鏈
描述完iptables術語后,相信大家對iptables的表和鏈有了初步的了解了,默認情況下,iptables根據功能和表的定義划分包含三個表,filter,nat,mangle,其每個表又包含不同的操作鏈(chains )。 實際iptables包含4張表和五個鏈,巧主要記住兩張表即可filter和nat表即可。
下面表格展示了表和鏈的對應關系。
四個表:
表(tables) |
鏈(chains) |
|
Filter |
這是默認表,實現防火牆數據過濾功能。 |
|
INPUT |
對於指定到本地套接字的包,即到達本地防火牆服務器的數據包。 |
|
FORWARD |
路由穿過的數據包,即經過本地防火牆服務器的數據包。 |
|
OUTPUT |
本地創建的數據包 |
|
NAT |
當遇到新創建的數據包連接時將參考這個表 |
|
FREROUTING |
一進來就對數據包進行改變 |
|
OUTPUT |
本地創建的數據包在路由前進行改變 |
|
POSTROUTING |
在數據包即將出去時改變數據包信息 |
|
Mangle |
這個表專門用於改變數據包 |
|
INPUT |
進入到設備本身的包 |
|
FORWARD |
對路由后的數據包信息進行修改 |
|
FREROUTING |
在路由之前更改傳入的包 |
|
OUTPUT |
本地創建的數據包在路由之前改變 |
|
POSTROUTING |
在數據包即將離開時更改數據包信息 |
|
raw |
此表用處較少,可以忽略不計。 This table is used mainly for configuring exemptions from connection tracking in combination with the NOTRACK target. |
|
PREROUTING |
for packets arriving via any network interface |
|
OUTPUT |
for packets generated by local processes |
五個鏈
表(tables) |
鏈(chains) |
||||
INPUT |
FORWARD |
OUTPUT |
PREROUTING |
POSTROUTING |
|
Filter |
√ |
√ |
√ |
× |
× |
NAT |
× |
× |
√ |
√ |
√ |
Managle |
√ |
√ |
√ |
√ |
√ |
raw |
× |
× |
√ |
√ |
× |
說明:√ 表示有,× 表示無。 |
圖 - iptables中的表與鏈的結構關系
1.3.1 filter表的詳細介紹
filter表 |
主要和主機自身相關,真正負責主機防火牆功能的(過濾流入流出主機的數據包) filter表是iptables默認使用的表,這個表定義了三個鏈(chains) 企業工作場景:主機防火牆 |
INPUT |
負責過濾所有目標是本機地址的數據包 通俗來說:就是過濾進入主機的數據包 |
FORWARD |
負責轉發流經主機的數據包。起到轉發的作用,和NAT關系很大。 LVS NAT 模式,net.ipv4.ip_forward=0 |
OUTPUT |
處理所有源地址是本機地址的數據包 通俗的講:就是處理從主機發出的數據包 |
對於filter表的控制是我們實現本機防火牆功能的重要手段,特別是INPUT鏈的控制。
1.3.2 NAT表信息詳細介紹
NAT表 |
負責網絡地址轉換的,即來源與目的的IP地址和port的轉換。 應用:和主機本身無關,一般用於局域網共享上網或者特殊的端口轉換相關. 工作場景: 1、用於企業路由(zebra)或網關(iptables),共享上網(POSTROUTING) 2、做內部外部IP地址一對一映射(dmz),硬件防火牆映射IP到內部服務器,FTP服務(PREROUTING) 3、WEB,單個端口的映射,直接映射80端口(PREROUTING) 這個表定義了3個鏈,nat功能相當於網絡的acl控制。和網絡交換機acl類似。 |
OUTPUT |
和主機放出去的數據包有關,改變主機發出數據包的目的地址。 |
PREROUTING |
在數據包到達防火牆時,進行路由判斷之前執行的規則,作用是改變數據包的目的地址、目的端口等 就是收信時,根據規則重寫收件人的地址 例如:把公網IP: xxx.xxx.xxx.xxx 映射到局域網的 x.x.x.x 服務器 如果是web服務,可以把80轉換為局域網的服務器9000端口上。 |
POSTROUTING |
在數據包離開防火牆時進行路由判斷之后執行的規則,作用改變數據包的源地址,源端口等。 寫好收件人的地址,要讓家人回信時能夠有地址可回。 例如。默認筆記本和虛擬機都是局域網地址,在出網的時候被路由器將源地址改為公網地址。 生產應用:局域網共享上網。 |
1.3.3 Mangle表信息詳細介紹
Mangle表 |
主要負責修改數據包中特殊的路由標記,如TTL,TOS,MARK等,這個表定義了5個鏈(chains). |
由於這個表與特殊標記相關,一般倩況下,我們用不到這個mangle表。
這里就不做詳細介紹了。
1.4 iptables工作流程
1.4.1 工作流程說明
前面介紹已經提到,iptables是采用數據包過濾機制工作的,所以它會對請求的數據包的包頭數據進行分析,並根據我們預先設定的規則進行匹配來決定是否可以進入主機。
iptables是采用數據包過濾機制工作的,所以它會對請求的數據包的包頭數據進行分析,並根據我們預先設定的規則進行匹配來決定是否可以進入主機。
數據包的流向是從左向右的。
圖 - iptables包處理流程圖
圖 - iptables包處理流程圖(簡化)
抽象說明:上圖可以用北京地鐵1,2號線來描述:
1號線:主要是NAT功能
企業案例:
1)局域網上網共享(路由和網關),使用NAT的POSTROUTING鏈。
2)外部IP和端口映射為內部IP和端口(DMZ功能),使用NAT的PREROUTING鏈
2號線:主要是FILTER功能,即防火牆功能FILTER INPUT FORWARD
企業案例:
主要應用就是主機服務器防火牆,使用FILTER的INPUT鏈
圖 - iptables數據包轉發流程圖
1.4.2 iptables工作流程小結
1、防火牆是一層層過濾的。實際是按照配置規則的順序從上到下,從前到后進行過濾的。
2、如果匹配上了規則,即明確表明是阻止還是通過,此時數據包就不在向下匹配新規則了。
3、如果所有規則中沒有明確表明是阻止還是通過這個數據包,也就是沒有匹配上規則,向下進行匹配,直到匹配默認規則得到明確的阻止還是通過。
4、防火牆的默認規則是對應鏈的所有的規則執行完以后才會執行的(最后執行的規則)。
1.5 iptables操作
系統環境說明
[root@clsn ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@clsn ~]# hostname -I 10.0.0.188 172.16.1.188
軟件版本
[root@clsn ~]# iptables -V iptables v1.4.7
1.5.1 iptables參數說明
參數 |
參數說明 |
||
顯示相關參數 |
|||
-n/--numeric |
以數字的方式顯示地址或端口信息 |
||
-L/ --list |
列出一個鏈或所有鏈中的規則信息 |
||
--list-rules/-S |
Print the rules in a chain or all chains |
||
--line-number |
當列出規則信息時,打印規則行號 |
||
-v |
顯示詳細信息,可以疊加 |
||
-h |
顯示幫助信息 |
||
初始化相關參數 |
|||
iptables -F |
清除所有規則,不會處理默認的規則 |
||
iptables -X |
刪除用戶自定義的鏈 |
||
iptables -Z |
鏈的計數器清零(數據包計數器與數據包字節計數器) |
||
配置常用參數 |
|||
-t 表名稱 |
指定配置哪個表,指定配置表名稱。 |
||
--append/-A 鏈名稱 |
附加或追加上相應規則策略,到指定鏈(鏈名稱必須大寫),默認將配置的規則插入到最后一條。 |
||
--check/-C |
Check for the existence of a rule |
||
--insert/-I 鏈名稱 |
插入相應規則策略,到指定鏈上,默認將配置的規則插入到第一條(可以根據規則序號插入到指定位置)--封IP地址使用。 |
||
--delete/-D 鏈名稱 |
刪除指定的規則(可以根據規則序號進行刪除) |
||
--replace/-R |
Replace rule rulenum (1 = first) in chain |
||
-P(大寫)鏈名稱 |
改變鏈上的最終默認規則策略 |
||
--new/-N |
創建新的用戶定義鏈 |
||
-p 協議名稱 [!] --proto |
指定規則的協議名稱 all tcp udp icmp |
||
--dport |
指定匹配的目標端口信息 |
||
--sport |
指定匹配的源端口信息 |
||
-j 動作 |
匹配數據包后的動作 |
||
ACCEPT |
允許 |
||
DROP |
丟棄(沒有響應) |
||
REJECT |
拒絕(回應請求者明確的拒絕) |
||
MASQUERADE |
偽裝上網時使用 |
||
SNAT |
共享地址上網 |
||
DNAT |
目的地址改寫 |
||
-i [!] --in-interface |
在INPUT鏈配置規則中,指定從哪一個網卡接口進入的流量(只能配置在INPUT鏈上) |
||
-o [!] --out-interface |
在OUTPUT鏈配置規則中,指定從哪一個網接口出去的流量(只能配置在OUTPUT鏈上) |
||
-s [!] --source |
指定源IP地址或源網段信息 |
||
-d [!] --destination |
指定目標IP地址或目標網段信息 |
||
擴展參數 |
|||
-m 模塊 |
表示增加擴展,匹配功能擴展匹配(可以加載擴展參數) |
||
multiport |
實現不連續多端口擴展匹配 |
||
icmp |
使用icmp的擴展 |
||
state |
狀態模塊擴展 |
||
--icmp-type |
只有類型8是真正會影響ping,或者也可以采用any;了解很多icmp類型iptables -p icmp -h |
||
--limit n/{second/minute/hour} |
指定時間內的請求速率”n”為速率,后面為時間分別為:秒 分 時 |
||
--limit-burst [n] |
在同一時間內允許通過的請求”n”為數字,不指定默認為5 |
||
--exact/-x |
擴展數字(顯示精確數值) |
||
!的使用實例
[root@clsn ~]# iptables ! -V Not 1.4.7 ;-) [root@clsn ~]# iptables -V iptables v1.4.7
注意:在iptables中所有鏈名必須大寫,表明必須小寫,動作必須大寫,匹配必須小寫。
1.5.2 配置前准備
在配置防火牆首先要其中防火牆
[root@clsn ~]# /etc/init.d/iptables start iptables: Applying firewall rules: [ OK ]
清除iptables所有規則
[root@clsn ~]# iptables -Z [root@clsn ~]# iptables -X [root@clsn ~]# iptables -F
查看iptables的規則
[root@clsn ~]# iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
查看其他的表配置(-t 參數)
[root@clsn ~]# iptables -nL -t raw Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
查看配置規則的順序號
[root@clsn ~]# iptables -nvL --number-list --line-number # 顯示規則的序號
1.6 iptables filter表配置實例
1.6.1 基礎配置
配置實例一:配置22/ssh端口訪問控制規則
iptables -A INPUT -p tcp --dprot 22 -j DROP # 禁止所有人訪問22端口 iptables -I INPUT -p tcp --dprot 22 -j ACCEPT # 恢復連接方法 iptables -I INPUT 2 -p tcp --dprot 22 -j ACCEPT # 通過插入指定行號信息,指定將規則插入到第幾行 iptables -D INPUT -p tcp --dport 22 -j ACCEPT # 刪除指定規則 iptables -D INPUT 2 # 根據規則行號,刪除相應的規則
只允許10.0.0.1的ip通過ssh連接這台服務器
iptables -I INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT
配置實例二:禁止網段連入(禁止172.16.1.0網段訪問172.16.1.188)
iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.188 -j DROP
配置實例三:禁止某個172.16.1.0網段訪問服務器主機的22端口
iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.188 -p tcp --dport 22 -j DROP
方向說明:
# 在入方向控制 iptables -I INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # 在出方向控制 iptables -I OUTPUT -o eth0 -p tcp --sport 22 -j DROP
1.6.2 配置實例四:除10.0.0.0網段可以進行連接服務器主機意外,其余網段都禁止
第一種方式:
iptables -A INPUT -s 10.0.0.0/24 -d 172.16.1.8 -j ACCEPT
修改默認規則,將默認規則改為拒絕
第二種方式:
! --- 表示對規則信息進行取反
iptables -A INPUT ! -s 10.0.0.0/24 -d 172.16.1.8 -j DROP --- centos6用法
iptables -A INPUT -s ! 10.0.0.0/24 -d 172.16.1.8 -j DROP --- centos5用法
說明:只有iptables幫助手冊中指定的參數可以用取反符號(iptables --help)
1.6.3 配置實例五:測試匹配列舉端口范圍。
iptables -A INPUT -p tcp --dport 22:80 -j DROP # 設置連續多端口控制策略 iptables -A INPUT -p tcp -m multiport --dport 22,80 -j DROP # 設置不連續多端口控制策略
-m 參數表示增加擴展匹配功能,multiport 實現不連續多端口擴展匹配
1.6.4 配置實例六:匹配ICMP類型
禁止ping策略原則
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 -m icmp --icmp-type any -j DROP #禁止所有類型的icmp
指定類型禁止icmp
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類型的說明
TYPE |
CODE |
Description |
Query |
Error |
0 |
0 |
Echo Reply——回顯應答(Ping應答) |
x |
|
3 |
0 |
Network Unreachable——網絡不可達 |
|
x |
3 |
1 |
Host Unreachable——主機不可達 |
|
x |
3 |
2 |
Protocol Unreachable——協議不可達 |
|
x |
3 |
3 |
Port Unreachable——端口不可達 |
|
x |
3 |
4 |
Fragmentation needed but no frag. bit set——需要進行分片但設置不分片比特 |
|
x |
3 |
5 |
Source routing failed——源站選路失敗 |
|
x |
3 |
6 |
Destination network unknown——目的網絡未知 |
|
x |
3 |
7 |
Destination host unknown——目的主機未知 |
|
x |
3 |
8 |
Source host isolated (obsolete)——源主機被隔離(作廢不用) |
|
x |
3 |
9 |
Destination network administratively prohibited——目的網絡被強制禁止 |
|
x |
3 |
10 |
Destination host administratively prohibited——目的主機被強制禁止 |
|
x |
3 |
11 |
Network unreachable for TOS——由於服務類型TOS,網絡不可達 |
|
x |
3 |
12 |
Host unreachable for TOS——由於服務類型TOS,主機不可達 |
|
x |
3 |
13 |
Communication administratively prohibited by filtering——由於過濾,通信被強制禁止 |
|
x |
3 |
14 |
Host precedence violation——主機越權 |
|
x |
3 |
15 |
Precedence cutoff in effect——優先中止生效 |
|
x |
4 |
0 |
Source quench——源端被關閉(基本流控制) |
|
|
5 |
0 |
Redirect for network——對網絡重定向 |
|
|
5 |
1 |
Redirect for host——對主機重定向 |
|
|
5 |
2 |
Redirect for TOS and network——對服務類型和網絡重定向 |
|
|
5 |
3 |
Redirect for TOS and host——對服務類型和主機重定向 |
|
|
8 |
0 |
Echo request——回顯請求(Ping請求) |
x |
|
9 |
0 |
Router advertisement——路由器通告 |
|
|
10 |
0 |
Route solicitation——路由器請求 |
|
|
11 |
0 |
TTL equals 0 during transit——傳輸期間生存時間為0 |
|
x |
11 |
1 |
TTL equals 0 during reassembly——在數據報組裝期間生存時間為0 |
|
x |
12 |
0 |
IP header bad (catchall error)——壞的IP首部(包括各種差錯) |
|
x |
12 |
1 |
Required options missing——缺少必需的選項 |
|
x |
13 |
0 |
Timestamp request (obsolete)——時間戳請求(作廢不用) |
x |
|
14 |
|
Timestamp reply (obsolete)——時間戳應答(作廢不用) |
x |
|
15 |
0 |
Information request (obsolete)——信息請求(作廢不用) |
x |
|
16 |
0 |
Information reply (obsolete)——信息應答(作廢不用) |
x |
|
17 |
0 |
Address mask request——地址掩碼請求 |
x |
|
18 |
0 |
Address mask reply——地址掩碼應答 |
數據來源:http://www.cnitblog.com/yang55xiaoguang/articles/59581.html
1.6.5 防火牆狀態機制配置
狀態集簡單說明:
狀態集 |
說明 |
NEW |
表示新建立連接的數據包狀態 |
ESTABLISHED |
表示新建立連接數據包發送之后,回復響應的數據包狀態 |
RELATED |
表示借助已經建立的鏈路,發送新的連接數據包 |
INVALID |
無效無法識別的數據包 |
注意:允許關聯的狀態包通過(web服務不要使用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.6.6 使用iptables實現限速功能
limit是iptables的一個匹配模塊,用它結合iptables的其它命令可以實現限速的功能。
不過首先必須明確,limit本身只是一個“匹配”模塊。我們知道,iptables的基本原理是“匹配--處理”,limit在這個工作過程中只能起到匹配的作用,它本身是無法對網絡數據包進行任何處理的。我看到網上有些limit的例子里面說只 用一條包含limit匹配規則的iptables語句就可以實現限速,那是錯誤的。
實際上,利用imit來限速需要包括兩個步驟:
1.對符合limit匹配規則包放行
2.丟棄/拒絕未放行的包
示例:
iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT
iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -j DROP
語句含義:當來自10.0.0.7 的ping包超過5個時進行限速,限制為每10s一個。
參數說明:
參數 |
參數含義 |
--limit n/{second/minute/hour} |
指定時間內的請求速率”n”為速率,后面為時間分別為:秒 分 時 |
--limit-burst [n] |
在同一時間內允許通過的請求”n”為數字,不指定默認為5 |
limit模塊具體是如何工作的。?
limit的匹配是基於令牌桶 (Token bucket)模型的。
令牌桶是一種網絡通訊中常見的緩沖區工作原理,它有兩個重要的參數,令牌桶容量n和令牌產生速率s。
我們可以把令牌當成是門票,而令牌桶則是負責制作和發放門票的管理員,它手里最多有n張令牌。一開始,管理員開始手里有n張令牌。每當一個數據包到達后,管理員就看看手里是否還有可用的令牌。如果有,就把令牌發給這個數據包,limit就告訴iptables,這個數據包被匹配了。而當管理員把手上所有的令牌都發完了,再來的數據包就拿不到令牌了。這時,limit模塊就告訴iptables,這個數據包不能被匹配。除了發放令牌之外,只要令牌桶中的令牌數量少於n,它就會以速率s來產生新的令牌,直到令牌數量到達n為止。
通過令牌桶機制,即可以有效的控制單位時間內通過(匹配)的數據包數量,又可以容許短時間內突發的大量數據包的通過(只要數據包數量不超過令牌桶n)。
limit模塊提供了兩個參數--limit和--limit-burst,分別對應於令牌產生速率和令牌桶容量。除了令牌桶模型外,limit匹配的另外一個重要概念是匹配項。在limit中,每個匹配項擁有一個單獨的令牌桶,執行獨立的匹配計算。
1.6.7 企業級防火牆配置
清除防火牆規則
[root@clsn ~]# iptables -F [root@clsn ~]# iptables -X [root@clsn ~]# iptables -Z
修改默認規則為拒絕(修改前先放行22端口,保證自己能夠連上主機)
[root@clsn ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT [root@clsn ~]# iptables -P INPUT DROP [root@clsn ~]# iptables -P FORWARD DROP
放行指定的端口
[root@clsn ~]# iptables -A INPUT -i lo -j ACCEPT [root@clsn ~]# iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT [root@clsn ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT [root@clsn ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
保存iptables配置
01. 第一種方式
[root@clsn ~]# /etc/init.d/iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] [root@clsn ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Tue Apr 4 12:24:43 2017 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [159:10664] -A INPUT -s 10.0.0.0/24 -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT -A INPUT -s 172.16.1.0/24 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT # Completed on Tue Apr 4 12:24:43 2017
02. 第二種方式
iptables-save >/etc/sysconfig/iptables
1.7 iptables nat表配置實例
1.7.1 iptables實現共享上網
圖 - SNAT 配置原理圖
第一個里程碑:配置內網服務器,設置網關地址
/etc/init.d/iptables stop # 內網服務器停止防火牆服務 ifdown eth0 # 模擬關閉內網服務器外網網卡 setup # 修改內網網卡網關和DNS地址信息
也可以使用命令添加默認網關
route add default gw 172.16.1.188
查看默認的路由信息
[root@test ~]# 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.188 0.0.0.0 UG 0 0 0 eth1
說明:內網服務器網關地址指定為共享上網服務器內網網卡地址
第二個里程碑:配置共享上網服務器,開啟共享上網服務器路由轉發功能
[root@clsn ~]# vim /etc/sysctl.conf [root@clsn ~]# 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.188
參數詳解:
參數 |
參數說明 |
-s 172.16.1.0/24 |
指定將哪些內網網段進行映射轉換 |
-o eth0 |
指定在共享上網哪個網卡接口上做NAT地址轉換 |
-j SNAT |
將源地址進行轉換變更 |
-j DNAT |
將目標地址進行轉換變更 |
--to-source ip地址 |
將源地址映射為什么IP地址 |
--to-destination ip地址 |
將目標地址映射為什么IP地址 |
當filter表中的forward默認為drop策略時,如何配置forward鏈?
圖 - 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 # 可以不進行配置
當外網ip不固定時如何配置?
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 MASQUERADE
04. 映射成什么地址 --to-source ip地址/--to-destination ip地址
1.7.2 iptables實現外網IP的端口映射到內網IP的端口
實際需求:將網關的IP和9000端口映射到內網服務器的22端口
端口映射 10.0.0.188:9000 -->172.16.1.180:22
配置實例:
iptables -t nat -A PREROUTING -d 10.0.0.188 -p tcp --dport 9000 -i eth0 -j DNAT --to-destination 172.16.1.7:22
參數說明:
參數 |
參數說明 |
-d 10.0.0.188 |
目標地址。 |
-j DNAT |
目的地址改寫。 |
1.7.3 IP一對一映射
圖 - DNAT 映射原理
實際需求:將ip 地址172.16.1.180 映射到10.0.0.188
通過輔助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
適合內網的機器訪問NAT外網的IP
iptables -t nat -I POSTROUTING -s 172.16.1.0/255.255.240.0 -d 10.0.0.81 -j SNAT --to-source 172.16.1.8
檢查配置:
ping 10.0.0.81 -t tcpdump|grep -i icmp(兩台機器上分別監測) telnet 10.0.0.81 22
1.7.4 映射多個外網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.7.5 系統防火牆與網絡內核優化標准參數
有關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
1.8 自定義鏈的配置
圖 - 自定義鏈原理
創建自定義鏈
#示例:在filter表中創建NOICMP自定義鏈 iptables -t filter -N NOICMP
引用自定義鏈
#示例:在INPUT鏈中引用剛才創建的自定義鏈 iptables -t filter -I INPUT -p icmp -j NOICMP
重命名自定義鏈
#示例:將IN_WEB自定義鏈重命名為WEB iptables -E NOICMP ACCEPTICMP
刪除自定義鏈
刪除自定義鏈需要滿足兩個條件
1、自定義鏈沒有被引用
2、自定義鏈中沒有任何規則
# 示例: 刪除引用數為0且不包含任何規則的ACCEPTICMP鏈 iptables -X ACCEPTICMP
1.9 附錄-防火牆狀態機制
狀態機制是iptables中較為特殊的一部分,這也是iptables和比較老的ipchains的一個比較大的區別之一,運行狀態機制(連接跟蹤)的防火牆稱作帶有狀態機制的防火牆,以下簡稱為狀態防火牆.狀態防火牆比非狀態防火牆要安全,因為它允許我們編寫更嚴密的規則。
在iptables上一共有四種狀態,分別被稱為NEW、ESTABLISHED、INVALID、RELATED,這四種狀態對於TCP、UDP、ICMP三種協議均有效。下面,我們來分別闡述四種狀態的特性.
🔔 NEW
meaning that the packet has started a new connection, or otherwise associated with a connection which has not seen packets in both directions
NEW說明這個包是我們看到的笛一個包。意思就是,這是conntrack橫塊看到的某個連接的第一個包,它即格被匹配了。比如,我們看到一個SYN包,是我們所留意的連接的第一 個包,就要匹配它。
🔔 ESTABLISHED
meaning that the packet is associated with a connection which has seen packets in both directions
ESTABLISHED已經注意到兩個方向上的數據傳輸,而且會繼續匹配這個連接的包.處於ESTABLISHED狀態的連接是非常容易理解的.只要發送並接到應答,連接就是ESTABLISHED的了。一個連接要從NEW變為ESTABLISHED,只需要接到應答包即可,不管這個包是發往防火牆的,還是要由防火牆轉發的.ICMP的錯誤和重定向等信息包也被看作是ESTABLISHED,只要它們是我們所發出的信息的應答。
🔔 RELATED
meaning that the packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer, or an ICMP error.
RELATED是個比較麻煩的狀態.當一個連接和某個已處於ESTABLISHED狀態的連接有關系時,就被認為是RELATED的了,換句話說,一個連接要想是RELATED的,首先要有一個ESTABLISHED的連接。這個ESTABLISHED連接再產生一個主連接之外的連接,這個新的連接就是RELATED的了,當然前提是conntrack模塊要能理解RELATED。ftp是個很好的例子,FTP-data連接就是和FTP-control有關聯的,如果沒有在iptables的策略中配RELATED狀態,FTP-data的連接是無法正確建立的,還有其他的例子,比如,通過IRC的DCC連接#有了這個狀態,ICMP應答、FTP傳輸、DCC等才能穿過防火牆正常工作.注意,大部分還有一些UDP協議都依賴這個機制。這些協議是很復雜的,它們把連接信息放在數據包里,並且要求這些信息能被正確理解。
🔔 INVALID
meaning that the packet is associated with no known connection
INVALID說明數據包不能被識別屬於哪個連接或沒有任何狀態.有幾個原因可以產生這種情況,比如,內存溢出,收到不知厲於哪個連接的ICMP錯誤信息。一般地,我們DROP這個狀態的任何東西,因為防火牆認為這是不安全的東西
1.9.1 iptables配置哲學
如何防止自己被關在門外?
01、去機房重啟系統或者登陸服努器刪除剛才的禁止規則。
02、讓機房人員重啟服芳器或者讓機房人員拿用戶密碼登錄進去。
03、通過服努器的遠程管理卡管理(推薦)。
04、先寫一個定時任務,每5分鍾就停止防火牆。
05、測試環境測試好,寫成腳本,批置執行
配置禁用22端口策略:
iptables -I INPUT -p tcp - dport 22 -j DROP # 說明:利用-I參數,實現強行阻止訪問22端口,將Jffc規則放在第一位
刪除配置的禁止連接22端口的規則
iptables -t filter -D INPUT -p tcp —dport 22 -j DROP iptables -F /etc/init.d/iptables restart
1.10 參考文獻