網路工程師必備:拆解iptables四表五鏈底層架構與防禦實戰

軟體防火牆

Linux提供的軟體防火牆,名為iptables,它可以理解為是一個客戶端代理,透過iptables的代理,將使用者配置的安全策略執行到對應的安全框架中,這個安全框架稱之為netfilter
iptables是一個命令列的工具,位於使用者空間,我們用這個工具操作真正的框架,也就是netfilter
真正實現流量過濾的防火牆框架是netfilter,位於核心空間,它倆共同組成了Linux的軟體防火牆,一般用來代替昂貴的硬體防火牆,實現資料包過濾,網路地址轉換等。
在Centos7發行版本下,firewalld防火牆又取代了iptables防火牆

iptables是將配置好的規則交給核心層的netfilter網路過濾器來處理

filrewalld服務是將配置好的防火牆規則交給核心層的nftables網路過濾器處理

這倆工具二選一即可,都只是命令列工具,

iptables是什麼

iptables是開源的基於資料包過濾的防火牆工具。

Iptables使用場景

1

、主機防火牆(

filter

表的

INPUT

鏈)。

2

、區域網共享上網(nat表的POSTROUTING鏈)。半個路由器,NAT功能。

3

、埠及IP對映(nat表的PREROUTING鏈),硬防的NAT功能。

4

、IP一對一對映。

netfilter 中五個勾子函式和報文流向

Netfilter在核心中選取五個位置放了五個

hook

(勾子)

function

(INPUT、OUTPUT、FORWARD、

PREROUTING、POSTROUTING),而這五個hook function向用戶開放,使用者可以透過一個命令工具

(iptables)向其寫入規則

由資訊過濾表(

table

)組成,包含控制IP包處理的規則集(rules),規則被分組放在鏈(chain)上

三種報文流向
1

)流入本機:PREROUTING--> INPUT --> 使用者空間程序

2

)流出本機:使用者空間程序--> OUTPUT --> POSTROUTING

3

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

iptables組成
五表五鏈以及一些規則組成

鏈chain:

1

)內建鏈:每個內建鏈對應於一個鉤子函式

2

)自定義鏈:用於對內建鏈進行擴充套件或補充,可實現更靈活的規則組織管理機制;只有HOOK鉤子呼叫自定義鏈時,才生效
五個內建鏈chain

INPUT

,OUTPUT,FORWARD,PREROUTING,POSTROUTING
五個表

table

filter

,nat,mangle,raw,security

1

filter

:過濾規則表,根據預定義的規則過濾符號條件的資料包,預設表

2

)nat:network

address

translation地址轉換規則表

3

)mangle:修改資料標記位規則表

4

)raw:關閉啟用的連線跟蹤機制,加快封包穿越防火牆速度

5

)security:用於強制訪問控制(MAC)網路規則,由Linux安全模組(如SELINUX)實現

它們的優先順序由高到低的順序為:

security---> raw---> mangle---> nat---> filter

核心中資料包的傳輸過程
1

)當一個數據包進入網絡卡時,資料包首先進入PREROUTING鏈,核心根據資料包目的IP判斷是否需要轉送出去

2

)如果資料包是進入本機的,資料包就會沿著圖向下移動,到達

INPUT

鏈。資料包到達

INPUT

鏈後,任何程序都會收到它。本機上執行的程式可以傳送資料包,這些資料包經過OUTPUT鏈,然後到達POSTROUTING鏈輸出

3

)如果資料包是要轉發出去的,且核心允許轉發,資料包就會向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出

範例,檢視預設的表

[root@localhost ~]

# iptables -vnL

Chain INPUT (policy ACCEPT

0

packets,

0

bytes)

pkts

bytes

target prot opt in out source destination
Chain FORWARD (policy ACCEPT

0

packets,

0

bytes)

pkts

bytes

target prot opt in out source destination
Chain OUTPUT (policy ACCEPT

0

packets,

0

bytes)

pkts

bytes

target prot opt in out source destination

[root@localhost ~]

# iptables -vnL -t filter

Chain INPUT (policy ACCEPT

24

packets,

1600

bytes)

pkts

bytes

target prot opt in out source destination
Chain FORWARD (policy ACCEPT

0

packets,

0

bytes)

pkts

bytes

target prot opt in out source destination
Chain OUTPUT (policy ACCEPT

14

packets,

1784

bytes)

pkts

bytes

target prot opt in out source destination

iptables規則新增時考量點

