企業軟件防火牆iptables

1.1 企業中安全優化配置原則

推薦:儘可能不給內部服務器配置外網ip ,可以通過代理轉發或者通過防火牆映射.併發不是特別大情況有外網ip,可以開啓防火牆服務.

使用場景:

大併發的情況,不能開iptables,影響性能,利用硬件防火牆提升架構安全

小併發的情況,選擇軟件防火牆:iptables(centos 6)、firewalld(centos 7)

firewalld 是最新的軟件防火牆centos 7在使用

1.1.1 生產中iptables的實際應用

主要應用方向

1、主機防火牆(filter表的INPUT鏈)。

2、局域網共享上網(nat表的POSTROUTING)。半個路由器,NAT功能。

3、端口及IP映射(nat表的PREROUTING),硬防的NAT功能。

4IP一對一映射。

其他說明:

 ①iptables是基於內核的防火牆,功能非常強大,基於數據包的過濾!特別是可以在一臺非常低的硬件配置下跑的非常好。

  注:iptables主要工作在OSI七層的2.3.4層。七層的控制可以使用squid代理+iptables。

②iptabes:生產中根據具體情況,一般,內網關閉,外網打開。大併發的情況不能開iptables,影響性能,iptables是要消耗CPU的,所以大併發的情況下,我們使用硬件防火牆的各方面做的很仔細。selinux:生產中也是關閉的。可以做ids的***檢測。

③實際生產中儘可能不給服務器配置外網IP。可以通過代理轉發。比如,nagios就不需要外網。

④併發不是很大的情況下,再外網的IP環境,開防火牆。

⑤第一次直接默認規則生成配置文件,以後就在配置文件中進行修改(編輯添加刪除)。

⑥封掉IP:根據IP地址和網絡連接數進行封殺。(定時任務,定時封掉,判斷,存在就不再進行二次封殺)

1.1.2 企業常用案例功能小結:

1linux主機防火牆,單機作爲防火牆(表filter)。

2)局域網共享上網(表nat postrouting)。

3)外部地址映射爲內部地址和端口(表nat prerouting

1.2 iptables防火牆簡介

Netfilter/Iptables(以下簡稱Iptables)unix/linux自帶的一款優秀且開放源代碼的完全自由的基於包過濾的防火牆工具,它的功能十分強大,使用非常靈活,可以對流入和流出服務器的數據包進行很精細的控制.特別是它可以在一臺非常低的硬件配置服務器上跑的非常好(賽揚500HZ cpu 64M 內存的惲況下部署網關防火牆,這說明硬件要求低),提供近400人的上網服務絲毫不遜色企業級專業路由器防火牆。 iptables + zebra + squid (企業常用網絡開源產品)。

 iptables + zebra(可以模擬網絡設備) + squid(緩存)  == 一臺硬件防火牆

Netfilter是一個系統的內核模塊,通過netfilter內核控制硬件設備。

https://www.netfilter.org/documentation/index.html

   iptableslinux2.42.6內核中集成的服務,其功能與安全性比其老一蜚ipfwadmipchains 強大的多,iptables主要工作在0SI七層的二、三、四層,如果重新編譯內核,iptables也可以支持 7 層控制(squid代理+iptables)。

          實現應用層訪問控制:nginx、WAF

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.2.7 iptables工作原理

image.png

image.png


1.3 iptables 表和鏈

描述完iptables術語後,相信大家對iptables的表和鏈有了初步的瞭解了,默認情況下,iptables根據功能和表的定義劃分包含三個表,filter,nat,mangle,其每個表又包含不同的操作鏈(chains ) 實際iptables包含4張表和五個鏈,巧主要記住兩張表即可filternat表即可。

下面表格展示了表和鏈的對應關係。

四個表:

表(tables

鏈(chains

Filter

這是默認表,實現防火牆數據過濾功能。

INPUT

對於指定到本地套接字的包,即到達本地防火牆服務器的數據包。

FORWARD

路由穿過的數據包,即經過本地防火牆服務器的數據包。

OUTPUT

本地創建的數據包

NAT

當遇到新創建的數據包連接時將參考這個表

FREROUTING

一進來就對數據包進行改變(路由前進行原地址轉換)

OUTPUT

本地創建的數據包在路由前進行改變

POSTROUTING

在數據包即將出去時改變數據包信息(路由後進行目的地址轉換)

Mangle

這個表專門用於改變數據包的結構(一般改變數據包首部格式,如TTL值)

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

×

×

×

說明:√ 表示有,× 表示無。

111111111111111.png

 - 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)

3WEB,單個端口的映射,直接映射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是採用數據包過濾機制工作的,所以它會對請求的數據包的包頭數據進行分析,並根據我們預先設定的規則進行匹配來決定是否可以進入主機。

數據包的流向是從左向右的。

 111.png

 - iptables包處理流程圖

 222.png

 - iptables包處理流程圖(簡化)


抽象說明:上圖可以用北京地鐵1,2號線來描述:

1號線:主要是NAT功能

 企業案例:

   1)局域網上網共享(路由和網關),使用NAT的POSTROUTING鏈。

   2)外部IP和端口映射爲內部IP和端口(DMZ功能),使用NAT的PREROUTING鏈

