防火墻技術(一)

防火墻(Firewall),也稱防護墻,是由Check Point創立者Gil Shwed于1993年發明并引入國際互聯網。它是一種位于內部網絡與外部網絡之間的網絡安全系統。一項信息安全的防護系統,依照特定的規則,允許或是限制傳輸的數據通過。

本節索引:

一、防火墻介紹

二、iptables工具

三、iptables基本命令使用舉例

三、SNAT與DNAT地址轉換

 

一、防火墻介紹

防火墻的分類

按防火墻服務范圍可分為:

主機防火墻:服務范圍為當前主機

網絡防火墻:服務范圍為防火墻一側的局域網

 

軟硬件可分為:

硬件防火墻:在專用硬件級別實現部分功能的防火墻;另一個部分功能基于軟件

實現,Checkpoint,NetScreen

軟件防火墻:運行于通用硬件平臺之上的防火墻的應用軟件

 

OSI模型可分為:

網絡層防火墻:OSI下面第三層

應用層防火墻/代理服務器:代理網關,OSI七層

 

Netfilter組件

Netfilter是Linux 2.4內核防火墻框架,該框架既簡潔又靈活,可實現安全策略應用

中的許多功能,如數據包過濾、數據包處理、地址偽裝、透明代理、動態網絡地址轉

(Network Address Translation,NAT),以及基于用戶及媒體訪問控制(Media

Access Control,MAC)地址的過濾和基于狀態的過濾、包速率限制等。

 

特性:

內核空間,集成在Linux內核中

擴展各種網絡服務的結構化底層框架

內核中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、FORWARD、

PREROUTING、POSTROUTING),而這五個hook function向用戶開放,用戶可以通過一

個命令工具(iptables)向其寫入規則

由信息過濾表(table)組成,包含控制IP包處理的規則集(rules),規則被分組放

在鏈(chain)上

 

三種報文流向:

流入本機:PREROUTING –> INPUT–>用戶空間進程

流出本機:用戶空間進程 –>OUTPUT–> POSTROUTING

轉發:PREROUTING –> FORWARD –> POSTROUTING

timg_image&quality=80&size=b9999_10000&sec=1530335045851&di=3ca9d674c9be44456c2a

 

iptables由四個表和五個鏈以及一些規則組成

四個表table:filter、nat、mangle、raw

filter表:過濾規則表,根據預定義的規則過濾符合條件的數據包

nat表:network address translation 地址轉換規則表

mangle:修改數據標記位規則表

raw:關閉NAT表上啟用的連接跟蹤機制,加快封包穿越防火墻速度

優先級由高到低的順序為:raw–>mangle–>nat–>filter

 

五個內置鏈chain

INPUT

OUTPUT

FORWARD

PREROUTING

POSTROUTING

表鏈結構

 

 

 

二、iptables工具

格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-matchoptions]] -j

targetname ?[per-target-options]

(1)table:

raw, mangle, nat, [filter]默認

 

(2)SUBCOMMAND:

1、鏈管理:

-N???????????? new, 自定義一條新的規則鏈

-X????????????? delete,刪除自定義的空的規則鏈

-P????????????? Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:

ACCEPT??????????? 接受

DROP??????????????? 丟棄

-E????????????? 重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也不能被刪除

 

2、查看:

-L????????????? list, 列出指定鏈上的所有規則,本選項須置后

-n????????????? numberic,以數字格式顯示地址和端口號

-v????????????? verbose,詳細信息

-vv ????????? 更詳細

-x????????????? exactly,顯示計數器結果的精確值,而非單位轉換后的易讀值

–line-numbers??????? 顯示規則的序號

常用組合:

-vnL

–vvnxL –line-numbers

-S selected,以iptables-save ???????? 命令格式顯示鏈上規則

 

3、規則管理:

-A:append,追加

-I:insert, 插入,要指明插入至的規則編號,默認為第一條

-D:delete,刪除

(1) 指明規則序號

(2) 指明規則本身

-R:replace,替換指定鏈上的指定規則編號

