本節索引:
一、防火墻介紹
二、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
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