1. 程式人生 > 實用技巧 >Linux自學筆記——iptables

Linux自學筆記——iptables


iptables:包過濾型的防火牆

Firewall:防火牆,隔離工具;工作於主機或網路邊緣,對於進出本主機或本網路的報文根據事先定義的檢查規則作匹配檢測,對於能夠被規則匹配到的報文做出相應處理的元件;

主機防火牆

網路防火牆

軟體防火牆(軟體邏輯)

硬體防火牆(硬體和軟體邏輯)

ipfw(firewall framework)

ipchains(firewall framework)

iptables(netfilter)

netfilter:kernel

iptables:rules until

hook function

input

output

forward

prerouting

postrouting

鏈(內建):

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

功能:

filter:過濾,防火牆;

nat:network address translation;用於修改源ip或者目標ip,也可以改埠;

mangle:拆解報文,做出修改,並重新封裝起來;

raw:關閉nat表上啟用的連線追蹤機制;

功能<-> 鏈

raw:PREROUTING, OUTPUT

mangle:PREROUTING , INPUT , FORWARD,OUTPUT ,POSTROUTING

nat:PREROUTING, [INPUT], OUTPUT, POSTROUTING

filter:INPUT , FORWARD , OUTPUT

報文流向:

流入本機:PREROUTING à INPUT

由本機流出:OUTPUT à POSTROUTING

轉發:PREROUTING à FORWARD à POSTROUTING

路由功能發生時刻:

報文進入本機後;

判斷目標主機是?

報文離開主機前:

判斷由哪個介面送往下一站?

Iptables/netfileter

規則:

組成部分:根據規則匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動作;

匹配條件:

基本匹配條件

擴充套件匹配條件

處理動作:

基本處理動作

擴充套件處理動作

自定義處理機制

iptables的鏈:內建鏈和自定義鏈

內建鏈:對應於hook function

自定義連結:用於內建鏈的擴充套件和補充,可實現更靈活的規則管理機制;

新增規則時的考量點:

1) 要實現哪種功能:判斷新增到哪個表上;

2) 報文流經的路徑:判斷新增到哪個鏈上;

鏈:鏈上的規則次序,即為檢查的次序;因此,隱含一定的應用法則;

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

2) 不同類的規則(訪問不同應用),匹配範圍小的放上面;

3) 將那些可由一條規則描述的多個規則合併起來;

4) 設定預設策略;

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

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

rule-specification = [matches…] [target]

match = -m matchname [per-match-options]

target =-j targetname [per-target-options]

規則格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]

-t table :

raw,mangle,nat ,[filter]

COMMAND

鏈管理:

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

1.png

-X:delete,刪除自定義的規則鏈;

2.png

-P:Policy,設定預設策略;對filter表中的鏈而言,其預設策略有:

ACCEPT:接受;

DROP:丟棄

REJECT:拒絕

3.png

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

規則管理:

為了掩飾方便我們設預設策略為DROP;

4.png

-A:append,追加;

5.png

-I:insert,插入,要指明位置,省略時表示第一條;

6.png

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

7.png

-D:delete,刪除:

1) 指明規則序號;

2) 指明規則本身;

8.png

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

9.png

-Z:zero,置零;

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

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

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

檢視:

-L:list,列出指定鏈上的所有規則;

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

10.png

-v:verbose,詳細資訊;

-vv,-vvv

11.png

-x:exactly,顯示計數器結果的精確值;

--line-numbers:顯示規則的序號;

chain

PREROUTING , INPUT , FORWARD , OUTPUT , POSTROUTING

匹配條件:

基本匹配條件:無需載入任何模組,由iptables/netfilter

[!] –s,--source address[/mask][,…]:檢查報文中的源ip地址是否符合此處指定的地址或範圍;

[!] –d ,--destination address [/mask][,…]:檢查報文中的目標地址是否符合此處指定的地址或範圍;

[!] –p,--protocol PROTOCOL

PROTOCOL:tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or “all”