-F:flush,清空指定的規則鏈

-Z:zero,置零

iptables的每條規則都有兩個計數器

(1) 匹配到的報文的個數

(2) 匹配到的所有報文的大小之和

 

(3)擴展匹配條件

擴展匹配條件:需要加載擴展模塊(/usr/lib64/xtables/*.so),方可生效

查看幫助 man iptables-extensions

擴展匹配分為隱性擴展和顯性擴展兩種

隱性擴展:不需要寫模塊名稱

如:iptables -A INPUT -s 192.168.30.6 -p tcp –dport 139 -j REJECT

顯性擴展:必須指定模塊名稱

如:iptables -A INPUT -p tcp -m multiport –dports 21,80,445 -j REJECT

 

(4)處理動作:

-j targetname [per-target-options]

簡單:??? ACCEPT,DROP

擴展:??? REJECT:–reject-with:icmp-port-unreachable默認

RETURN:返回調用鏈

REDIRECT:端口重定向

LOG:記錄日志,dmesg

MARK:做防火墻標記

DNAT:目標地址轉換

SNAT:源地址轉換

MASQUERADE:地址偽裝

自定義鏈:

 

 

三、iptables基本命令使用舉例

(一)鏈及NAT的基本操作

1、清除所有的規則。

1)清除預設表filter中所有規則鏈中的規則。

# iptables -F

2)清除預設表filter中使用者自定鏈中的規則。

#iptables -X

#iptables -Z

3)清楚NAT表規則

#iptables -F -t nat

4)NAT表的顯示

#iptables -t nat -nL

 

2、設置鏈的默認策略。一般有兩種方法。

1)首先允許所有的包,然后再禁止有危險的包通過放火墻。

#iptables -P INPUT ACCEPT

#iptables -P OUTPUT ACCEPT

#iptables -P FORWARD ACCEPT

2)首先禁止所有的包,然后根據需要的服務允許特定的包通過防火墻。

#iptables -P INPUT DROP

#iptables -P OUTPUT DROP

#iptables -P FORWARD DROP

3、列出表/鏈中的所有規則。默認只列出filter表。

#iptables -L

4、向鏈中添加規則。下面的語句用于開放網絡接口:

#iptables -A INPUT -i lo -j ACCEPT

#iptables -A OUTPUT -o lo -j ACCEPT

#iptables -A INPUT -i eth0 -j ACEPT

#iptables -A OUTPUT -o eth1 -j ACCEPT

#iptables -A FORWARD -i eth1 -j ACCEPT

#iptables -A FORWARD -0 eth1 -j ACCEPT

注意:由于本地進程不會經過FORWARD鏈,因此回環接口lo只在INPUT和OUTPUT兩個鏈上作用。

5、使用者自定義鏈。

#iptables -N custom

#iptables -A custom -s 0/0 -d 0/0 -p icmp -j DROP

#iptables -A INPUT -s 0/0 -d 0/0 -j DROP

 

(二)設置基本的規則匹配

1、指定協議匹配。

1)匹配指定協議。

#iptables -A INPUT -p tcp

2)匹配指定協議之外的所有協議。

#iptables -A INPUT -p !tcp

 

2、指定地址匹配。

1)指定匹配的主機。

#iptables -A INPUT -s 192.168.0.18

2)指定匹配的網絡。

#iptables -A INPUT -s 192.168.2.0/24

3)匹配指定主機之外的地址。

#iptables -A FORWARD -s !192.168.0.19

4)匹配指定網絡之外的網絡。

#iptables -A FORWARD -s ! 192.168.3.0/24

 

3、指定網絡接口匹配。

1)指定單一的網絡接口匹配。

#iptables -A INPUT -i eth0

#iptables -A FORWARD -o eth0

2)指定同類型的網絡接口匹配。

#iptables -A FORWARD -o ppp+

 

4、指定端口匹配。

1)指定單一端口匹配。

#iptables -A INPUT -p tcp –sport www

#iptables -A INPUT -p udp –dport 53

2)匹配指定端口之外的端口。

#iptables -A INPUT -p tcp –dport !22

3)匹配端口范圍。

#iptables -A INPUT -p tcp –sport 22:80

4)匹配ICMP端口和ICMP類型。

#iptables -A INOUT -p icmp –icimp-type 8

5)指定ip碎片。

每個網絡接口都有一個MTU(最大傳輸單元),這個參數定義了可以通過的數據包的最大尺寸。如果一個

數據包大于這個參數值時,系統會將其劃分成更小的數據包稱為ip碎片)來傳輸,而接受方則對這些ip碎

片再進行重組以還原整個包。這樣會導致一個問題:當系統將大數據包劃分成ip碎片傳輸時,第一個碎片

含有完整的包頭信息(IP+TCP、UDP和ICMP),但是后續的碎片只有包頭的部分信息(如源地址、目的

地址)。因此,檢查后面的ip碎片的頭部(象有TCP、UDP和ICMP一樣)是不可能的。假如有這樣的一條

規則:

#iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 –dport 80 -j ACCEPT

并且這時的FORWARD的policy為DROP時,系統只會讓第一個ip碎片通過,而余下的碎片因為包頭信息不

完整而無法通過??梢酝ㄟ^—fragment/-f 選項來指定第二個及以后的ip碎片解決上述問題。

#iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT

注意現在有許多進行ip碎片***的實例,如DoS***,因此允許ip碎片通過是有安全隱患的,對于這一點可以

采用iptables的匹配擴展來進行限制。

 

(三)設置擴展的規則匹配(舉例已忽略目標動作)

1、多端口匹配。

1)匹配多個源端口。

#iptables -A INPUT -p tcp -m multiport –sport 22,53,80,110

2)匹配多個目的端口。

#iptables -A INPUT -p tcp -m multiport –dpoort 22,53,80

3)匹配多端口(無論是源端口還是目的端口)

#iptables -A INPUT -p tcp -m multiport –port 22,53,80,110

 

2、指定TCP匹配擴展

使用 –tcp-flags 選項可以根據tcp包的標志位進行過濾。

#iptables -A INPUT -p tcp –tcp-flags SYN,FIN,ACK SYN

#iptables -A FROWARD -p tcp –tcp-flags ALL SYN,ACK

上實例中第一個表示SYN、ACK、FIN的標志都檢查,但是只有SYN匹配。第二個表示ALL(SYN,

ACK,FIN,RST,URG,PSH)的標志都檢查,但是只有設置了SYN和ACK的匹配。

#iptables -A FORWARD -p tcp –syn

選項—syn相當于”–tcp-flags SYN,RST,ACK SYN”的簡寫。

 

3、limit速率匹配擴展。

1)指定單位時間內允許通過的數據包個數,單位時間可以是/second、/minute、/hour、/day或使用第一個子母。

#iptables -A INPUT -m limit –limit 300/hour

2 )指定觸發事件的閥值。

#iptables -A INPUT -m limit –limit-burst 10

用來比對一次同時涌入的封包是否超過10個,超過此上限的包將直接丟棄。

3)同時指定速率限制和觸發閥值。

#iptables -A INPUT -p icmp -m limit –-limit 3/m –limit-burst 3

表示每分鐘允許的最大包數量為限制速率(本例為3)加上當前的觸發閥值burst數。任何情況下,都可保

證3個數據包通過,觸發閥值burst相當于允許額外的包數量。

 

4、基于狀態的匹配擴展(連接跟蹤)

每個網絡連接包括以下信息:源地址、目標地址、源端口、目的端口,稱為套接字對(socket pairs);協

議類型、連接狀態(TCP協議)

和超時時間等。防火墻把這些信息稱為狀態(stateful)。狀態包過濾防火墻能在內存中維護一個跟蹤狀態

的表,比簡單包過濾防火墻具有更大的安全性,命令格式如下:

iptables -m state –-state [!]state [,state,state,state]

其中,state表是一個逗號分割的列表,用來指定連接狀態,4種:

>NEW:該包想要開始一個新的連接(重新連接或連接重定向)

>RELATED:該包是屬于某個已經建立的連接所建立的新連接。舉例:

FTP的數據傳輸連接和控制連接之間就是RELATED關系。

>ESTABLISHED:該包屬于某個已經建立的連接。

>INVALID:該包不匹配于任何連接,通常這些包被DROP。

>UNTRACKED:未進行追蹤的連接,如raw表中關閉追蹤

示例:

iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport –dports 22,80 -m state —

state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport –sports 22,80 -m state —

state ESTABLISHED -j ACCEPT

已經追蹤到的并記錄下來的連接信息庫

/proc/net/nf_conntrack

調整連接追蹤功能所能夠容納的最大連接數量

/proc/sys/net/nf_conntrack_max

不同的協議的連接追蹤時長

/proc/sys/net/netfilter/

注意:CentOS7 需要加載模塊: modprobe nf_conntrack

 

 

開放被動模式的ftp服務

(1) 裝載ftp連接追蹤的專用模塊:

跟蹤模塊路徑:/lib/modules/kernelversion/kernel/net/netfilter

vim /etc/sysconfig/iptables-config 配置文件

IPTABLES_MODULES=“nf_conntrack_ftp”

modproble nf_conntrack_ftp

(2) 放行請求報文:

命令連接:NEW, ESTABLISHED

數據連接:RELATED, ESTABLISHED

iptables –I INPUT -d LocalIP -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -d LocalIP -p tcp –dport 21 -m state –state NEW -j ACCEPT

(3) 放行響應報文:

iptables -I OUTPUT -s LocalIP -p tcp -m state –state ESTABLISHED -j ACCEPT

 

開放被動模式的ftp服務示例:

yum install vsftpd

systemctl start vsftpd

modprobe nf_conntrack_ftp

iptables -F

iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

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

iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables –vnL

 

iptable防火墻優化原則

任何不允許的訪問,應該在請求到達時給予拒絕

規則在鏈接上的次序即為其檢查時的生效次序

基于上述,規則優化

1 安全放行所有入站和出站的狀態為ESTABLISHED狀態連接

2 謹慎放行入站的新請求

3 有特殊目的限制訪問功能,要在放行規則之前加以拒絕

4 同類規則(訪問同一應用),匹配范圍小的放在前面,用于特殊處理

5 不同類的規則(訪問不同應用),匹配范圍大的放在前面

6 應該將那些可由一條規則能夠描述的多個規則合并為一條

7 設置默認策略,建議白名單(只放行特定連接)

1) iptables -P,不建議

2) 建議在規則的最后定義規則做為默認策略

 

四、NAT地址轉換

NAT:network address translation

PREROUTING,INPUT,OUTPUT,POSTROUTING

請求報文:修改源/目標IP,由定義如何修改

響應報文:修改源/目標IP,根據跟蹤機制自動實現

 

SNAT:source NAT POSTROUTING, INPUT

讓本地網絡中的主機通過某一特定地址訪問外部網絡,實現地址偽裝

請求報文:修改源IP

典型應用場景:多個PC機使用ADSL路由器共享上網,每個PC機都配置了內網IP,PC機訪問

外部網絡的時候,路由器將數據包的報頭中的源地址替換成路由器的ip,當外部網絡的服

務器比如網站web服務器接到訪問請求的時候,他的日志記錄下來的是路由器的ip地址,而

不是pc機的內網ip;這是因為,這個服務器收到的數據包的報頭里邊的“源地址”,已經

被替換了所以叫做SNAT,基于源地址的地址轉換。

 

 

DNAT:destination NAT PREROUTING , OUTPUT

把本地網絡中的主機上的某服務開放給外部網絡訪問(發布服務和端口映射),

但隱藏真實IP

請求報文:修改目標IP

典型應用場景:比如有web服務器放在內網配置內網ip,前端有個防火墻配置公網ip,互聯

網上的訪問者使用公網ip來訪問這個網站當訪問的時候,客戶端發出一個數據包,這個數據

包的報頭里邊,目標地址寫的是防火墻的公網ip,防火墻會把這個數據包的報頭改寫一次,

將目標地址改寫成web服務器的內網ip,然后再把這個數據包發送到內網的web服務器上,這

樣,數據包就穿透了防火墻,并從公網ip變成了一個對內網地址的訪問了,即DNAT,基于目

標的網絡地址轉換。

 

PNAT:port nat,端口和IP都進行修改

 

SNAT:固定IP

–to-source [ipaddr[-ipaddr]][:port[-port]]

–random

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT –tosource ExtIP

示例:

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT —

to-source 172.18.1.6-172.18.1.9

 

SNAT:動態IP

MASQUERADE:地址偽裝

如此配置的話,不用指定SNAT的目標ip了,不管現在網卡的出口獲得了怎樣的動態ip,

MASQUERADE會自動讀取網卡現在的ip地址然后做SNAT出去,這樣就實現了很好的動態

SNAT地址轉換。

–to-ports port[-port]

–random

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j ?MASQUERADE

示例:

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j

MASQUERADE

 

 

如何區分SNAT和DNAT

從定義來講它們一個是源地址轉換,一個是目標地址轉換。都是地址轉換的功能,將私有地

址轉換為公網地址。

要區分這兩個功能可以簡單的由連接發起者是誰來區分:

內部地址要訪問公網上的服務時(如web訪問),內部地址會主動發起連接,由路由器或者

防火墻上的網關對內部地址做個地址轉換,將內部地址的私有IP轉換為公網的公有IP,網

關的這個地址轉換稱為SNAT,主要用于內部共享IP訪問外部。

 

當內部需要提供對外服務時(如對外發布web網站),外部地址發起主動連接,由路由器或

者防火墻上的網關接收這個連接,然后將連接轉換到內部,此過程是由帶有公網IP的網關替

代內部服務來接收外部的連接,然后在內部做地址轉換,此轉換稱為DNAT,主要用于內部服

務對外發布。

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/102016

(0)
wangxczwangxcz
上一篇 2018-06-30 12:12
下一篇 2018-06-30 15:38

相關推薦

  • Tomcat的簡介和應用

    tomcat的配置文件;tomcat的虛擬主機;tomcat的圖形管理界面;tomcat的負載均衡;

    2018-07-16
  • 初學linux所遇到錯誤詳解與使用技巧

    適合小白新手,好懂易操作。

    2018-03-31
  • 第三周筆記總結

    第七天運行腳本的條件:1、加執行權限或者bash+腳本名2、寫路徑(絕對、相對均可) 加執行權限以后,如果沒有放在PATH變量下的路徑內,運行腳本需要寫路徑3、如果不想寫路徑,可以將腳本放在PATH變量中的任何位置均可,通常放/root/bin下,/bin需要增加創建 腳本調試只檢測腳本中的語法錯誤bash -n /path/to/some_script跟蹤…

    Linux筆記 2018-04-15
  • AWK

    ### awk awk分為nawk,gawk 我們shell中常用的awk 其版本是gawk “`AWK會把file中的每一行(記錄/可以指定分隔符),讀入空間中并默認以空白(TAB\space\\n)等分割成幾個字段,每個字段用$#表示$0表示整行本身“` awk [Option] ‘program’ file option -F:…

    Linux筆記 2018-05-20
  • shell腳本編程基礎——循環用法

    本節索引: 一、if、case條件判斷 二、for、while及until循環 三、循環控制語句continue、break、shift及select菜單 四、信號捕捉trap   在前面的基礎編程內容中,我們已經學習了shell腳本的順序執行及選擇執行,通過這兩種方式,可 以幫我們解決一些簡單需求,但要想在更復雜的場景中使用的話,就需要掌握循環執…

    2018-05-10
  • sed練習題答案

    答案不唯一有更好答案請留言

    2018-04-13
欧美性久久久久