linux iptables

https://blog.51cto.com/niuduzi/2357139?source=dra

1、iptables

1.1 企業中安全服務配置狀況:

  • SELinux:生產中也是關閉狀態html

  • iptables:生產環境中看狀況web

1.2 企業中安全優化原則:

  • 儘量的不給服務器配置外網IP算法

  • 併發不大的狀況下有外網IP,能夠開啓防火牆服務vim

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

1.3 iptables防火牆簡介

http://www.netfilter.org/projects/iptables/index.htmlbash

    netfilter是內核中的一個安全模塊,iptables是控制這個模塊的軟件。服務器

    netfilter 組件也稱爲內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。cookie

    iptables 組件是一種工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。除非正在使用 Red Hat Linux 7.1 或更高版本,不然須要下載該工具並安裝使用它。網絡

    iptables是Unix/Linux自帶的一款優秀且開放源代碼的徹底自由的基於包過濾的防火牆工具,它的功能十分強大,使用很是靈活,能夠對流入和流出服務器的數據包進行很精細的控制,特別是它能夠在一臺很是低的配置服務器上跑的很是好,iptables+zebra+squid。架構

    iptables主要工做在OSI七層的2、3、四層,若是從新編譯內核,iptables也能夠支持7層控制(squid代理+iptables)

1.4 iptables名詞

1.4.1 容器

容器用來包裝或裝載物品的貯存器(如箱、罐、壇)或者成形或柔軟不成形的包覆材料。

可以將其餘控件放置在其上面的控件。

1.4.2 Netfilter

Netfilter是Linux 2.4.x引入的一個子系統,它做爲一個通用的、抽象的框架,提供一整套的hook函數的管理機制,使得諸如數據包過濾、網絡地址轉換(NAT)和基於協議類型的鏈接跟蹤成爲了可能。

netfilter的架構就是在整個網絡流程的若干位置放置了一些檢測點(HOOK),而在每一個檢測點上登記了一些處理函數進行處理。

1.4.3 表(tables)

表是鏈的容器,即全部的鏈(chains)都屬於其對應的表(tables)。

1.4.4 鏈(chains)

鏈是規則(policys)的容器。

1.4.5 規則(policy)

規則(policy)就是iptables一系列過濾信息的規範和具體方法條款了。

1.5 iptables工做原理

小結:

1. 防火牆是層層過濾的,實際是按照配置規則的順序從上到下,從前到後進行過濾的。

2. 若是匹配上規則,即明確表示是阻止仍是經過,數據包就再也不向下匹配新的規則。

3. 若是規則中沒有明確代表是阻止仍是經過,也沒有匹配規則,向下進行匹配,直到匹配默認規則獲得明確的行爲是阻止仍是經過。

4. 防火牆的默認規則是全部規則執行完後才執行的。

1.6 iptables表(table)和鏈(chain)

表(table) 鏈(chain)
filter 默認表,實現防火牆數據過濾功能。
INPUT 對於指定到本地套接字的包,即到達本地防火牆的數據包。
OUTPUT 本地建立的數據包。
FORWARD 路由穿過的數據包,即通過防火牆的數據包。
NAT 當遇到新建立的數據包鏈接時將參考這個表。
PREROUTING 一進來就對數據包進行改變。
OUTPUT 本地建立的數據包在路由以前進行改變。
POSTROUTING 在數據包即將出去時改變數據包信息。
mangle 專門用於改變數據包
INPUT 進入到設備自己的包
FORWARD 對路由後的數據包進行修改
PREROUTING 在路由以前更改傳入的包
OUTPUT 本地建立的數據包在路由以前進行改變
POSTROUTING 在數據包即將離開時更改數據包信息
raw 有限級最高,設置raw時通常是爲了避免再讓iptables作數據包的連接跟蹤處理,提升性能
  •  

    • 上插入行

    • 下插入行

    • 左插入列

    • 右插入列

    • 刪除當前行

    • 刪除當前列

  •  

     

     

     

     

     

     

  •  

     

     

     

     

     

     

     

     

     

  •  

    • 合併單元格

    • 拆分單元格

    • 清空單元格

  •  

    • 平均分配各列

    • 刪除表格

 

