1. 程式人生 > >從零開始認識iptables

從零開始認識iptables

防火墻 iptables

寫在前面


Linux運維工作中,在涉及Linux安全時,我們第一時間想到的一般都是iptables這個工具。作為一個linux初學者來講,在剛學習linux的過程中,有些實驗總是總不成功。這時我們總會檢查防火墻是否關閉,selinux是否關閉。在深入學習iptbales之後,這些以前知其然,不知其所以然的操作在內心就很敞亮了。想深入學習一個東西,總要問一下what is it?

本節學習目標

  • 防火墻分類

  • Netfilter防火墻工作原理

  • iptables四表五鏈

  • iptables規則設定要點

  • iptables工具使用方法(熟練使用,包括主機防火墻配置,網絡防火墻配置,以及nat配置)

什麽是防火墻?


防火墻是一種隔離工具。工作於主機或者網絡的邊緣,對於進出本主機或者本地網絡的報文根據事先定義好的規則做匹配檢測,對於能夠被規則所匹配到的報文做出相應處理

(允許,拒絕,丟棄等)。根據其管理的範圍來分可以將其劃分為主機防火墻和網絡防火墻。根據其工作機制來區分又可分為包過濾型防火墻(netfilter)和代理服務器(Proxy)。有些人把tcp_warrpers也劃分為防火墻的一種。這種是根據服務程序軟件的名稱來控制數據包的方法。

防火墻工作原理


包過濾防火墻Netfilterlinux內核所支持的一個功能模塊框架。Iptables是配置管理Netfilter的一個軟件工具。所以Netfilter是工作與內核空間的。Netfilter是內核中一系列的鉤子(hook),為內核模塊在網絡協議棧中的不同位置註冊回調函數(callback)。在數據包經過網絡協議棧中的不同位置時做相應的處理。


Netfilter中的五個鉤子NF_IP_PRE_ROUTINGNF_IP_LOCAL_INNF_IP_FORWARDNF_IP_POST_ROUTINGNF_IP_LOCAL_OUT。。其中網絡數據包的流向圖如下圖所示

技術分享

1網絡數據包從網卡進來之後進入內核空間的TCP/IP協議棧進行層層解封裝;

2 在數據包剛剛進入網絡層的數據包通過NF_IP_PRE_FORWARD,在此店之後要進行一次路由選擇,當目標地址為本機地址時,數據進入NF_IP_LOCAL_IN,非本地的目標地址進入NF_IP_FORWARD,所以目標地址轉換通常在此點進行;

3 NF_IP_LOCAL_IN:經過路由之後送往本地的數據包經過此點,所以過濾INPUT包在此點進行。

4 NF_IP_FORWARD:經過路由選擇之後要轉發的數據包經過此點,所以網絡防火墻通常在此點配置。

5 NF_IP_LOCAL_OUT:由本地用戶空間應用進程產生的數據包過此檢測點,所以OUTPUT包過濾在此點進行。

6 NF_IP_POST_ROUTING:剛剛通過NF_IP_FORWARDNF_IP_LOCAL_OUT檢測點的數據包要通過一次路由選擇由哪個接口送往網絡中,經過路由之後的數據包要通過NF_IP_POST_ROUTING此檢測點,所以,源地址轉換通常在此點進行。

iptables的四表五鏈

