1.1 企業安全優化配置原則
盡可能不給服務器配置外網ip ,可以通過代理轉發或者通過防火墻映射.并發不是特別大情況有外網ip,可以開啟防火墻服務
高并發的情況,不能開iptables,會影響性能,利用硬體防火墻提升架構安全
1.1.1 實際環境應用
主要應用方向
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系列過濾資訊的規范和具體方法條款了.可以理解為柜子如何增加并擺放柜子東西等,
基本術語如下圖所示
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@centos ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@centos~]# hostname -I
10.0.0.188 172.16.1.188
軟體版本
[root@nfsnobody ~]# 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@nfsnobody ~]# iptables ! -V
Not 1.4.7 ;-)
[root@nfsnobody ~]# iptables -V
iptables v1.4.7
注意:在iptables中所有鏈名必須大寫,表明必須小寫,動作必須大寫,匹配必須小寫,
1.5.2 配置前準備
在配置防火墻首先要其中防火墻
[root@centos ~]# /etc/init.d/iptables start
iptables: Applying firewall rules: [ OK ]
清除iptables所有規則
[root@centos ~]# iptables -Z
[root@centos ~]# iptables -X
[root@centos ~]# iptables -F
查看iptables的規則
[root@centos ~]# 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@centos ~]# iptables -nL -t raw
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
查看配置規則的順序號
[root@centos ~]# 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@nfsnobody ~]# iptables -F
[root@nfsnobody ~]# iptables -X
[root@nfsnobody ~]# iptables -Z
修改默認規則為拒絕(修改前先放行22埠,保證自己能夠連上主機)
[root@nfsnobody ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@nfsnobody ~]# iptables -P INPUT DROP
[root@nfsnobody ~]# iptables -P FORWARD DROP
放行指定的埠
[root@nfsnobody ~]# iptables -A INPUT -i lo -j ACCEPT
[root@nfsnobody ~]# iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
[root@nfsnobody ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
[root@nfsnobody ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
保存iptables配置
01. 第一種方式
[root@nfsnobody ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@nfsnobody ~]# 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@nfsnobody ~]# vim /etc/sysctl.conf
[root@nfsnobody ~]# 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/143882.html
標籤:Linux