{tcp|udp|icmp}

[!] – i,--in-interface name:資料報文流入的介面:只能應用於資料報文流入的環節,只能應用於PREROUTING,INPUT和FORWARD鏈;

[!] – 0,--out-interface name:資料報文流出的介面;只能應用於資料報文流出的環節,智慧應用於FORWARD,OUTPUT和POSTROUTING鏈;

擴充套件匹配條件:需要載入擴充套件模組,方可生效;

隱式擴充套件:不需要手動載入擴充套件模組;因為他們是對協議的擴充套件,所以,但凡使用-p指明瞭協議,就表示已經指明瞭要擴充套件的模組;

tcp

[!] --source-port, --sport port[:port]:匹配報文的源埠;可以是埠範圍

[!] --destination-port,--dport port[:port]:匹配報文的目標埠;可以是埠範圍;

[!] --tcp-flages mask comp

mask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST

comp is a comma-separated list of flags which must be set,例如SYN

例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標誌位為SYN,ACK,FIN,RST四個,其中SYN必須為1,餘下的必須為0;

[!] --syn:用於匹配第一次握手,相當於“--tcp-flags SYN,ACK,FIN,RST SYN”

udp

[!] --source-port , --sport port[:port]:匹配報文的源埠;可以是埠範圍;

icmp

[!] --icmp-type {type[/code]|typename}

echo-request:8

echo-reply:0

顯示擴充套件:必須要手動載入擴充套件模組,[-m matchname [per-match-options]];

處理動作:

-j targetname [per-target-options]

ACCEPT

DROP

REJECT

RETURN:返回呼叫鏈;

REDIRECT:埠重定向;

LOG:記錄日誌;

MARK:做防火牆標記;

DNAT:目標地址轉換;

SNAT:源地址轉換;

MASQUERADE:地址偽裝;

自定義鏈;

防火牆(服務):

Centos6:

service iptables {start|stop|restart|status}

start:讀取實現儲存的規則,並應用到netfilter上;

stop:清空netfilter上的規則,以及還原預設策略等;

status:顯示生效的規則;

restart:清空netfilter上的規則,再讀取事先儲存的規則,並應用到netfilter上;

預設的規則檔案:/etc/sysconfig/iptables

12.png

Centos7:

systemctl start|stop|restart|status firewalld.service

systemctl disable firewalld.service 設定iptables開機不自啟;

systemctl stop firewalld.service

iptables(2)

顯示擴充套件:必須顯示地指明使用的擴充套件模組進行的擴充套件;

使用幫助:

Centos6:man iptables

Centos7:man iptables-extensions

1. multiport擴充套件;

以離散方式定義多埠匹配;最多指定5個埠;

[!] --source-ports,--sports port[,port|,port:port]…:指定多個源埠;

[!] --destination-ports,--dports port[,port|,port:port]…多個目標埠;

[!] --ports port[,port|,port:port]…多個埠;

13.png

2. iprange擴充套件

指明連續的(但一般不包整個網路)ip地址範圍;

[!] --src-range from[-to]:源ip地址;

[!] --dst-range from[-to]:目標ip地址;

14.png

3. string擴充套件

對報文中的應用層資料做字串模式匹配檢測;

--algo {bm|kmp}:字串匹配檢測演算法;

bm:Boyer-Moore

kmp:Knuth-Pratt-Morris

[!] --string pattern:要檢測的字串模式;

[!] --hex-string pattern:腰間的字串模式,16進位制格式;

15.png

4. time擴充套件

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

--datastart YYYY[-MM[--DD[Thh[:mm[:ss]]]]]

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

[!] --monthdays day[,day...]

[!] --weekdays day[,day...]

--kerneltz:使用核心上的時區,而非預設的UTC;

16.png

5. connlimit擴充套件;

根據每客戶端IP做併發連線數數量匹配;

--connlimit-upto n :連線數量小於或等於n時匹配;

--connlimit-above n:連線的數量大於n時匹配;

