自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊Iptables 的五表五鏈,你學(xué)會(huì)了嗎?

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
撰寫本文過程中,筆者發(fā)現(xiàn)中文內(nèi)容幾乎說的都是 四表五鏈?,不知是作者刻意跳過 Security? 表,還是抄襲導(dǎo)致的同質(zhì)化太嚴(yán)重。 雖然 Security 表不是常用功能,但是我們不能忽略其存在。

概述

iptables 是一個(gè)配置 Linux 內(nèi)核防火墻的命令行工具,它基于內(nèi)核的包過濾框架(packet filtering framework) netfilter, 主要用于管理數(shù)據(jù)包過濾和 NAT 規(guī)則。

圖片

圖片來源: https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg

iptables? 與協(xié)議棧內(nèi)有包過濾功能的 hook 交 互來完成工作。這些內(nèi)核 hook 構(gòu)成了 netfilter? 框架。每個(gè)進(jìn)入網(wǎng)絡(luò)系統(tǒng)的包(接收或發(fā)送)在經(jīng)過協(xié)議棧時(shí)都會(huì)觸發(fā)這些 hook, 程序可以通過注冊 hook 函數(shù)的方式在一些關(guān)鍵路徑上處理網(wǎng)絡(luò)流量。iptables? 相關(guān)的內(nèi)核模塊在這些 hook 點(diǎn)注冊了處理函數(shù),因此可以通過配置 iptables 規(guī)則來使得網(wǎng)絡(luò)流量符合防火墻規(guī)則。

理解 iptables? 是學(xué)習(xí) Docker?, Kubernetes 等開源項(xiàng)目中網(wǎng)絡(luò)功能實(shí)現(xiàn)的基礎(chǔ)。

規(guī)則

規(guī)則? 就是網(wǎng)絡(luò)管理員預(yù)定義的條件,一般的定義為 如果數(shù)據(jù)包頭符合當(dāng)前條件,處理這個(gè)數(shù)據(jù)包,反之執(zhí)行下一個(gè)判斷條件, 規(guī)則? 存儲(chǔ)在內(nèi)核空間的過濾表中,這些規(guī)則分別指定了 源地址、目的地址、傳輸協(xié)議?(如TCP、UDP、ICMP)和 服務(wù)類型?(如 HTTP、FTP 和 SMTP)等, 當(dāng)數(shù)據(jù)包與 規(guī)則? 匹配時(shí),內(nèi)核會(huì)執(zhí)行具體的 行為。

配置防火墻的主要工作就是添加、修改和刪除規(guī)則。

行為

動(dòng)作

描述

ACCEPT

接收數(shù)據(jù)包

DROP

丟棄數(shù)據(jù)包,進(jìn)行完此動(dòng)作后,將直接中斷檢測過程,不再檢測其它規(guī)則

REDIRECT

將封包重新導(dǎo)向到另一個(gè)端口(PNAT),進(jìn)行完此動(dòng)作后,繼續(xù)比對其它規(guī)則,這個(gè)功能可以用來實(shí)現(xiàn)透明代理或用來保護(hù)應(yīng)用服務(wù)器

SNAT

源地址轉(zhuǎn)換

DNAT

目的地址轉(zhuǎn)換

MASQUERADE

IP偽裝(NAT),用于 ADSL

LOG

日志記錄

SEMARK

添加 SEMARK 標(biāo)記以供網(wǎng)域內(nèi)強(qiáng)制訪問控制(MAC)

QUEUE

將數(shù)據(jù)包傳遞到用戶空間

REJECT

攔截?cái)?shù)據(jù)包,并返回?cái)?shù)據(jù)包通知對方

RETURN

防火墻停止執(zhí)行當(dāng)前鏈中的后續(xù)規(guī)則,并返回到調(diào)用鏈中繼續(xù)檢測

5鏈

鏈? 是數(shù)據(jù)包傳播的路徑,每一個(gè) 鏈? 中可以有 N 個(gè) 規(guī)則? (N >= 0)。當(dāng)數(shù)據(jù)包到達(dá)一個(gè) 鏈? 時(shí),iptables? 就會(huì)從鏈中第一個(gè)規(guī)則開始檢測, 如果數(shù)據(jù)包滿足規(guī)則所定義的條件,系統(tǒng)會(huì)執(zhí)行具體的 行為?,否則 iptables? 繼續(xù)檢查下一個(gè)規(guī)則。 如果數(shù)據(jù)包不符合鏈中任一個(gè)規(guī)則,iptables 就會(huì)根據(jù)該鏈預(yù)先定義的默認(rèn)策略來處理數(shù)據(jù)包。

名稱

描述

INPUT