1)要實現哪種功能:判斷新增在哪張表上

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

3)報文的流向:判斷源和目的

4)匹配規則:業務需要

iptables常見的處理動作:
1

)內建處理動作:ACCEPT,

DROP

,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...;其中最常用的只有,允許:ACCEPT,拋棄:

DROP

,拒絕:REJECT

2

)自定義處理動作:自定義chain,利用分類管理複雜情形;規則要新增在鏈上,才生效;新增在自定義鏈上不會自動生效。

3

)白名單:只有指定的特定主機可以訪問,其它全拒絕

4

)黑名單:只有指定的特定主機拒絕訪問,其它全允許,預設方式

因為CentOS7,8都是Firewalls防火牆,所以需要關閉才能更好的使用iptables我們定義的防火牆規則

[

root@localhost ~

]

# systemctl disable --now firewalld

iptables 用法說明

幫助:man 8 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命令格式詳解:

iptables [

-

t

table

] SUBCOMMAND chain [

-

m matchname [

per-match-

options]]

-

j targetname [

per-

target

-

options]

1、-t table:指定表
raw, mangle, nat, [filter]預設
2、SUBCOMMAND:子命令
鏈管理類:
-N:new, 自定義一條新的規則鏈
-E:重新命名自定義鏈;引用計數不為0的自定義鏈不能夠被重新命名,也不能被刪除
-X:delete,刪除自定義的空的規則鏈
-P:Policy,設定預設策略;對filter表中的鏈而言,其預設策略有:ACCEPT:接受, DROP:丟棄

檢視類:

-L:list,列出指定鏈上的所有規則,本選項需置後
-n:numberic,以數字格式顯示地址和埠號
-v:verbose,詳細資訊
-vv:更詳細
-x:exactly,顯示計數器結果的精確值,而非單位轉換後的易讀值
--line-numbers:顯示規則的序號
-S selected,以iptables-save命令格式顯示鏈上規則

規則管理類:

-A:append,追加
-I:insert,插入,要指明插入至的規則編號,預設為第一條
-D:delete,刪除

1)指明規則序號

2)指明規則本身

-R:replace,替換指定鏈上的指定規則編號
-F:flush,清空指定的規則鏈
-Z:zero,置零

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

1)匹配到的報文的個數

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

範例:

[

root@localhost ~

]

# iptables -F OUTPUT

常用組合

-vnL
-vvnxL --line-numbers
範例

[root

@localhost~

]# iptables

-

vnL

Chain INPUT (policy ACCEPT

177

packets,

12622

bytes)

pkts bytes target prot opt

inout

source destination
Chain FORWARD (policy ACCEPT

0

packets,

0

bytes)

pkts bytes target prot opt

inout

source destination
Chain OUTPUT (policy ACCEPT

106

packets,

9596

bytes)

pkts bytes target prot opt

inout

source destination
[root

@localhost~

]# iptables

-

vnL

--line-numbers

Chain INPUT (policy ACCEPT

1606

packets,

3268

K bytes)

num pkts bytes target prot opt

inout

source destination

1221824

ACCEPT

all-- lo * 0.0.0.0/0 0.0.0.0/0
22120

REJECT

all-- * * 172.31.0.18 0.0.0.0/0 reject-with icmp-port-unreachable
3160

REJECT

all-- * * 172.31.0.7 0.0.0.0/0 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT

0

packets,

0

bytes)

num pkts bytes target prot opt

inout

source destination

Chain OUTPUT (policy ACCEPT

1338

packets,

98490

bytes)

num pkts bytes target prot opt

inout

source destination

匹配條件
1

)基本:通用的,PARAMETERS

2

)擴充套件:需載入模組,

MATCH

EXTENTIONS

擴充套件動作:
REJECT

--reject-with:icmp-port-unreachable預設
RETURN

:返回呼叫鏈

REDIRECT:埠重定向

LOG:記錄日誌,dmesg

MARK:做防火牆標記

DNAT:目標地址轉換

SNAT:源地址轉換

MASQUERADE:地址偽裝

自定義鏈

iptables基本匹配條件
基本匹配條件:無需載入模組,由iptables/netfilter自行提供
[!]

-s,

--sourceaddress[/mask][,...]

:源IP地址或者不連續的IP地址

[!]

-d,

--destinationaddress[/mask][,...]

:目標IP地址或者不連續的IP地址

[!]

-

p

,

--protocol

protocol:指定協議,可使用數字如

0

all

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