iptables是工作在用戶空間的一個管理netfilter的工具,該工具默認有五條鏈(chain, REROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING分別由netfilter的五個鉤子函數來觸發。Iptables設有四張表,用以實現Netfilter的不同功能。

filter表:iptables中使用最廣泛的表,作用是進行包過濾,由此表來決定該數據包是否繼續向它的目標地址前進。

Nat表:又此表的名稱可以看出,該表用於網絡地址轉換用的,這也就是防火墻的另外一個功能,對源地址或者目標地址的修改。

mangle表:mangle表用於對ip報文的首部信息進行修改。

raw表:raw表的功能是為防火墻提供一種禁用連接狀態追蹤的機制,在大流量對外業務的服務器上使用這個表可以有效的避免連接追蹤帶來的性能問題,比如遊戲服務器通常通過此表或者重新編譯內核的方式禁用防火墻的連接追蹤機制。

除此之外,在iptable的幫助文檔中提到還有一張security表,用於在數據包總加入selinux特性功能,該表很少用到,這裏不再詳述。

Iptables的四張表有著不同的處理優先級,raw-->mangle-->nat -->filter,從左至右優先級依次降低。由於數據包進入協議棧中的鉤子的位置不同以及表的優先級順序不同,所以防火墻對於數據包的處理順序特別容易混淆,這裏引用一張胥峰前輩的處理順序圖(由於該圖顯示不清晰,可到附件下載):

技術分享

iptables規則

想要配置一個較為安全的防火墻策略就需要了解其規則的組成以及設置規則時所需要思考的要點。

規則組成:報文的匹配條件,匹配到之後的處理動作

匹配條件:根據協議報文特征指定匹配條件,基本匹配條件和擴展匹配條件

處理動作:內建處理機制由iptables自身提供的一些處理動作

自定義處理機制:可自定義鏈來對匹配到的報文做處理。

註意報文不會經過自定義鏈,只能在內置鏈上通過規則進行引用後生效,也就是所自定義鏈為規則的一個處理動作的集合。

設置iptables規則時需要考量的要點:

1、根據要實現哪種功能,判斷添加在那張表上;

2、根據報文流經的路徑,判斷添加在那個鏈上

流入:PREROUTING--->INPUT

流出:OUTPUT--->POSTROUTING

轉發:PREROUTING---->FORWARD--->POSTROUTING

鏈上其規則的次序,即為檢查的次序,排列好檢查次序能有效的提高性能,因此隱含一定的法則

1、同類規則(訪問同一應用),匹配範圍小的放上面

2、不同類規則(訪問不同應用),匹配到報文頻率大的放上面:

3、將那些可由一條規則描述的多個規則合並為一個

4、設置默認策略


遠程連接主機配置防火墻時註意要點:

1,不要把鏈的默認策略修改為拒絕。因為有可能配置失敗或者清除所有策略後無法遠程到服務器。盡量使用規則條目配置默認策略

2,為防止配置失誤策略把自己也拒掉,可在配置策略時設置計劃任務定時清除策略。當確定無誤後,關閉該計劃任務。


磨刀不誤砍柴工,當以上的東西在腦海中已經有一個框架之後,再學習iptables規則管理工具才會得心應手。

iptables工具使用方法

Man文檔是學習工具的最好方法。這裏不再詳述,下面把我的學習筆記粘貼出來,以供讀者參考如有錯誤敬請指正。

iptables命令:

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

ip6tables [-t table] {-A|-C|-D} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain target

iptables [-t table] -E old-chain-name new-chain-name

iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET

-t table:

filter ,nat,mangle,raw 默認為filter

鏈管理:

-F flush,清空規則鏈:省略鏈表示清空指定表上的所有的鏈

-Nnew,創建新的自定義規則鏈:

-Xdrop,刪除用戶自定義的空的規則鏈:

-Zzero,清零,置零規則計數器

-Ppolicy,為指定鏈設置默認策略,對filter表中的鏈而言,默認策略通常有ACCEPTDROPREJECT

-ErEname,重命名自定義鏈,引用計數不為0的自定義鏈,無法改名,也無法刪除

規則管理:

-Aappend,將新的規則追加與指定鏈的尾部

-Iinsert,將新規則插入至指定鏈的指定位置(需指定序號,默認為第一條):

-Ddelete,刪除指定鏈上的指定規則:

兩種指定方式:

1、指定匹配條件

2、指定規則編號

-Rreplace,替換指定鏈上的指定規則。

查看:

-Llist,列出指定鏈上的所有規則。

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

-v:verbose,顯示詳細信息

-vv,-vvv

--line-numbers:顯示規則編號

-xexectly,顯示計數器計數結果的精確值。

匹配條件:

基本匹配:

[!] -s, --src,--source IP|Netaddr:檢查報文中的源ip地址是否符合此處指定的地址範圍

[!] -d--dst,--destination IP|Netaddr:檢查報文中的目標ip地址是否符合此處指定的地址範圍

-p ,--protocal{tcp|udp|icmp}:檢查報文中的協議,即ip首部中的protocol所標識的協議,8bit6標識tcp.17表示udp

-i,--in-inteface IFACE :數據報文的流入接口。僅能用於PREROUTINGINPUTFORWARD

-o,--out-inteface :數據報文的流出接口。僅能用於FORWARDOUTPUTPOSTROUTING鏈上

擴展匹配:-m macth_name --spec_options

eq -m tcp --dport 22 表示使用tcp擴展的目標端口為22

隱式擴展:對-p protocal 指明的協議進行擴展,可省略-m選項:

-p tcp

--dport PORT[-PORT]:目標端口,可以是單個端口或者連續多個端口

--sport PORT[-PORT]

--tcp-flags list1 list2 :檢查list1所指明的所有標誌位,且這其中,list2所表示出的所有標記必須為1,而余下的必須為0,沒有list1中指明的,不做檢查。

SYNACKFINRSTPSHURG

eq:--tcp-flags SYNACKFINRST SYN

===== --syn: 檢查三次握手的第一次握手

-p udp

--dport

--sport

-p icmp

--icmp-type

可用數字表示其類型:

0 echo-reply

8 echo-request

顯示擴展:

目標:

-j target:jump至指定的target

ACCEPT:接收

DROP:丟棄

REJECT;拒絕

RETURN:返回調用鏈

REDIRECT:端口重定向

LOG:記錄日誌

MARK:做防火墻標記

DNAT:目標地址轉換

SNAT:源地址轉換

MASQUERADE:地址偽裝

...

自定義鏈:由自定義鏈上的規則進行匹配檢查。

顯示擴展:必須顯示指明使用的擴展模塊(rpm -ql iptables|grep "\.so"

centos6 man iptables

centos7 man iptbales-extensions

1multiport擴展

以離散方式定義多端口匹配:最多匹配15個端口

[!] --source-ports,--sports port[,port|,port:port]... 指明多個源端口

[!] --destination-ports,--dports port[,port|,port:port]... 指明多個離散的目標端口

[!] --ports port[,port|,port:port]...

例子: # iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT

# iptables -A OUTPUT -p tcp -m multiport --sports 22,80 -j ACCEPT

2iprange擴展

指明連續的(但一般不能擴展為整個網絡)ip地址範圍

[!] --src-range from[-to] 匹配指明連續的源IP地址範圍

[!] --dst-range from[-to] 指明連續的目標IP地址範圍

# iptables -A INPUT -m iprange --src-range 172.18.11.0-172.18.11.100 -j DROP

# iptables -A INPUT -p tcp -m multiport --dports 22,80 -m iprange --src-range 172.18.11.0-172.18.11.100 -j DROP

3string擴展

檢查報文中出現的字符串:

--algo {bm|kmp}

[!] --string pattern

[!] --hex-string pattern 16進制

iptables -I OUTPUT -m string --algo bm --string "movle" -j DROP

4time擴展

根據報文到達的時間與指定的時間範圍進行匹配

--datestart

--datestop

--timestart

--timestop

--monthdays

--weekdays

# iptables -I INPUT -d 172.18.11.7 -p tcp --dport 80 -m time --timestart 8:00 --timestop 10:00 -j DROP

# 註意 centos7 使用的是UTC時間

5connlimit擴展

根據每客戶端ip(也可以是地址塊)做並發連接數數量匹配:

--connlimit-above n 連接數量大於n

--connlimit-upto n 連接數量小於等於n

# iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT

# ssh連接大於3後鏈接被拒絕

6limit擴展

基於收發報文速率做檢查:

令牌桶過濾器:

--limit rate[/second|/minute|/hour|/day]

--limit-burst number

# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 6/minute -j ACCEPT

# iptables -A INPUT -p icmp -j REJECT

##跳過5個包,然後沒10秒鐘一個回應一個ping

7state擴展

檢查連接追蹤機制檢查連接的狀態:

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

/proc/sys/net/nf_conntrack_max

已經追蹤到並記錄下的連接:

/proc/net/nf_conntrack

不同協議或者連接類型追蹤的時長

/proc/sys/net/netfilter/

可追蹤的連接狀態:

NEW:新發出的請求:連接追蹤模板中不存在此連接相關的信息條目,因此,將其識別為第一次發出的請求

ESTABLISHEDNEW狀態之後,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信的狀態。

RELATED:相關的連接:如ftp協議中的命令連接與數據連接之間的關系

INVALIED:無法識別的連接

--state state1 state2...

例子:

# iptables -I INPUT -d 172.18.11.7 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -I OUTPUT -s 172.18.11.7 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# 對新發起的httpssh訪問請求做控制,

# iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -s 172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

如何開放被動模式的FTP服務?

(1) 裝載ftp追蹤時專用的模塊

#modprobe nf_conntrack_ftp

路徑 /lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilternf_conntrack_ftp.ko

模塊信息 modinfo nf_conntrack_ftp.ko

(2) 放行請求報文:

命令連接:NEWESTABLISHED

數據連接:RELATED,ESTABLISHED

#iptables -A INPUT -d localIP -p tcp -dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A INPUT -d localIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

(3) 放行響應報文

ESTABLISHED

#iptables -A OUTPUT -d localIP -p tcp -m state --state ESTABLISHED -j ACCEPT

如何保存及重載規則:

保存規則至指定文件:

iptables-save > /path/to/somefile

從指定文件重載規則:

iptables-restore < /path/from/somefile

centos6:

service iptables save

iptable-save >/etc/sysconfig/iptables

service iptables restart

iptables-restore < /etc/sysconfig/iptables

網絡防火墻

核心轉發配置:/proc/sys/net/ipv4/ip_forward

/etc/sysctl.conf

net.ipv4.ip_forward=1

nat:

SNAT:只修改請求報文的源地址

DNAT:只修改請求報文的目標地址

nat表:

PREROUTING: DNAT

OUTPUT

POSTROUTING: SNAT

源地址轉換

iptables -t nat -A POSTROUTING -s local_net ! -d local_net -j SNAT --to-source public_ip 公網ip固定

iptables -t nat -A POSTROUTING -s local_net ! -d local_net -j MASQUERADE 公網ip不固定

目標地址轉換 iptables -t nat -A POSTROUTING -d public_ip -p tcp|udp --dport PORT -j DNAT --to-destination local_ip:port


本文出自 “Keep simple keep stupid” 博客,請務必保留此出處http://yangzhiheng.blog.51cto.com/11586378/1976723

從零開始認識iptables