2號線:主要是FILTER功能,即防火牆功能FILTER INPUT FORWARD

企業案例:

  主要應用就是主機服務器防火牆,使用FILTER的INPUT鏈

    222222.png

 - 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

顯示詳細信息,可以疊加    (顯示匹配數據計數器pakg)

-h

顯示幫助信息

初始化相關參數

iptables -F

清除所有規則,不會處理默認的規則

iptables -X

刪除用戶自定義的鏈

iptables -Z

鏈的計數器清零(數據包計數器與數據包字節計數器)

配置常用參數

-t 表名稱

指定配置哪個表,指定配置表名稱。

--append/-A 鏈名稱

附加或追加上相應規則策略,到指定鏈(鏈名稱必須大寫)默認將配置的規則插入到最後一條

--check/-C

Check for the existence of a rule

--insert/-I 鏈名稱

插入相應規則策略,到指定鏈上,默認將配置的規則插入到第一條(可以根據規則序號插入到指定位置)--IP地址使用(利用shell腳本實現封IP)。

--delete/-D 鏈名稱

刪除指定的規則(可以根據規則序號進行刪除)

--replace/-R

Replace rule rulenum (1 = first) in chain

指定在哪個鏈上修改/替換已有的規則(鏈後面指定要替換的規則序號)

例:iptables -R INPUT 2 -i eth0 -p tcp --dport 22 -s 10.0.0.1 -j DROP

-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 配置前準備

先備份當前防火牆配置    (在企業中不清楚其他人配置規則的作用之前先備份)

cp /etc/sysconfig/iptables{,.bak}


在配置防火牆首先要啓動防火牆

[root@clsn ~]# /etc/init.d/iptables start

iptables: Applying firewall rules: [ OK ]

清除iptables所有規則

[root@clsn ~]# iptables -Z    #清空iptables計數器  (作用:清零後,用戶在訪問,就可排除哪條規則起                                                        作用了)

[root@clsn ~]# iptables -X    #清空iptables自定義鏈配置

[root@clsn ~]# iptables -F    #清空所有規則,保留默認規則

查看iptables的規則

方法一:/etc/init.d/iptables status

方法二:iptables -L

[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.1ip通過ssh連接這臺服務器

iptables -I INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT

如果默認規則是允許所有,還需修改默認規則爲丟棄所有:

iptables -P INPUT DROP

配置實例二:禁止網段連入(禁止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 -P INPUT DROP

   修改默認規則,將默認規則改爲拒絕

第二種方式:

     --- 表示對規則信息進行取反

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


iptables配置的保存:

方法一:/etc/init.d/iptables save

方法二:iptables-save > /etc/sysconfig/iptables

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 -s 10.0.0.1 -p icmp --icmp-type 0 -j DROP

output鏈: 禁止icmp-type 8 

iptables -A OUTPUT -d 10.0.0.1 -p icmp --icmp-type 8 -j DROP

   接受者:

input鏈: 禁止icmp-type 8 

iptables -A INPUT -s 10.0.0.1 -p icmp --icmp-type 8 -j DROP

output鏈: 禁止icmp-type 0 

iptables -A OUTPUT -d 10.0.0.1 -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

表示藉助已經建立的鏈路,發送新的連接數據包

如:如果禁止了RELATED狀態,FTP可以建立連接,但無法傳輸數據

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實現限速功能

limitiptables的一個匹配模塊,用它結合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實現共享上網

 1111.png

 - SNAT 配置原理圖

第一個里程碑:配置內網服務器,設置網關地址

/etc/init.d/iptables stop # 內網服務器停止防火牆服務

ifdown eth0 # 模擬關閉內網服務器外網網卡

setup # 修改內網網卡網關和DNS地址信息

也可以使用命令添加默認網關

route add default gw 172.16.1.188

查看默認的路由信息

[root@test ~]# route -nKernel 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鏈?

 123.png

 - 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的端口

實際需求:將網關的IP9000端口映射到內網服務器的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上一共有四種狀態,分別被稱爲NEWESTABLISHEDINVALIDRELATED,這四種狀態對於TCPUDPICMP三種協議均有效。下面,我們來分別闡述四種狀態的特性.


小夥伴們可以關注我的×××公衆號:linux運維菜鳥之旅

qrcode_for_gh_5ecc48d3d14a_258.jpg

關注“中國電信天津網廳”公衆號,首次綁定可免費領2G流量,爲你的學習提供流量! 

qrcode_for_gh_d20dccd1c74b_258.jpg


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