參看:/etc/protocols

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

FORWARD、PREROUTING鏈

[!] -o, --out-interface name:報文流出的介面;只能應用於資料報文流出的環節,只應用於

FORWARD、OUTPUT、POSTROUTING鏈

範例:

準備好一個可以訪問的網站頁面

[root@localhost ~]

# yum install -y httpd;echo 172.31.0.17 > /var/www/html/index.html;systemctl start httpd

沒有新增iptables規則時其他機器可以訪問

[root@localhost ~]

# curl 172.31.0.17
172.31

.

0

.

17

iptables設定

[root@localhost ~]

# iptables -vnL

Chain INPUT (policy ACCEPT

365

packets,

25579

bytes)

pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT

0

packets,

0

bytes)

pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT

215

packets,

23508

bytes)

pkts bytes target prot opt in out source destination

[root@localhost ~]

# iptables -A INPUT -s 172.31.0.18,172.31.0.7 -j REJECT

[root@localhost ~]

# iptables -I INPUT -i lo -j ACCEPT

新增完iptables規則後,只有本機可以訪問,被規則限制的ip不能訪問

[root@localhost ~]

# curl 127.0.0.1
172.31

.

0

.

17

[root@localhost ~]

# curl 172.31.0.17

curl: (

7

) Failed

connect

to

172.31

.

0

.

17

:

80

; Connection refused
[root@sz-kx-centos8 ~]

# curl 172.31.0.17

curl: (

7

) Failed to

connect

to

172.31

.

0

.

17

port

80

: Connection refused

範例:新增某個固定ip並允許
[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.1

-j ACCEPT

範例:新增某個固定ip並丟棄
[root@localhost ~]

# iptables -

AINPUT1

-s

172.31

.

0.18

-j DROP

範例:新增整個網段並拒絕連線(謹慎使用
[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.0

/

16

-j REJECT

範例:在序號3插入

[root@localhost ~]# iptables -I INPUT

3

-s

172.31

.

0.100

-j ACCEPT

[root@localhost ~]# iptables -vnL

--line-numbers

Chain INPUT (policy ACCEPT

0

packets,

0

bytes)

num pkts bytes target prot opt

inout

source destination

1221824

ACCEPT

all-- lo * 0.0.0.0/0 0.0.0.0/0
240532145

ACCEPT

all-- * * 172.31.0.1 0.0.0.0/0
300

ACCEPT

all-- * * 172.31.0.100 0.0.0.0/0
42120REJECTall-- * * 172.31.0.18 0.0.0.0/0 reject-with icmp-port-unreachable
5160REJECTall-- * * 172.31.0.7 0.0.0.0/0 reject-with icmp-port-unreachable
6402473REJECTall-- * * 172.31.0.0/16 0.0.0.0/0 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT

0

packets,

0

bytes)

num pkts bytes target prot opt

inout

source destination

Chain OUTPUT (policy ACCEPT

51

packets,

5936

bytes)

num pkts bytes target prot opt

inout

source destination

範例:刪除序號3這條規則

[

root@localhost ~

]

# iptables -D INPUT 3

範例:替換序號4的規則把拒絕替換成允許

[

root@localhost ~

]

# iptables -R INPUT 4 -s 172.31.0.7 -j ACCEPT

範例:清空所有規則

[

root@localhost ~

]

# iptables -F

範例:iptables預設是黑名單,改成白名單
[root@localhost ~]

# iptables -

PINPUT

DROP

# 實現效果如下:

[root@localhost ~]

# iptables -vnL

Chain

INPUT

(policy ACCEPT

48

packets,

4965

bytes)

pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT

0

packets,

0

bytes)

pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT

40

packets,

5824

bytes)

pkts bytes target prot opt in out source destination

[root@localhost ~]

# iptables -

AINPUT

-

i

lo -j ACCEPT

