1. 程式人生 > 實用技巧 >基於gin的golang web開發:模型繫結

基於gin的golang web開發:模型繫結

目錄

一、iptables

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

  • SELinux:生產中也是關閉狀態
  • iptables:生產環境中看情況

1.2 企業中安全優化原則:

  • 儘可能的不給伺服器配置外網IP
  • 併發不大的情況下有外網IP,可以開啟防火牆服務
  • 大併發的情況下,不能開iptables,影響效能,利用硬體防火牆提升架構安全性

1.3 iptables防火牆簡介

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

netfilter是核心中的一個安全模組,iptables是控制這個模組的軟體。

netfilter 元件也稱為核心空間(kernelspace),是核心的一部分,由一些資訊包過濾表組成,這些表包含核心用來控制資訊包過濾處理的規則集。

iptables 元件是一種工具,也稱為使用者空間(userspace),它使插入、修改和除去資訊包過濾表中的規則變得容易。除非正在使用 Red Hat Linux 7.1 或更高版本,否則需要下載該工具並安裝使用它。

iptables是Unix/Linux自帶的一款優秀且開放原始碼的完全自由的基於包過濾的防火牆工具,它的功能十分強大,使用非常靈活,可以對流入和流出伺服器的資料包進行很精細的控制,特別是它可以在一臺非常低的配置伺服器上跑的非常好,iptables+zebra+squid。

iptables主要工作在OSI七層的二、三、四層,如果重新編譯核心,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
NAT
mangle
raw

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工作流程

基礎步驟:

  1. 資料包到達網路介面,例如eth0

  2. 進入raw表的PREROUTING鏈,這個鏈的作用是趕在連線跟蹤之前處理資料包

  3. 如果進行了連線跟蹤,在此處理

  4. 進入mangle表的PREROUTING鏈,在此可以修改資料包,比如TOS等

  5. 進入nat表的PREROUTING鏈,可以在此做DNAT,但不要做過濾

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

到了這裡我們就得分兩種不同的情況進行討論了,一種情況就是資料包要轉發給其它主機,這時候它會依次經過:

  1. 進入 mangle 表的 FORWARD 鏈,這裡也比較特殊,這是在第一次路由決定之後,在進行最後的路由決定之前,我們仍然可以對資料包進行某些修改。

  2. 進入 filter 表的 FORWARD 鏈,在這裡我們可以對所有轉發的資料包進行過濾。需要注意的是:經過這裡的資料包是轉發的,方向是雙向的。

  3. 進入 mangle 表的 POSTROUTING 鏈,到這裡已經做完了所有的路由決定,但資料包仍然在本地主機,我們還可以進行某些修改。

  4. 進入 nat 表的 POSTROUTING 鏈,在這裡一般都是用來做 SNAT ,不要在這裡進行過濾。

  5. 進入出去的網路介面,完畢。

另一種情況是,資料包就是發給本地主機的,那麼它會依次穿過:

  1. 進入 mangle 表的 INPUT 鏈,這裡是在路由之後,交由本地主機之前,我們也可以進行一些相應的修改。

  2. 進入 filter 表的 INPUT 鏈,在這裡我們可以對流入的所有資料包進行過濾,無論它來自哪個網路介面。

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

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

  5. 進入 raw 表的 OUTPUT 鏈,這裡是在連線跟蹤處理本地的資料包之前。

  6. 連線跟蹤對本地的資料包進行處理。

  7. 進入 mangle 表的 OUTPUT 鏈,在這裡我們可以修改資料包,但不要做過濾。

  8. 進入 nat 表的 OUTPUT 鏈,可以對防火牆自己發出的資料做 NAT 。

  9. 再次進行路由決定。

  10. 進入 filter 表的 OUTPUT 鏈,可以對本地出去的資料包進行過濾。

  11. 進入 mangle 表的 POSTROUTING 鏈,同上一種情況的第9步。注意,這裡不光對經過防火牆的資料包進行處理,還對防火牆自己產生的資料包進行處理。

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

  13. 進入出去的網路介面,完畢。

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 例項

1、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

2、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)在測試環境測試好,然後在寫成指令碼批量執行

3、匹配埠

禁止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