iptables中表和鏈的對應關係:

  INPUT FORWARD PREROUTING OUTPUT POSTROUTING
filter YES YES NO YES NO
NAT NO NO YES YES YES
mangle YES YES YES YES YES
raw NO NO YES YES NO

1.6.1 filter表

filter表 強調:主要和主機自身相關,真正負責主機防火牆功能的(過濾流入流出主機的數據包)
filter表示iptables默認使用的表,定義了三個鏈
企業工做場景:主機防火牆
INPUT 負責過濾全部目標地址是本機地址的數據包
FORWARD 負責轉發流經主機的數據包。起轉發做用,和NAT關係很大。
LVS NAT模式:net.ipv4.ip_forward=0
OUTPUT 處理全部源地址是本機地址的數據包

對於filter表的控制是咱們實現本機防火牆功能的重要手段,特別是針對INPUT鏈的控制

1.6.2 NAT表

NAT表 負責網絡地址轉換的,即來源和目的ip地址的port的轉換
應用:和主機自己無關,通常用於局域網共享上網或者特殊的端口轉換服務相關。
工做場景:
1. 用於企業路由(zebra)或網關(iptables),共享上網(POSTROUTING)
2. 作內部外部IP地址一對一映射(dmz),硬件防火牆映射IP到內部服務器,FTP服務(PREROUTING)
3. WEB,單個端口的映射,直接映射端口80端口(PREROUTING)
OUTPUT 和主機放出去的數據包有關,改變主機發出數據包的目的地址
PREROUTING 在數據包到達防火牆時,進行路由判斷以前執行的規則,做用是改變數據包的目的地址,目的端口等。
POSTROUTING 在數據包離開防火牆時進行路由判斷以後執行的規則,做用改變數據包的源地址,源端口等。

1.6.3 mangle表

mangle表 主要負責修改數據包中特殊的路由標記,例如TTL,TOS,MARK等。

因爲這個表與特殊標記相關,通常狀況下,用不到這個mangle表。

1.6.4 raw表

有限級最高,設置raw時通常是爲了避免再讓iptables作數據包的連接跟蹤處理,提升性能。

     RAW 表只使用在PREROUTING鏈和OUTPUT鏈上,由於優先級最高,從而能夠對收到的數據包在鏈接跟蹤前進行處理。一但用戶使用了RAW表,在某個鏈 上,RAW表處理完後,將跳過NAT表和 ip_conntrack處理,即再也不作地址轉換和數據包的連接跟蹤處理了.

    RAW表能夠應用在那些不須要作nat的狀況下,以提升性能。如大量訪問的web服務器,可讓80端口再也不讓iptables作數據包的連接跟蹤處理,以提升用戶的訪問速度。

1.7 iptables工做流程

0.12711129439386015.png

c8e2f239dc7b5fdaca8c4fa005641fe9.png

7ca43704-c924-4ce7-ab4e-b98f6d94abf1.jpg

基礎步驟:

1. 數據包到達網絡接口,例如eth0

2. 進入raw表的PREROUTING鏈,這個鏈的做用是趕在鏈接跟蹤以前處理數據包

3. 若是進行了鏈接跟蹤,在此處理

4. 進入mangle表的PREROUTING鏈,在此能夠修改數據包,好比TOS等

5. 進入nat表的PREROUTING鏈,能夠在此作DNAT,但不要作過濾

6. 決定路由,看是交給本地主機仍是轉發給其它主機。

到了這裏咱們就得分兩種不一樣的狀況進行討論了,一種狀況就是數據包要轉發給其它主機,這時候它會依次通過:

7. 進入 mangle 表的 FORWARD 鏈,這裏也比較特殊,這是在第一次路由決定以後,在進行最後的路由決定以前,咱們仍然能夠對數據包進行某些修改。

8. 進入 filter 表的 FORWARD 鏈,在這裏咱們能夠對全部轉發的數據包進行過濾。須要注意的是:通過這裏的數據包是轉發的,方向是雙向的。

9. 進入 mangle 表的 POSTROUTING 鏈,到這裏已經作完了全部的路由決定,但數據包仍然在本地主機,咱們還能夠進行某些修改。

10. 進入 nat 表的 POSTROUTING 鏈,在這裏通常都是用來作 SNAT ,不要在這裏進行過濾。