[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.17

-j ACCEPT

[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.1

-j ACCEPT

[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.1

-j REJECT

[root@localhost ~]

# iptables -

PINPUT

DROP

[root@localhost ~]

# iptables -vnL

Chain

INPUT

(policy DROP

0

packets,

0

bytes)

pkts bytes target prot opt in out source destination

00

ACCEPT

all

-- lo *

0.0

.

0.0

/

00.0

.

0.0

/

0
00

ACCEPT

all

-- * *

172.31

.

0.170.0

.

0.0

/

0
1036840

ACCEPT

all

-- * *

172.31

.

0.10.0

.

0.0

/

0
00

REJECT

all

-- * *

172.31

.

0.10.0

.

0.0

/

0

reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT

0

packets,

0

bytes)

pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT

21

packets,

2152

bytes)

pkts bytes target prot opt in out source destination

規則最佳化最佳實踐

1.

安全放行所有入站和出站的狀態為ESTABLISHED狀態連線,建議放在第一條,效率更高

2.

謹慎放行入站的新請求

3.

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

4.

同類規則(訪問同一應用,比如:http ),匹配範圍小的放在前面,用於特殊處理

5.

不同類的規則(訪問不同應用,一個是http,另一個是mysql ),匹配範圍大的放在前面,效率更

6.

應該將那些可由一條規則能夠描述的多個規則合併為一條,減少規則數量,提高檢查效率

7.

設定預設策略,建議白名單(只放行特定連線)

iptables -P,不建議,容易出現“自殺現象”

規則的最後定義規則做為預設策略,推薦使用,放在最後一條

iptables儲存規則

以上命令都是臨時生效,持久儲存規則需要如下操作:
方法一:
# 儲存規則

[root@localhost ~]

# iptables-save > /home/iptables.ruls

# 執行匯入儲存的規則

[root@localhost ~]

# iptables-restore < /home/iptables.ruls

寫入開機啟動配置

[root@localhost ~]

# vim /etc/rc.d/rc.local

iptables-restore <

/home/ip

tables.ruls

# 加執行許可權

[root@localhost ~]

# chmod +x /etc/rc.d/rc.local

方法二:(CentOS7,8)
# 安裝

[

root@localhost ~

]

# yum install iptables-services

新增到配置檔案裡面

[

root@localhost ~

]

# iptables-save > /etc/sysconfig/iptables

啟動

[

root@localhost ~

]

# systemctl start iptables

設定開機啟動

[

root@localhost ~

]

# systemctl enable --now iptables

擴充套件模組的使用幫助:

CentOS

7

,

8

:

man

iptables

-extensions

CentOS

6

:

man

iptables

iptables 在使用-p選項指明瞭特定的協議時,無需再用-m選項指明擴充套件模組的擴充套件機制,不需要手動加

載擴充套件模組

tcp 協議的擴充套件選項

[!]--source-port

,

--sport

port

[:port]

:匹配報文源埠,可為埠連續範圍

[!]--destination-port

,

--dport

port

[:port]

:匹配報文目標埠,可為連續範圍

[!]--tcp-flagsmask

comp

mask

需檢查的標誌位列表,用,分隔 , 例如 SYN,ACK,FIN,RST

comp 在

mask

列表中必須為

1

的標誌位列表,無指定則必須為

0

,用,分隔tcp協議的擴充套件選項

範例:
--tcp-flags

SYN,ACK,FIN,RST SYN 表示要檢查的標誌位為SYN,ACK,FIN,RST四個,其中SYN必

須為

1

,餘下的必須為

0

,第一次握手

--tcp-flags

SYN,ACK,FIN,RST SYN,ACK 第二次握手

#錯誤包

--tcp-flagsALLALL
--tcp_flagsALLNONE

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

udp 協議的擴充套件選項

[!]--source-port

,

--sport

port

[:port]

:匹配報文的源埠或埠範圍

[!]--destination-port

,

--dport

port

[:port]

:匹配報文的目標埠或埠範圍

icmp 協議的擴充套件選項

[!] --icmp-

type

{

type

[/code]|typename}

type

/code

0

/

0echo

-reply icmp應答

8

/

0echo

-request icmp請求

範例:限制某個固定IP不能ssh埠遠端連線,21:23是區間
[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.7

-

p

tcp

--dport21

:

23

-j REJECT

範例:限制某個固定IP,icmp請求就拒絕
[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.7

-

p

icmp

--icmp-type8

-j REJECT

隱式擴充套件

# 在序號

3

插入一條允許固定ip訪問

80

[root@localhost ~]

# iptables -

IINPUT3

-s

172.31

.

0.7

-

p

tcp

--dport80

-j ACCEPT

範例:實現了本機能ping通某個ip,但是對方不能ping通本機
[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.18

-

p

icmp

--icmp-type8

-j REJECT

multiport擴充套件

以離散方式定義多埠匹配,最多指定15個埠

#指定多個源埠

[!]--source-ports

,

--sports

port

[,port|,port:port]

...

# 指定多個目標埠

[!]--destination-ports

,

--dports

port

[,port|,port:port]

...

#多個源或目標端

[!]--ports

port

[,port|,port:port]

...

範例:使用multiport模組拒絕訪問多個不連續的埠號
[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.18

-

p

tcp -m multiport

--dports80

,

22

,

21

-j REJECT

iprange擴充套件

指明連續的(但一般不是整個網路)ip地址範圍
[!]--src-rangefrom[-to]

源IP地址範圍

[!]--dst-rangefrom[-to]

目標IP地址範圍

範例:拒絕某個網段的IP地址範圍
[root@localhost ~]

# iptables -

AINPUT

-m iprange

--src-range172.31

.

0.1

-

172.31

.

0.7

-j REJECT

mac擴充套件

mac 模組可以指明源MAC地址,,適用於:PREROUTING, FORWARD,INPUT chains
[!]--mac-source

XX:XX:XX:XX:XX:XX

範例:透過某臺機器的mac拒絕
[root@localhost ~]

# iptables -

AINPUT

-m mac

--mac-source00

:

0

c:

29

:

43

:

04

:

9

b -j REJECT

string擴充套件

對報文中的應用層資料做字串模式匹配檢測
--algo {bm|kmp} 字串匹配檢測演算法

bm:Boyer-Moore

kmp:Knuth-Pratt-Morris

--from offset 開始偏移
--to offset 結束偏移

[!]

--string pattern 要檢測的字串模式

[!]

--hex-string pattern要檢測字串模式,16進位制格式

範例:規則遇到相對應的字串就拒絕
[root@localhost ~]

# iptables -

A

OUTPUT -

p

tcp

--sport80

-m string

--algo

bm

--from62--string

"google" -j REJECT

time擴充套件

注意:CentOS 8 此模組有問題
根據將報文到達的時間與指定的時間範圍進行匹配
--datestartYYYY[-MM[-DD[Thh[:mm[:ss]

]]]] 日期

--datestopYYYY[-MM[-DD[Thh[:mm[:ss]

]]]]

--timestarthh

:

mm[:ss]

時間

--timestophh

:

mm[:ss]
[!]--monthdaysday[,day...]

每個月的幾號

[!]--weekdaysday[,day...]

星期幾,

1

7

分別表示星期一到星期日

--kerneltz

:核心時區(當地時間),不建議使用,

CentOS7

版本以上系統預設為

UTC

注意:

centos6

不支援

kerneltz

--localtz

指定本地時區(預設)

範例:某個網段IP不能在某個時間拒絕訪問主機80埠
[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.0

/

16

-d

172.31

.

0.17

-

p

tcp

--dport80

-m

time--timestart16

:

00

--timestop

16

:

10

-j REJECT

connlimit擴充套件

根據每客戶端IP做併發連線數數量匹配
可防止Dos(Denial of Service,拒絕服務)攻擊

--connlimit-upto N

#連線的數量小於等於N時匹配

--connlimit-above N

#連線的數量大於N時匹配

範例:連線數超過2個就拒絕
[root@localhost ~]

# iptables -

AINPUT

-

p

tcp

--dport80

-m connlimit

--connlimit-above2

-j REJECT

limit擴充套件

基於收發報文的速率做匹配 , 令牌桶過濾器

--limit-burst number

#前多少個包不限制

--

limit#[/second|/minute|/hour|/day]

範例:前5個請求包不限制,後續每1分鐘10個,其他不符合規則執行下面的
[root@localhost ~]

# iptables -

AINPUT

-

p

icmp

--icmp-type8

-m limit

--limit10

/minute

--limit-burst5

-j ACCEPT

[root@localhost ~]

# iptables -

AINPUT

-

p

icmp -j REJECT

state擴充套件

state 擴充套件模組,可以根據”連線追蹤機制“去檢查連線的狀態,較耗資源
conntrack機制:追蹤本機上的請求和響應之間的關係
狀態型別:
NEW

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

出的請求

ESTABLISHED:

NEW

狀態之後,連線追蹤資訊庫中為其建立的條目失效之前期間內所進行的通訊

狀態

RELATED:新發起的但與已有連線相關聯的連線,如:ftp協議中的資料連線與命令連線之間的關

INVALID:無效的連線,如flag標記不正確

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

記錄舊資訊路徑

[

root@localhost ~

]

# cat /proc/net/nf_conntrack

範例:老使用者允許連線,新使用者拒絕連線
[root@localhost ~]

# iptables -

AINPUT

-m state

--state

ESTABLISHED -j ACCEPT

[root@localhost ~]

# iptables -

AINPUT

-m state

--state

NEW -j REJECT

範例:本機可以訪問172.31.0.18,但是172.31.0.18不能訪問本機
[root@localhost ~]

# iptables -

AINPUT

-s

172.31

.

0.18

-m state

--state

NEW -j REJECT

連線數測試案例:

# 連線數給一個最少的數值

[

root@localhost ~

]

# echo 1 > /proc/sys/net/netfilter/nf_conntrack_max

# 檢視日誌

[

root@localhost ~

]

# tail -f /var/log/messages

May

816

:

34

:

27

localhost kernel: nf_conntrack: table full, dropping packet

May

816

:

34

:

28

localhost kernel: nf_conntrack: table full, dropping packet

...

# 建議修改適當加大連線數

[

root@localhost ~

]

# echo 655350 > /proc/sys/net/netfilter/nf_conntrack_max

Target

target 包括以下型別

自定義鏈, ACCEPT,

DROP

, REJECT,

RETURN

,LOG,SNAT,DNAT,REDIRECT,MASQUERADE

LOG:非中斷target,本身不拒絕和允許,放在拒絕和允許規則前,並將日誌記錄在

/

var

/

log

/

messages系

統日誌中

--log-level level 級別: debug,info,notice, warning, error, crit, alert,emerg
--log-prefix prefix 日誌字首,用於區別不同的日誌,最多29個字元

範例:某個網段訪問80,21:23埠的在日誌重新生成日誌並打印出來到系統日誌,提示語句開頭new connections:

[root

@localhost~

]# iptables

-

A INPUT

-

s

172.31.0.0/16-

p tcp

-

m multiport

--dports 80,21:23 -m state --state NEW -j LOG --log-prefix "new connections: "

檢視日誌

[root

@localhost~

]# tail

-

f

/

var

/

log

/

messages

May

815

:

34

:

30

localhost systemd: Started Vsftpd ftp daemon.

May

816

:

01

:

01

localhost systemd: Started Session

470ofuser

root.

full

, dropping packet
May

816

:

55

:

20

localhost kernel:

new

connections:

IN=

eth0

OUT=

MAC

=00

:

0

c:

29

:

51

:

72

:d9:

00

:

0

c:

29

:

43

:

04

:

9

b:

08

:

00

SRC

=172.31.0.18

DST

=172.31.0.17

LEN

=60

TOS

=0x00

PREC

=0x00

TTL

=64

ID

=60599

DF PROTO

=

TCP SPT

=35722

DPT

=80WINDOW=29200

RES

=0x00

SYN URGP

=0

規則最佳化最佳實踐

1.

安全放行所有入站和出站的狀態為ESTABLISHED狀態連線,建議放在第一條,效率更高

2.

謹慎放行入站的新請求

3.

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

4.

同類規則(訪問同一應用,比如:http ),匹配範圍小的放在前面,用於特殊處理

5.

不同類的規則(訪問不同應用,一個是http,另一個是mysql ),匹配範圍大的放在前面,效率更

6.

應該將那些可由一條規則能夠描述的多個規則合併為一條,減少規則數量,提高檢查效率

7.

設定預設策略,建議白名單(只放行特定連線)

iptables -P,不建議,容易出現“自殺現象”

規則的最後定義規則做為預設策略,推薦使用,放在最後一條

iptables儲存規則

以上命令都是臨時生效,持久儲存規則需要如下操作:
方法一:
# 儲存規則

[root@localhost ~]

# iptables-save > /home/iptables.ruls

# 執行匯入儲存的規則

[root@localhost ~]

# iptables-restore < /home/iptables.ruls

寫入開機啟動配置

[root@localhost ~]

# vim /etc/rc.d/rc.local

iptables-restore <

/home/ip

tables.ruls

# 加執行許可權

[root@localhost ~]

# chmod +x /etc/rc.d/rc.local

方法二:(CentOS7,8)
# 安裝

[

root@localhost ~

]

# yum install iptables-services

新增到配置檔案裡面

[

root@localhost ~

]

# iptables-save > /etc/sysconfig/iptables

啟動

[

root@localhost ~

]

# systemctl start iptables

設定開機啟動

[

root@localhost ~

]

# systemctl enable --now iptables

連結:https://www.cnblogs.com/xuanlv-0413/p/14748275.html
(版權歸原作者所有,侵刪)


相關文章