17.png

6. limit擴充套件;

基於收發報文的速率做匹配;

令牌通過過濾器;

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

--limit-burst number

18.png

7. state擴充套件

根據“連線追蹤機制”去檢查連線的狀態;

Conntrack機制:追蹤本機上的請求和響應之間的關係;狀態有如下幾種;

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

ESTABLISHED:NEW狀態之後,連線追蹤模板中為其建立的條目失效之前期間內所進行的通訊狀態;

RELATED:相關聯的連線;如ftp協議中的資料連線與命令連線之間的關係;

INVALID:無效的連線;

UNTRACKED:未進行追蹤的連線;

[!] --state state

19.png

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

/proc/sys/net/nf_contrack_max

20.png

已經追蹤到的並記錄下的連線;

/proc/net/nf_conntrack

21.png

不同的協議的連線追蹤時長;

/proc/sys/net/netfilter/

22.png

Note:iptables的連線跟蹤表最大容量為/proc/sys/net/ipv4/ip_conntrack_max,連結碰到各種狀態的超時後就會從表中刪除;當模板滿載時,後續的連線可能會超時;

解決方法一般有兩個:

1) 加大nf_conntrack_max的值

vim /etc/sysctl.conf

net.ipv4.nf_conntrack_max = 393216

net.ipv4.netfilter.nf_conntrack_max = 393216

2) 降低nf_conntrack timeout時間;

vim /etc/sysctl.conf

net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300

net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120

net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60

net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

問題:如何開放被動模式的ftp服務?(server地址為192.168.19.130)

1) 裝載ftp連線追蹤的專用模組;

~]# modproble nf_conntrack_ftp

2) 放行命令連線

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

~]# iptables -A OUTPUT -s 192.168.19.130 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

3) 放行資料連線;

~]# iptables -A INPUT -d 192.168.19.130 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

~]# iptables -I OUTPUT -s 192.168.19.130 -m state --state ESTABLISHED -j ACCEPT

規則優化:

伺服器端規則設定:任何不允許的訪問,應該在請求到達時給予拒絕;

1) 可安全放行所有入棧的狀態為ESTABLISHED的狀態的連線;

2) 可安全放行所有出站狀態為ESTABLISHED狀態的連線;

3) 謹慎放行入棧的心情求;

4) 有特殊目的限制訪問功能,要於放行規則之前加以拒絕;

如何使用自定義鏈:

自定義鏈:需要被呼叫才能生效;自定義鏈最後需要定義返回規則;

返回規則使用的target叫做RETURN

規則的有效期限:

使用iptables命令定義的規則,手動刪除之前,其生效期限為kernel存活期限;

儲存規則:

儲存規則至指定的檔案中:

Centos6

service iptables save:將規則儲存至/etc/sysconfig/iptables檔案中;

iptables-save > /path/ro/some_rules_file:將規則儲存指定的檔案中;

centos7

iptables-save > /path/to/some_rules_file

重新載入預存規則檔案中的規則:

iptables-restore < /path/from/some_rules_file

Centos6

Service iptables restart

自動生效規則檔案中的規則;

1) 用指令碼儲存各iptables命令:讓此指令碼開機後自動執行;

/etc/rc.d/rc.local檔案新增指令碼路徑;

/path/to/some_script_file

2) 用規則檔案儲存各規則,開機時自動載入此規則檔案中的規則;

/etc/rc.d/rc.local檔案新增;

Iptables-restore < /path/from/iptables_rules_file

CentOS 7

引入了新的iptables前端管理工具firewalld,其管理工個有:firewalld-cmd, firewalld-config

網路防火牆:

netfilter在INPUT和OUTPUT鏈上表現其作為主機防火牆的角色,而其在FORWARD鏈上則表現是作為網路防火牆的角色;

下面通過例項演示網路防火牆:

centos7主機有兩塊網絡卡,並且這兩塊網絡卡的地址位於不同的網路中,地址分別為192.168.19.130和172.16.23.1;centos6test作為伺服器,地址為172.16.23.2;centos6作為客戶端,地址為192.168.19.134;

23.png

要求:通過centos7主機扮演網路防火牆,在FORWARD鏈上生成過濾規則,規則要求如下;

1) 放行客戶端對伺服器端的ftp服務的訪問;

2) 放行客戶端對伺服器端的遠端連線ssh服務;

3) 放行客戶端對伺服器端的web服務的訪問;

4) 放行客戶端對伺服器端的ping操作;

Centos7主機上;

1. 開啟轉發功能;

24.png

2. 設定ip地址為如下地址;

25.png

3. 清空規則鏈,新建規則;

26.png

Centos6test主機上:

1. 設定其ip地址為如下地址;

27.png

2. 設定路由指向centos7主機;

28.png

Centos6主機上:

1. 設定ip地址為如下;

29.png

2. 刪除原有的路由,設定新的路由指向centos7主機;

30.png

iptables(3)之nat

netfilter:nat table

nat:network address translation

snat:source nat

dnat:destination nat

pnat:port nat

snat:POSTROUTING , OUTPUT

讓本地網路中的主機用過某一特定地地址訪問外部網路時,

dnat:PREROUTING

把本地網路中的某一主機上的某服務開放給外部網路中的使用者訪問時,

nat表的target

SNAT

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

DNAT

--to-destination [ipaddr[-ipaddr]][:port[-port]]

MASQUERADE

--to-ports port[-port]

--random

SNAT示例:

1. 在上面的網路防火牆示例中,用centos6主機訪問centos6test主機的web服務並做ping操作;

31.png

2. 在centos6test主機上使用tcpdump命令抓包,並且檢視httpd的訪問日誌,可以發現地址都是192.168.19.134;

32.png

3. 在網路防火牆centos7主機上新增net規則;

33.png

4. 再一次重複第1步,第2步操作,測試,發現抓包的地址和日誌檔案中地址都變成了192.168.115.32;

34.png

DNAT示例:

1. 新增規則;

35.png

2. 在centos6主機上再次訪問centos6test的web服務,發現訪問的是centos7主機的web,這裡的目的地址發現了轉換;

36.png

3. 當然也可以在轉換目的地址的同時轉換埠;

37.png

MASQUERADE示例:地址偽裝

1. 新增規則;

38.png

2. 在centos6主機上對centos6test作ping操作;

39.png

3. 在centos6test主機抓包測試;

40.png

REDIRECT:埠重定向;

Web:8080

80 —> 8080

1. 將centos6test主機的httpd服務監聽埠改為8080;

41.png

2. 在centos6test主機上新增規則;

42.png

3. 此時通過centos6主機訪問centos6test主機的httpd服務;

43.png

Note:必須要加埠訪問,訪問80埠,自動重定向為8080埠;

補充:利用iptables的recent模組來抵禦DOS***: 22,建立一個列表,儲存有所有訪問過指定的服務的客戶端IP

以ssh( 遠端連線)為例:

1. 利用connlimit模組將單IP的併發設定為3;會誤殺使用NAT上網的使用者,可以根據實際情況增大該值;

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

2. 利用recent和state模組限制單IP在300s內只能與本機建立2個新連線。被限制五分鐘後即可恢復訪問。

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

下面對最後兩句做一個說明:

1.第二句是記錄訪問tcp 22埠的新連線,記錄名稱為SSH

--set 記錄資料包的來源IP,如果IP已經存在將更新已經存在的條目

2.第三句是指SSH記錄中的IP,300s內發起超過3次連線則拒絕此IP的連線。

--update 是指每次建立連線都更新列表;

--seconds必須與--rcheck或者--update同時使用

--hitcount必須與--rcheck或者--update同時使用

3.iptables的記錄:/proc/net/xt_recent/SSH

也可以使用下面的這句記錄日誌:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"


轉載於:https://blog.51cto.com/claude666/2055842