11. 進入出去的網絡接口,完畢。

另外一種狀況是,數據包就是發給本地主機的,那麼它會依次穿過:

7. 進入 mangle 表的 INPUT 鏈,這裏是在路由以後,交由本地主機以前,咱們也能夠進行一些相應的修改。

8. 進入 filter 表的 INPUT 鏈,在這裏咱們能夠對流入的全部數據包進行過濾,不管它來自哪一個網絡接口。

9. 交給本地主機的應用程序進行處理。

10. 處理完畢後進行路由決定,看該往那裏發出。

11. 進入 raw 表的 OUTPUT 鏈,這裏是在鏈接跟蹤處理本地的數據包以前。

12. 鏈接跟蹤對本地的數據包進行處理。

13. 進入 mangle 表的 OUTPUT 鏈,在這裏咱們能夠修改數據包,但不要作過濾。

14. 進入 nat 表的 OUTPUT 鏈,能夠對防火牆本身發出的數據作 NAT 。

15. 再次進行路由決定。

16. 進入 filter 表的 OUTPUT 鏈,能夠對本地出去的數據包進行過濾。

17. 進入 mangle 表的 POSTROUTING 鏈,同上一種狀況的第9步。注意,這裏不光對通過防火牆的數據包進行處理,還對防火牆本身產生的數據包進行處理。

18. 進入 nat 表的 POSTROUTING 鏈,同上一種狀況的第10步。 

19. 進入出去的網絡接口,完畢。

1.8 iptables命令

說明:

問題1:iptables啓動不了

解決方法:setup進入Firewall設置enable

問題2:setup進不去Firewall

解決方法:

1.設置字符集

2.啓動總線進程:dbus-daemon system

1.8.1 iptables語法格式

 

iptables [-t table] {-A|-C|-D} chain rule-specification
 
iptables [-t table] -I chain [rulenum] rule-specification
 
iptables [-t table] -R chain rulenum rule-specification
 

1.8.2 iptables參數選項

參數選項 說明
-t 對指定的表 table 進行操做,若是不指定此選項,默認的是 filter 表
顯示信息
-h 顯示幫助信息
-L 顯示所選鏈的全部規則。若是沒有選擇鏈,全部鏈將被顯示。
 -V 顯示iptables版本信息
-v 詳細輸出。這個選項讓-L參數顯示接口地址、規則選項(若是有)和TOS (Type of Service)掩碼。包和字節計數器也將被顯示,分別用K、M、G (前綴)表示1000、1,000,000和1,000,000,000倍(不過請參看-x標誌改變它), 對於添加,插入,刪除和替換命令,這會使一個或多個規則的相關詳細信息被打印。
-n 數字輸出。IP地址和端口會以數字的形式打印。默認狀況下,程序試顯 示主機名、網絡名或者服務(只要可用)。
-x 擴展數字。顯示包和字節計數器的精確值,代替用K,M,G表示的約數。 這個選項僅能用於 -L 命令。
--line-numbers 當列表顯示規則時,在每一個規則的前面加上行號,與該規則在鏈中的位置相對應。
   
清除規則
-F 清空指定鏈上面的全部規則。若是沒有指定鏈,清空該表上全部鏈的全部規則。
-X 刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,並且這條上必須沒有任何規則。若是沒有指定鏈名,則會刪除該表中全部非內置的鏈。
-Z 把指定鏈,或者表中的全部鏈上的全部計數器清零。
-D 在指定的鏈中刪除一個或多個指定規則。
能夠把被刪除規則指定爲鏈中的序號(第一條序號爲1),或者指定爲要匹配的規則。
規則管理
-A 在所選擇的鏈末添加一條或更多規則。當源(地址)或者/與 目的(地址)轉換 爲多於一個(多個)地址時,這條規則會加到全部可能的地址(組合)後面。
-I 在鏈中的指定位置插入一條或多條規則。若是指定的規則號是1,則在鏈的頭部插入。這也是默認的狀況,若是沒有指定規則號。
-R Replays替換/修改第幾條規則;從選中的鏈中取代一條規則。
-P 定義規則鏈中的默認目標。
規則參數
-p 規則或者包檢查(待檢查包)的協議。指定協議能夠是tcp、udp、icmp中的一個或 者所有,也能夠是數值,表明這些協議中的某一個。固然也可使用在/etc/pro tocols中定義的協議名。在協議名前加上"!"表示相反的規則。數字0至關於全部 all
-s 指定源地址,能夠是主機名、網絡名和清楚的IP地址。mask說明能夠是網絡掩碼或清楚的數字。在參數加上"!"說明指定了相反的地址段。
-d 指定目標地址,地址格式同上。在參數加上"!"說明指定了相反的地址段。
-j 指定規則的目標;也就是說,若是包匹配應當作什麼。即知足某條件時該執行什麼樣的動做。好比 ACCEPT|DROP|REJECT,推薦DROP。
-sport 源端口或端口範圍指定。
-dport 目標端口或端口範圍指定。
-i 指定數據包接收的網絡接口,好比最多見的 eth0 。注意:它只對 INPUT,FORWARD,PREROUTING 這三個鏈起做用。若是沒有指定此選項, 說明能夠來自任何一個網絡接口。當在參數前使用"!"說明後,指的是相反的名稱。
-o 指定數據包出去的網絡接口。只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起做用。當在參數前使用"!"說明 後,指的是相反的名稱。
-m 匹配iptables的擴展模塊,指定數據包規則所使用的過濾模塊,常見的有state、mac、limit
模塊參數
--state 容許訪問包的鏈接跟蹤狀態
  • INVALID:表示包是未知鏈接,無效的封包,例如數據破損的封包狀態;

  • ESTABLISHED:已經聯接成功的聯接狀態;

  • NEW:表示包爲新的鏈接,不然是非雙向傳送的

  • RELATED:表示這個封包是與咱們主機發送出去的封包有關,如FTP數據傳送

--limit 最大平均匹配速率:可賦的值有'/second', '/minute', '/hour', or '/day'這樣的單位,默認是3/hour。
--limit-burst  待匹配包初始個數的最大值:若前面指定的極限還沒達到這個數值,則該數字加1.默認值爲5
剛開始時,通行證的數量是有限的,但每隔一段時間就有新的通行證可用。limit match有兩個參數就對應這種狀況,--limit-burst指定剛開始時有多少通行證可用,--limit指定要隔多長時間才能簽發一個新的通行證。
multiport 可用於匹配非連續或連續端口;最多指定15個端口;
iprange ip範圍匹配模塊,匹配一段連續的地址而非整個網絡時有用
mac Mac地址匹配模塊
string 字符串匹配,可以檢測報文應用層中的字符串,   
字符匹配檢查高效算法:kmp, bm 
可以屏蔽非法字符
connlimit 鏈接數限制,對每IP所可以發起併發鏈接數作限制

1.8.3 模塊說明

  • multiport:多端口匹配

可用於匹配非連續或連續端口,最多指定15個端口。

實例:

 

iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
 
  • iprange:匹配指定範圍內的地址

匹配一段連續的地址而非整個網絡時可用。

實例:

 

iptables -A INPUT -p tcp -m iprange --src-range 10.0.0.0-10.0.0.100 --dport 22 -j ACCEPT
 
iptables -A OUTPUT -p tcp -m iprange --dst-range 10.0.0.20-10.0.0.50 --sport 22 -j ACCEPT
 
  • string:字符串匹配

可以檢測報文應用層中的字符串;字符匹配檢查高效算法:kmp、bm

可以屏蔽非法字符

實例:

 

# 注意該條規則須要添加到OUTPUT鏈,當服務端返回數據報文檢查到有關鍵字"sex"時,則丟棄該報文,可用於web敏感詞過濾
 
iptables -A OUTPUT -p tcp --dport 80 -m string --algo kmp --string "sex" -j DROP
 
  • connlimit:鏈接數限制

對每一個IP所可以發起併發鏈接數作限制

 

iptables -A INPUT -p tcp  --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT
 
  • limit:速率限制

limit-burst: 設置默認閥值

 

iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
 

 

  • state:狀態檢查

鏈接追蹤中的狀態:

        NEW: 新創建一個會話

        ESTABLISHED:已創建的鏈接

        RELATED: 有關聯關係的鏈接

        INVALID: 沒法識別的鏈接

 

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
 