處理接收的數(shù)據(jù)包

OUTPUT

處理發(fā)送的數(shù)據(jù)包

FORWARD

處理轉(zhuǎn)發(fā)的數(shù)據(jù)包,常用于 ??網(wǎng)絡(luò)隔離???, ??NAT???, ??負(fù)載均衡??

PREROUTING

修改到達(dá)且還未轉(zhuǎn)發(fā)的數(shù)據(jù)包,常用于 ??DNAT???, ??端口映射???, ??源地址轉(zhuǎn)換??

POSTOUTING

修改發(fā)送前的的數(shù)據(jù)包,常用于 ??SNAT??

5 表

表有 N 個(gè)鏈,鏈有 N 個(gè)規(guī)則。

大部分場景僅需使用 Filter 表 和 NAT 表。

Raw 表

Raw 表用于在 連接跟蹤、NAT 和路由表處理之前 對數(shù)據(jù)包進(jìn)行處理,包含 2 種內(nèi)置鏈:

? PREROUTING

? OUTPUT

因?yàn)閮?yōu)先級最高,所以如果使用了 Raw? 表,那么在 Raw? 表處理完后, 將跳過 NAT? 表和 ip_conntrack 處理, 也就是避免了 連接跟蹤、NAT 和路由表前置 處理。

Filter 表

Filter? 是 iptables? 的默認(rèn)表,用于過濾數(shù)據(jù)包,如果沒有定義表的情況下將使用 Filter 表,包含 3 種內(nèi)置鏈:

  • ? INPUT
  • ? OUTPUT
  • ? FORWARD

在 Filter 表中只允許對數(shù)據(jù)包進(jìn)行接受,丟棄的操作,而無法對數(shù)據(jù)包進(jìn)行更改。

NAT 表

NAT 用于實(shí)現(xiàn)網(wǎng)絡(luò)地址轉(zhuǎn)換,包含 3 種內(nèi)置鏈:

? PREROUTING

? POSTROUTING

? OUTPUT

Mangle 表

Mangle 用于對指定數(shù)據(jù)包報(bào)頭進(jìn)行修改、標(biāo)記或重定向,包含 5 種內(nèi)置鏈:

? INPUT

? OUTPUT

? FORWARD

? PREROUTING

? POSTROUTING

Security 表

Security 用于給包打上 SELinux 標(biāo)記,以此影響 SELinux 或其他可以解讀 SELinux 安全上下文的系統(tǒng)處理包的行為。這些標(biāo)記可以基于單個(gè)包,也可以基于連接。

表和鏈關(guān)系圖

圖片

表和鏈關(guān)系圖

表的檢測優(yōu)先級

Raw -> Mangle -> Nat -> Filter

圖片

圖片來源: https://www.frozentux.net/iptables-tutorial/images/tables_traverse.jpg

任何一個(gè)數(shù)據(jù)包必然經(jīng)過 5 個(gè)鏈中的其中一個(gè)。

? 一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),首先進(jìn)入 PREROUTING 鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的 IP 判斷是否需要轉(zhuǎn)發(fā)

? 如果數(shù)據(jù)包是進(jìn)入本機(jī)的,它就會(huì)沿著圖向下移動(dòng),到達(dá) INPUT? 鏈,數(shù)據(jù)包到了INPUT鏈后,任何進(jìn)程都會(huì)收到它,本機(jī)上程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包會(huì)經(jīng)過 OUTPUT? 鏈,然后到達(dá) POSTROUTING 鏈輸出

? 如果數(shù)據(jù)包是轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包會(huì)經(jīng)過 FORWARD? 鏈,然后到達(dá) POSTROUTING 鏈輸出

常用命令

查看類

# 查看所有防火墻規(guī)則
$ iptables --list

# 示例輸出如下
Chain DOCKER (8 references)
target prot opt source destination
ACCEPT tcp -- anywhere 172.27.0.2 tcp dpt:10010
ACCEPT tcp -- anywhere 172.22.0.2 tcp dpt:http
ACCEPT tcp -- anywhere 172.29.0.4 tcp dpt:memcached
ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:redis
ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:nginx
ACCEPT tcp -- anywhere 172.17.0.4 tcp dpt:8080
ACCEPT tcp -- anywhere 172.17.0.5 tcp dpt:mysql
ACCEPT tcp -- anywhere 172.17.0.5 tcp dpt:http

# 查看 mangle 表規(guī)則
$ iptables -t mangle --list

# 查看 nat 表規(guī)則
$ iptables -t nat --list

字段名稱

描述

target

規(guī)則行為

prot

協(xié)議

opt

選項(xiàng)

source

源 IP 地址

destination

目的 IP 地址

操作類

# 查看說明

$ iptables --help

# 查看命令
iptables -L:查看規(guī)則鏈

# 規(guī)則管理命令
iptables -A:在規(guī)則鏈的末尾加入新規(guī)則
iptables -D:刪除某個(gè)規(guī)則
iptables -I:在規(guī)則鏈的頭部加入新規(guī)則
iptables -R:替換規(guī)則鏈中的規(guī)則

# 鏈管理命令
iptables -F:清空規(guī)則鏈
iptables -Z:清空規(guī)則鏈中的數(shù)據(jù)包計(jì)算器和字節(jié)計(jì)數(shù)器
iptables -N:創(chuàng)建新的用戶自定義規(guī)則鏈
iptables -P:設(shè)置規(guī)則鏈中的默認(rèn)策略

# 通用匹配參數(shù)
-t
對指定的表 table 進(jìn)行操作
如果不指定此選項(xiàng),默認(rèn)的是 filter 表

-p 協(xié)議
指定規(guī)則的協(xié)議,如 tcp, udp, icmp 等,可以使用all來指定所有協(xié)議
如果不指定 -p 參數(shù),默認(rèn)的是 all 值

-s 源地址
指定數(shù)據(jù)包的源地址
參數(shù)可以使IP地址、網(wǎng)絡(luò)地址、主機(jī)名
例如:-s 192.168.1.101 指定IP地址
例如:-s 192.168.1.10/24 指定網(wǎng)絡(luò)地址

-d 目的地址
指定數(shù)據(jù)包的目的地址,規(guī)則和 -s 類似

-j 執(zhí)行目標(biāo)
指定規(guī)則匹配時(shí)如何處理數(shù)據(jù)包
可能的值是ACCEPT, DROP, QUEUE, RETURN 等

-i 輸入接口
指定要處理來自哪個(gè)接口的數(shù)據(jù)包,這些數(shù)據(jù)包將進(jìn)入 INPUT, FORWARD, PREROUTE 鏈
例如:-i eth0指定了要處理經(jīng)由eth0進(jìn)入的數(shù)據(jù)包
如果不指定 -i參數(shù),那么將處理進(jìn)入所有接口的數(shù)據(jù)包
如果指定 ! -i eth0,那么將處理所有經(jīng)由eth0以外的接口進(jìn)入的數(shù)據(jù)包
如果指定 -i eth+,那么將處理所有經(jīng)由eth開頭的接口進(jìn)入的數(shù)據(jù)包

-o 輸出
指定了數(shù)據(jù)包由哪個(gè)接口輸出,這些數(shù)據(jù)包將進(jìn)入 FORWARD, OUTPUT, POSTROUTING鏈
如果不指定-o選項(xiàng),那么所有接口都可以作為輸出接口
如果指定 ! -o eth0,那么將從eth0以外的接口輸出
如果指定 -i eth+,那么將僅從eth開頭的接口輸出

# 擴(kuò)展參數(shù)
-sport 源端口
針對 -p tcp 或者 -p udp,默認(rèn)情況下,將匹配所有端口
可以指定端口號(hào)或者端口名稱、端口范圍,例如 –sport 22, –sport ssh,–sport 22:100
從性能上講,使用端口號(hào)更好, /etc/services 文件描述了映射關(guān)系

-dport 目的端口
規(guī)則和 –sport 類似

-tcp-flags TCP 標(biāo)志
針對 -p tcp
可以指定由逗號(hào)分隔的多個(gè)參數(shù)
取值范圍:SYN, ACK, FIN, RST, URG, PSH, ALL, NONE

-icmp-type ICMP 標(biāo)志
針對 -p icmp
icmp-type 0 表示 Echo Reply
icmp-type 8 表示 Echo

命令選項(xiàng)輸入順序

iptables -t 表名 <-A/I/D/R> 規(guī)則鏈名 [規(guī)則號(hào)] <-i/o 網(wǎng)卡名> -p 協(xié)議名 <-s 源IP/源子網(wǎng)> --sport 源端口 <-d 目標(biāo)IP/目標(biāo)子網(wǎng)> --dport 目標(biāo)端口 -j 動(dòng)作

示例

以下命令在生產(chǎn)環(huán)境中謹(jǐn)慎使用。

查看已添加的iptables規(guī)則

$ iptables -L -n -v

Chain INPUT (policy DROP 48106 packets, 2690K bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0

清空當(dāng)前的所有規(guī)則和計(jì)數(shù)

$ iptables -F  # 清空所有的防火墻規(guī)則
$ iptables -X # 刪除用戶自定義的空鏈
$ iptables -Z # 清空計(jì)數(shù)

設(shè)置默認(rèn)規(guī)則

$ iptables -P INPUT DROP    # 配置默認(rèn)的不讓進(jìn)
$ iptables -P FORWARD DROP # 默認(rèn)的不允許轉(zhuǎn)發(fā)
$ iptables -P OUTPUT ACCEPT # 默認(rèn)的可以出去

開放指定端口

$ iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT               # 允許本地回環(huán)接口(即運(yùn)行本機(jī)訪問本機(jī))
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許已建立的或相關(guān)連的通行
$ iptables -A OUTPUT -j ACCEPT # 允許所有本機(jī)向外的訪問
$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允許訪問22端口
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允許訪問80端口
$ iptables -A INPUT -p tcp --dport 21 -j ACCEPT # 允許ftp服務(wù)的21端口
$ iptables -A INPUT -p tcp --dport 20 -j ACCEPT # 允許FTP服務(wù)的20端口
$ iptables -A INPUT -j reject # 禁止其他未允許的規(guī)則訪問
$ iptables -A FORWARD -j REJECT # 禁止其他未允許的規(guī)則訪問

白名單

$ iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT            # 允許機(jī)房內(nèi)網(wǎng)機(jī)器可以訪問
$ iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允許機(jī)房內(nèi)網(wǎng)機(jī)器可以訪問
$ iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允許 183.121.3.7 訪問本機(jī)的 3380 端口

黑名單

iptables -I INPUT -s 123.45.6.7 -j DROP       # 屏蔽單個(gè) IP
iptables -I INPUT -s 123.0.0.0/8 -j DROP # 屏蔽 IP 網(wǎng)段 從 123.0.0.1 到 123.255.255.254
iptables -I INPUT -s 124.45.0.0/16 -j DROP # 屏蔽 IP 網(wǎng)段 從 123.45.0.1 到 123.45.255.254
iptables -I INPUT -s 123.45.6.0/24 -j DROP # 屏蔽 IP 網(wǎng)段 從 123.45.6.1 到 123.45.6.254

防止 SYN 洪水攻擊

$ iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT

小結(jié)

撰寫本文過程中,筆者發(fā)現(xiàn)中文內(nèi)容幾乎說的都是 四表五鏈?,不知是作者刻意跳過 Security? 表,還是抄襲導(dǎo)致的同質(zhì)化太嚴(yán)重。 雖然 Security 表不是常用功能,但是我們不能忽略其存在。

Reference

  • ? Traversing of tables and chains[1]
  • ? iptables(8) - Linux man page[2]
  • ? iptables[3]
  • ? iptables詳解[4]
  • ? iptables command[5]
  • ? 深入理解 iptables 和 netfilter 架構(gòu)[6]
  • ? iptables 基礎(chǔ)知識(shí)與命令速查

引用鏈接

[1]? Traversing of tables and chains: ??https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#TRAVERSINGOFTABLES[2]??? iptables(8) - Linux man page: ??https://linux.die.net/man/8/iptables??

[3]? iptables: ??https://wiki.archlinuxcn.org/wiki/Iptables??

[4]? iptables詳解: ??https://lixiangyun.gitbook.io/iptables_doc_zh_cn/??

[5]? iptables command: ??https://wangchujiang.com/linux-command/c/iptables.html??

[6]? 深入理解 iptables 和 netfilter 架構(gòu): https://arthurchiao.art/blog/deep-dive-into-iptables-and-netfilter-arch-zh/

責(zé)任編輯:武曉燕 來源: 洋芋編程
相關(guān)推薦

2022-03-08 08:39:22

gRPC協(xié)議云原生

2022-04-26 08:10:33

MySQL存儲(chǔ)InnoDB

2023-02-15 08:41:56

多層維表性能寬表

2023-07-10 08:36:21

工具pptword

2023-01-29 08:08:34

并發(fā)庫conc通用庫

2022-12-26 07:48:04

敏捷項(xiàng)目

2024-03-05 10:09:16

restfulHTTPAPI

2024-06-12 08:36:25

2024-08-19 10:24:14

2023-12-30 13:41:39

JSON格式數(shù)據(jù)

2022-09-28 07:31:03

SOLID對象設(shè)計(jì)

2024-02-28 09:07:58

鏈路聚合模式

2024-03-28 12:20:17

2024-11-08 08:56:01

2023-03-07 07:50:15

Transactio事務(wù)代碼

2023-06-05 08:36:04

SQL函數(shù)RANK()

2022-03-05 23:29:18

LibuvwatchdogNode.js

2022-12-14 08:31:43

#error編譯命令

2024-03-04 07:41:18

SpringAOPOOP?

2022-12-27 08:45:00

繪制菜單符號(hào)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)