溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Linux中使用iptables命令

發(fā)布時(shí)間:2021-05-17 16:11:35 來源:億速云 閱讀:270 作者:Leah 欄目:服務(wù)器

這篇文章將為大家詳細(xì)講解有關(guān)如何在Linux中使用iptables命令,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

iptables 是 Linux 管理員用來設(shè)置 IPv4 數(shù)據(jù)包過濾條件和 NAT 的命令行工具。iptables 工具運(yùn)行在用戶態(tài),主要是設(shè)置各種規(guī)則。而 netfilter 則運(yùn)行在內(nèi)核態(tài),執(zhí)行那些設(shè)置好的規(guī)則。

查看 iptables 的鏈和規(guī)則

查看規(guī)則的命令格式為:

iptables [-t tables] [-L] [-nv]

-t :后面接 table ,例如 nat 或 filter ,若省略此項(xiàng)目,則使用默認(rèn)的 filter
-L :列出某個(gè) table 的所有鏈或某個(gè)鏈的規(guī)則
-n :直接顯示 IP,速度會(huì)快很多
-v :列出更多的信息,包括通過該規(guī)則的數(shù)據(jù)包總位數(shù)、相關(guān)的網(wǎng)絡(luò)接口等

列出 filter table INPUT 鏈的規(guī)則:

$ sudo iptables -L INPUT

列出 nat table 三條鏈的規(guī)則:

$ sudo iptables -t nat -L -n

列出 filter table 三條鏈的規(guī)則:

$ sudo iptables -L

如何在Linux中使用iptables命令

紅框中的內(nèi)容為鏈的名稱及其默認(rèn)策略,filter 表中所有鏈的默認(rèn)策略都是 ACCEPT。紅框下面的行代表什么呢?

target:代表進(jìn)行的動(dòng)作,ACCEPT 是放行,REJECT 是拒絕,DROP 則是丟棄數(shù)據(jù)包。
port:代表使用的協(xié)議,主要有 tcp、udp 和 icmp 三種。
opt:額外的選項(xiàng)說明。
source:規(guī)則針對(duì)的來源 IP。
destination:規(guī)則針對(duì)的目標(biāo) IP。

因?yàn)槟J(rèn)情況下沒有添加自定義的規(guī)則,所以上圖中這些行下面都是空的。

清除本機(jī)防火墻規(guī)則

清除規(guī)則的命令格式如下:

iptables [-t tables] [-FXZ]

-F:清除所有已制定的規(guī)則
-X:刪除所有使用者自定義的 chain(其是 tables)
-Z:將所有的 chain 的計(jì)數(shù)與流量統(tǒng)計(jì)都清零

如果我們要制訂一套防火墻規(guī)則,一般會(huì)先清除現(xiàn)有的規(guī)則,然后從頭開始創(chuàng)建新的規(guī)則。下面讓我們清除本機(jī) filter 表中的所有規(guī)則:

$ sudo iptables -F
$ sudo iptables -X
$ sudo iptables -Z

定義默認(rèn)策略(policy)

如果一個(gè)數(shù)據(jù)包沒有匹配到一個(gè)鏈中的任何一個(gè)規(guī)則,那么將對(duì)該數(shù)據(jù)包執(zhí)行這個(gè)鏈的默認(rèn)策略(default policy),默認(rèn)策略可以是 ACCEPT 或 DROP。
鏈中默認(rèn)策略的存在使得我們?cè)谠O(shè)計(jì)防火墻時(shí)可以有兩種選擇:

設(shè)置默認(rèn)策略 DROP 所有的數(shù)據(jù)包,然后添加規(guī)則接受(ACCEPT)來自可信 IP 地址的數(shù)據(jù)包,或訪問我們的服務(wù)監(jiān)聽的端口的數(shù)據(jù)包,比如 bittorrent、FTP 服務(wù)器、Web 服務(wù)器、Samba 文件服務(wù)器等等。

設(shè)置默認(rèn)策略 ACCEPT 所有的數(shù)據(jù)包,然后添加規(guī)則丟棄(DROP)特定的數(shù)據(jù)包。比如來自一些惡意 IP 的數(shù)據(jù)包,或訪問某些端口的數(shù)據(jù)包,在這些端口上我們并沒有提供公開的服務(wù)。

一般情況下,上面的第一個(gè)選項(xiàng)用于 INPUT 鏈,因?yàn)槲覀兿M麑?duì)訪問的資源進(jìn)行權(quán)限控制。而第二個(gè)選項(xiàng)常用于 OUTPUT 鏈,因?yàn)槲覀兺ǔP湃坞x開機(jī)器的數(shù)據(jù)包(該數(shù)據(jù)包來自本機(jī))。