1.8.4 內核模塊擴展

 

[root@web01 ~]# lsmod | egrep "ipt|filter|nat"
 
ipt_REJECT              2383  2
 
iptable_filter          2793  1
 
ip_tables              17895  1 iptable_filter
 
lsmod命令 適用:列出已加載的系統模塊,以友好的方式顯示/proc/modules內容
格式 第一列:module表示模塊的名稱
第二列:size表示模塊的大小,以字節爲單位
第三列:used表示依賴模塊的個數
第四列:by表示依賴模塊的內容
實例 lsmod:列出全部載入系統的模塊
lsmod | grep -i ext3:查詢當前系統是否加載某些模塊
備註 經過lsmod來查看當前系統中已經加載的模塊
經過modprobe加載模塊
經過rmmod卸載已加載的模塊

加載的內核模塊說明:

模塊 說明
ip_tables 防火牆的核心模塊,負責維護防火牆的規則表,經過這些規則,實現防火牆的核心功能。主要有三種功能:包過濾(filter)、NAT以及包處理(mangle)
iptable_filter 防火牆數據包過濾模塊,實現對數據包的過濾與放行功能
iptable_nat 防火牆數據包轉發模塊,用於對數據包進行修改,從而實現數據轉發的目的
ip_conntrack 主要用於修改應用層協議控制包,最重要的是實現NAT
ip_conntrack_ftp 與ftp服務NAT映射相關的模塊
ip_nat_ftp 與ftp服務nat映射相關的模塊
ipt_state 防火牆狀態信息模塊,在新版CentOS6中已經忽略此模塊的加載

 

1.8.5 實例

一、ICMP

利用防火牆控制ICMP協議要注意ICMP的類型

主要的類型有:

  • 0:回顯應答(Ping應答)

  • 8:回顯請求(Ping請求)

實例:

禁止ping

 

iptables -A INPUT -i eth0 -s 10.0.0.0/24 -p icmp -j DROP
 

容許ping

 

iptables -I INPUT -i eth0 -s 10.0.0.0/24 -p icmp --icmp-type 8 -j ACCEPT
 

 

二、SSH

禁止22端口

 

iptables -A INPUT -i eth0 -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
 

實例擴展:恢復因防火牆配置而斷掉的SSH鏈接

(1)去機房重啓系統或登陸服務器刪除剛纔的禁止規則

(2)讓機房人員重啓服務器或者讓機房人員去登陸進去操做

(3)經過服務器的遠程管理卡管理(推薦)

(4)寫一個定時任務,每5分鐘就關閉防火牆

(5)在測試環境測試好,而後在寫成腳本批量執行

三、匹配端口

禁止80端口

 

iptables -A INPUT -p tcp --dport 80 -j DROP
 

禁止500-600端口範圍

 

iptables -A INPUT -p tcp --dport 500:600  -j DROP
 

禁止不連續的端口

 

iptables -A INPUT -p tcp -m multiport --dport 90,96 -j DROP
 

1.8.6 ICMP擴展

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——地址掩碼應答    

1.8.7 默認規則

1. 若是默認規則爲拒絕,那麼能夠認爲是一個白名單(更安全)

2. 若是默認規則爲運行,那麼能夠認爲是一個黑名單

配置防火牆以前須要清除:

 

iptables -F
 
iptables -X
 
iptables -Z
 

而後配置ssh的容許規則:

 

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 

修改默認規則:

 

iptables -P INPUT DROP
 
iptables -P FORWARD DROP
 

配置環回接口(用來作測試使用):

 

iptables -A INPUT -i lo -j ACCEPT
 

配置樣例:

 

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
 
iptables -P INPUT DROP
 
iptables -P FORWARD DROP
 
iptables -P OUTPUT ACCEPT
 
iptables -nL
 
iptables -A INPUT -i lo -j ACCEPT
 
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
 
iptables -A INPUT -p icmp -s 10.0.0.0/24 -m icmp --icmp-type any -j ACCEPT
 
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
 
iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
 

保存:

 

/etc/init.d/iptables save
 
 
iptables-save > /etc/sysconfig/iptables
 

iptables的配置文件:

 

[root@web01 ~]# vim /etc/sysconfig/iptables
 
 
 
# Generated by iptables-save v1.4.7 on Tue Dec  5 15:22:33 2017
 
*filter
 
:INPUT DROP [0:0]
 
:FORWARD DROP [0:0]
 
:OUTPUT ACCEPT [201:20612]
 
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
 
-A INPUT -i lo -j ACCEPT
 
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
 
-A INPUT -s 10.0.0.0/24 -j ACCEPT
 
-A INPUT -i lo -j ACCEPT
 
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
 
-A INPUT -s 10.0.0.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
 
-A INPUT -s 172.16.1.0/24 -j ACCEPT
 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 
COMMIT
 
# Completed on Tue Dec  5 15:22:33 2017
 

注意:在配置文件中設置後須要重啓。

腳本樣例:

 

#!/bin/bash
 
#this is a server firewall created by  oldboy  17:03 2006-7-26
 
#updated by oldboy on 10:30 2009-6-23
 
#http://blog.etiantian.org
 
#qq:49000448
 
#define variable PATH
 
IPT=/sbin/iptables
 
 
 
#Remove any existing rules
 
$IPT -F
 
$IPT -X
 
$IPT -Z
 
 
 
#setting default firewall policy
 
$IPT --policy OUTPUT ACCEPT
 
$IPT --policy FORWARD DROP
 
$IPT -P INPUT DROP
 
 
 
#setting for loopback interface
 
$IPT -A INPUT -i lo -j ACCEPT
 
 
 
#setting access rules
 
#one,ip access rules,allow all the ips of
 
$IPT -A INPUT -s 202.81.17.0/24 -p all -j ACCEPT
 
$IPT -A INPUT -s 202.81.18.0/24 -p all -j ACCEPT
 
$IPT -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT
 
$IPT -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT
 
$IPT -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT
 
 
 
#icmp
 
$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
 
 
 
#others RELATED
 
$IPT -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
 

1.9 iptables之NAT技術

1.9.1 NAT映射

配置內網主機指定網關(網關爲防火牆所在主機):

 

route add default gw 172.16.1.8
 

開啓防火牆主機的路由轉發功能

 

vim /etc/sysctl.conf
 
net.ipv4.ip_forward = 1
 
 
 
sysctl -p
 

設置iptables的nat表

 

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8
 

局域網共享的2種方法:

方法1:適合於有固定外網地址的:

 

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8
 

(1)-s 172.16.1.0/24 辦公室或IDC內網網段。

(2)-o eth0 爲網關的外網卡接口。

(3)-j SNAT --to-source 10.0.0.8 是網關外網卡IP地址。

方法2:適合變化外網地址(撥號)

 

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
 

1.9.2 地址映射

源地址映射:SNAT

目標地址映射:DNAT

SNAT源地址映射須要在外網口上配置,不然在接收回復時會出現目標地址不一樣意丟棄的動做。

DNAT目標地址映射需配置在外網網卡上,不然會出現和SNAT同樣的錯誤。

IP一對一映射

輔助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
 

1.9.3 優化

調整內核參數文件/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
 

1.9.4 解決ip_conntrack: table full, dropping packet的問題

在啓用了iptables web服務器上,流量高的時候常常會出現下面的錯誤:

 

ip_conntrack: table full, dropping packet
 

這個問題的緣由是因爲web服務器收到了大量的鏈接,在啓用了iptables的狀況下,iptables會把全部的鏈接都作連接跟蹤處理,這樣iptables就會有一個連接跟蹤表,當這個表滿的時候,就會出現上面的錯誤。

iptables的連接跟蹤表最大容量爲/proc/sys/net/ipv4/ip_conntrack_max,連接碰到各類狀態的超時後就會從表中刪除。

/proc/net/nf_conntrack文件就是連接跟蹤表

可使用yum install -y iptstate進行命令行查看。

最大值:

 

[root@web01 ~]# cat /proc/sys/net/nf_conntrack_max
 
15184
 

超過最大值會出錯,提示表滿了,接下來的請求會被DROP

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
 

還有一個方法,raw表是不記錄數據包的連接跟蹤處理的,因此能夠設置raw表來進行處理。

例如:

 

iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
 
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
相關文章
相關標籤/搜索