設(shè)置默認(rèn)策略的命令格式如下:

iptables [-t table] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]

-P 選項(xiàng)用來定義默認(rèn)策略(Policy)。注意,這是大寫字母 P。ACCEPT 表示接受數(shù)據(jù)包,DROP 表示丟棄數(shù)據(jù)包。

一般情況下,我們會(huì)把 filter 表的 INPUT 鏈的默認(rèn)策略制訂的嚴(yán)格一些,比如設(shè)為 DROP。而 FORWARD 和 OUTPUT 可以寬松些,設(shè)為 ACCEPT。比如我們可以通過下面的命令把 filter 表的 INPUT 鏈的默認(rèn)策略設(shè)置為 DROP:

$ sudo iptables -P INPUT DROP

如何在Linux中使用iptables命令

添加規(guī)則

我們可以通過規(guī)則來匹配數(shù)據(jù)包,具體的匹配條件包括 IP、網(wǎng)段、網(wǎng)絡(luò)接口(interface)和傳輸協(xié)議(tcp、udp 等)。

添加規(guī)則的命令格式如下:

iptables [-AI chain] [-io interface] [-p 協(xié)議] [-s 來源 IP] [-d 目標(biāo) IP] -j [ACCEPT,DROP,REJECT,LOG]
-A:針對(duì)某個(gè)規(guī)則鏈添加一條規(guī)則,新添加的規(guī)則排在現(xiàn)有規(guī)則的后面。
-I:針對(duì)某個(gè)規(guī)則鏈插入一條規(guī)則,可以為新插入的規(guī)則指定在鏈中的序號(hào)。如果不指定序號(hào),則新的規(guī)則會(huì)變成第一條規(guī)則。
-i:指定數(shù)據(jù)包進(jìn)入的那個(gè)網(wǎng)絡(luò)接口,比如 eth0、lo 等,需要與 INPUT 鏈配合使用。
-o: 指定傳出數(shù)據(jù)包的那個(gè)網(wǎng)絡(luò)接口,需要與 OUTPUT 鏈配合使用。
-p: 指定此規(guī)則適用于那種網(wǎng)絡(luò)協(xié)議(常用的協(xié)議有 tcp、udp、icmp,all 指適用于所有的協(xié)議)。
-s:指定數(shù)據(jù)包的來源 IP/網(wǎng)段,可以指定單個(gè) IP,如 192.168.1.100,也可以指定一個(gè)網(wǎng)段,如 192.168.1.0/24。還可以通過 !表示非的意思,如 ! 192.168.1.0/24 表示除了 192.168.1.0/24 之外的數(shù)據(jù)包。
-d:指定數(shù)據(jù)包的目標(biāo) IP/網(wǎng)段,其它與 -s 選項(xiàng)相同。
-j:指定匹配成功后的行為,主要有 ACCEPT、DROP、REJECT 和 LOG。

下面我們來看幾個(gè)例子。

放開本機(jī)接口 lo:

$ sudo iptables -A INPUT -i lo -j ACCEPT

上面的命令假設(shè) lo 接口是可以信任的設(shè)備,所有進(jìn)出該接口的數(shù)據(jù)包都會(huì)被接受。

注意,上面的命令中并沒有設(shè)置 -s、-d 等參數(shù),其實(shí)沒有指定的參數(shù)表示該參數(shù)是任何值都可以被接受。

完全放開某個(gè)接口

和 lo 接口類似,如果你完全信任某個(gè)接口,可以像設(shè)置 lo 一樣設(shè)置它:

$ sudo iptables -A INPUT -i eth2 -j ACCEPT

只接受來自內(nèi)網(wǎng)中某個(gè)網(wǎng)段的數(shù)據(jù)包:

$ sudo iptables -A INPUT -i eth3 -s 192.168.10.0/24 -j ACCEPT

接受/丟棄來自指定 IP 的數(shù)據(jù)包:

$ sudo iptables -A INPUT -i eth4 -s 192.168.100.5 -j ACCEPT
$ sudo iptables -A INPUT -i eth4 -s 192.168.100.6 -j DROP

然后看看 filter 表的規(guī)則:

$ sudo iptables -L -v

如何在Linux中使用iptables命令

iptables-save 命令提供了另外一種風(fēng)格的輸出:

$ sudo iptables-save

如何在Linux中使用iptables命令

在規(guī)則中使用端口號(hào)

在我們添加的規(guī)則中,很多時(shí)候需要指定網(wǎng)絡(luò)協(xié)議(tcp、udp 等)及相關(guān)的端口號(hào),其基本命令格式如下:

iptables [-AI chain] [-io interface] [-p tcp,udp] [-s 來源 IP] [--sport 端口范圍] [-d 目標(biāo) IP] [--dport 端口范圍] -j [ACCEPT,DROP,REJECT]
--sport:限制來源的端口號(hào),可以是單個(gè)端口,也可以是一個(gè)范圍,如 1024:1050
--dport:限制目標(biāo)的端口號(hào)。

注意,因?yàn)橹挥?tcp 協(xié)議和 udp 協(xié)議使用了端口號(hào),所以在使用 --sport 和 --dport 時(shí),一定要指定協(xié)議的類型(-p tcp 或 -p udp)。

下面來看幾個(gè)例子。

丟棄所有通過 tcp 協(xié)議訪問本機(jī) 21 端口的數(shù)據(jù)包:

$ sudo iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP

丟棄來自 192.168.1.0/24 的 1024:65535 端口的訪問本機(jī) ssh 端口的數(shù)據(jù)包:

$ sudo iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65535 --dport ssh -j DROP

常見的插件模塊

在 linux kernel 2.2 以前使用 ipchains 管理防火墻時(shí),必須針對(duì)數(shù)據(jù)包的進(jìn)、出方向進(jìn)行控制。

比如要連接到遠(yuǎn)程主機(jī)的 22 端口時(shí),必須設(shè)置兩條規(guī)則:

本機(jī)的 1024:65535 端口到遠(yuǎn)程的 22 端口必須放行(OUTPUT chain);
遠(yuǎn)程主機(jī) 22 端口到本機(jī)的 1024:65535 端口必須放行(INPUT chain);

這是很麻煩的,比如你要連接 10 臺(tái)遠(yuǎn)程主機(jī)的 22 端口,即便你本機(jī)的 OUTPUT 設(shè)置為 ACCEPT,
你依然需要添加 10 條 INPUT ACCEPT 規(guī)則接受來自這 10 臺(tái)遠(yuǎn)程主機(jī)的 22 端口的數(shù)據(jù)包(INPUT 的默認(rèn)策略為 DROP)。

iptables 則解決了這個(gè)問題,它會(huì)通過一個(gè)狀態(tài)模塊來分析:這個(gè)想要進(jìn)入的數(shù)據(jù)包是不是對(duì)自己已發(fā)送請(qǐng)求的響應(yīng)?如果判斷是對(duì)自己請(qǐng)求的響應(yīng),就放行這個(gè)數(shù)據(jù)包。

使用狀態(tài)模塊的基本命令格式如下:

iptables -A INPUT [-m state] [--state INVALID,ESTABLISHED,NEW,RELATED]
-m:指定 iptables 的插件模塊,常見的模塊有:
    state:狀態(tài)模塊
    mac:處理網(wǎng)卡硬件地址(hardware address)的模塊
--state:指定數(shù)據(jù)包的狀態(tài),常見的狀態(tài)有:
    INVALID:無效的數(shù)據(jù)包狀態(tài)
    ESTABLISHED:已經(jīng)連接成功的數(shù)據(jù)包狀態(tài)
    NEW:想要新建立連接的數(shù)據(jù)包狀態(tài)
    RELATED:這個(gè)最常用,它表示該數(shù)據(jù)包與我們主機(jī)發(fā)送出去的數(shù)據(jù)包有關(guān)

下面來看幾個(gè)例子。

只要是已建立連接或相關(guān)的數(shù)據(jù)包接受:

$ sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

只要是不合法的數(shù)據(jù)包就丟棄:

$ sudo iptables -A INPUT -m state --state INVALID -j DROP

保存 iptables 的配置

注意,我們通過 iptables 命令設(shè)置的規(guī)則都保存在內(nèi)存中,也就是說系統(tǒng)重啟的話所有的配置都會(huì)丟失。

我們可以通過 iptables-save 命令把 iptables 的配置保存到文件中:

$ sudo touch /etc/iptables.conf
$ sudo chmod 666 /etc/iptables.conf
$ sudo iptables-save > /etc/iptables.conf

在需要時(shí)再通過 iptables-restore 命令把文件中的配置信息導(dǎo)入:

$ sudo iptables-restore < /etc/iptables.conf

什么是Linux系統(tǒng)

Linux是一種免費(fèi)使用和自由傳播的類UNIX操作系統(tǒng),是一個(gè)基于POSIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng),使用Linux能運(yùn)行主要的Unix工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。

關(guān)于如何在Linux中使用iptables命令就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI