本文部份內容節選自: netfilter/iptables 簡介 - IBM developerWorks
於是,能夠定製防火牆配置來知足任何特定需求和任何安全性級別需求。 這就是 netfilter/iptables 系統的用武之處。html
ACCEPT
容許該信息包經過。還可使用目標 DROP
或 REJECT
來阻塞並殺死信息包。對於可對信息包執行的其它操做,還有許多其它目標。INPUT
鏈中。處理出站信息包的規則被添加到 OUTPUT
鏈中。處理正在轉發的信息包的規則被添加到 FORWARD
鏈中。這三個鏈是基本信息包過濾表中內置的缺省主鏈。 另外,還有其它許多可用的鏈的類型(如 PREROUTING
和 POSTROUTING
), 以及提供用戶定義的鏈。每一個鏈均可以有一個策略, 它定義「缺省目標」,也就是要執行的缺省操做,當信息包與鏈中的任何規則都不匹配時,執行此操做。INPUT
鏈。若是信息包源自系統內部或系統所鏈接的內部網上的其它源,而且此信息包要前往另外一個外部系統, 那麼信息包被傳遞到 OUTPUT
鏈。相似的,源自外部系統並前往外部系統的信息包被傳遞到 FORWARD
鏈。DROP
該信息包。netfilter/iptables
系統提供的特殊命令 iptables
,創建這些規則,並將其添加到內核空間的特定信息包過濾表內的鏈中。關於添加/除去/編輯規則的命令的通常語法以下:iptables [-t table] command [match] [target]
[-t table]
選項容許使用標準表以外的任何表。表是包含僅處理特定類型信息包的規則和鏈的信息包過濾表。 有三種可用的表選項: filter
、 nat
和 mangle
。該選項不是必需的,若是未指定, 則 filter
用做缺省表。filter
表用於通常的信息包過濾,它包含 INPUT
、 OUTPUT
和 FORWARD
鏈。nat
表用於要轉發的信息包,它包含 PREROUTING
、 OUTPUT
和 POSTROUTING
鏈。 若是信息包及其頭內進行了任何更改,則使用 mangle
表。 該表包含一些規則來標記用於高級路由的信息包,該表包含 PREROUTING
和 OUTPUT
鏈。PREROUTING
鏈由指定信息包一到達防火牆就改變它們的規則所組成,而 POSTROUTING
鏈由指定正當信息包打算離開防火牆時改變它們的規則所組成。command
部分是 iptables
命令的最重要部分。 它告訴 iptables
命令要作什麼,例如,插入規則、將規則添加到鏈的末尾或刪除規則。 如下是最經常使用的一些命令:-A
或 --append
: 該命令將一條規則附加到鏈的末尾。iptables -A INPUT -s 205.168.0.1 -j ACCEPT
-D
或 --delete
: 經過用 -D
指定要匹配的規則或者指定規則在鏈中的位置編號,該命令從鏈中刪除該規則。 下面的示例顯示了這兩種方法。iptables -D INPUT --dport 80 -j DROP iptables -D OUTPUT 3
INPUT
鏈刪除規則,它指定 DROP
前往端口 80
的信息包。第二條命令只是從 OUTPUT
鏈刪除編號爲 3
的規則。-P
或 --policy
: 該命令設置鏈的缺省目標,即策略。 全部與鏈中任何規則都不匹配的信息包都將被強制使用此鏈的策略。iptables -P INPUT DROP
INPUT
鏈的缺省目標指定爲 DROP
。這意味着,將丟棄全部與 INPUT
鏈中任何規則都不匹配的信息包。-N
或 --new-chain
: 用命令中所指定的名稱建立一個新鏈。iptables -N allowed-chain
-F
或 --flush
: 若是指定鏈名,該命令刪除鏈中的全部規則, 若是未指定鏈名,該命令刪除全部鏈中的全部規則。此參數用於快速清除。iptables -F FORWARD iptables -F
-X
或 --delete-chain
: 若是指定鏈名,該命令刪除這條自定義的鏈, 若是未指定鏈名,該命令刪除全部自定義的鏈。此參數用於快速清除全部自定義的鏈,固然,默認的鏈沒法刪除。iptables -X MY_OWN_INPUT iptables -X
-L
或 --list
: 列出指定鏈中的全部規則。iptables -L allowed-chain
iptables
命令的可選 match
部分指定信息包與規則匹配所應具備的特徵(如源和目的地地址、協議等)。 匹配分爲兩大類: 通用匹配和特定於協議的匹配。這裏,我將研究可用於採用任何協議的信息包的通用匹配。 下面是一些重要的且經常使用的通用匹配及其示例和說明:-p
或 --protocol
: 該通用協議匹配用於檢查某些特定協議。 協議示例有 TCP
、 UDP
、 ICMP
、用逗號分隔的任何這三種協議的組合列表以及 ALL
(用於全部協議)。 ALL
是缺省匹配。可使用 !
符號,它表示不與該項匹配。iptables -A INPUT -p TCP, UDP iptables -A INPUT -p ! ICMP
TCP
和 UDP
信息包都將與該規則匹配。 經過指定 ! ICMP
,咱們打算容許全部其它協議(在這種狀況下是 TCP
和 UDP
), 而將 ICMP
排除在外。-s
或 --source
: 該源匹配用於根據信息包的源 IP 地址來與它們匹配。該匹配還容許對某一範圍內的 IP 地址進行匹配,可使用 !
符號,表示不與該項匹配。缺省源匹配與全部 IP
地址匹配。iptables -A OUTPUT -s 192.168.1.1 iptables -A OUTPUT -s 192.168.0.0/24 iptables -A OUTPUT -s ! 203.16.1.89
192.168.0.0
到 192.168.0.24
的 IP 地址範圍的信息包匹配。第三條命令指定該規則將與 除來自源地址 203.16.1.89
外的任何信息包匹配。-d
或 --destination
: 該目的地匹配用於根據信息包的目的地 IP 地址來與它們匹配。 該匹配還容許對某一範圍內 IP 地址進行匹配,可使用 !
符號,表示不與該項匹配。iptables -A INPUT -d 192.168.1.1 iptables -A INPUT -d 192.168.0.0/24 iptables -A OUTPUT -d ! 203.16.1.89
ACCEPT
: 當信息包與具備 ACCEPT
目標的規則徹底匹配時, 會被接受(容許它前往目的地),而且它將中止遍歷鏈(雖然該信息包可能遍歷另外一個表中的其它鏈,而且有可能在那裏被丟棄)。 該目標被指定爲 -j ACCEPT
。DROP
: 當信息包與具備 DROP
目標的規則徹底匹配時,會阻塞該信息包,而且不對它作進一步處理。 該目標被指定爲 -j DROP
。REJECT
: 該目標的工做方式與 DROP
目標相同,但它比 DROP
好。和 DROP
不一樣, REJECT
不會在服務器和客戶機上留下死套接字。 另外, REJECT
將錯誤消息發回給信息包的發送方。該目標被指定爲 -j REJECT
。iptables -A FORWARD -p TCP --dport 22 -j REJECT
RETURN
: 在規則中設置的 RETURN
目標讓與該規則匹配的信息包中止遍歷包含該規則的鏈。 若是鏈是如 INPUT
之類的主鏈,則使用該鏈的缺省策略處理信息包。 它被指定爲 -jump RETURN
。示例:iptables -A FORWARD -d 203.16.1.89 -jump RETURN
LOG
、 REDIRECT
、 MARK
、 MIRROR
和 MASQUERADE
等。iptables-save
命令來作到這一點:iptables-save > iptables-script
iptables-script
中。不管什麼時候再次引導系統, 均可以使用 iptables-restore
命令將規則集從該腳本文件恢復到信息包過濾表,以下所示:iptables-restore iptables-script
iptables -P INPUT DROP iptables -P OUTPUT DROP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 20 -j ACCEPT iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
狀態: 正在鏈接 10.128.0.1:21... 狀態: 鏈接創建,等待歡迎消息... 狀態: 不安全的服務器,不支持 FTP over TLS。 狀態: 服務器不支持非 ASCII 字符。 狀態: 已登陸 狀態: 開始上傳 /Users/xiaolulwr/Documents/CAUC-Tec-Markdown/Linux/深刻理解iptables防火牆.md 狀態: 文件傳輸成功,傳輸了 16,532 字節 (用時1 秒) 狀態: 讀取「/root」的目錄列表... 狀態: 計算服務器時差... 狀態: 列出「/root」的目錄成功
狀態: 正在鏈接 10.128.0.1:21... 狀態: 鏈接創建,等待歡迎消息... 狀態: 不安全的服務器,不支持 FTP over TLS。 狀態: 服務器不支持非 ASCII 字符。 狀態: 已登陸 狀態: 讀取目錄列表... 命令: PWD 響應: 257 "/root" 命令: TYPE I 響應: 200 Switching to Binary mode. 命令: PASV 響應: 227 Entering Passive Mode (10,128,0,1,230,163) 命令: LIST 錯誤: 目錄列表被用戶終止
PASV
嘗試切換到被動模式以後,切換是能夠成功的,可是切換以後再進行操做就沒法成功了,緣由也很好理解,由於除了關於20和21端口以外的報文都被DROP了。iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
上面規則的意思是,在iptables的INPUT
和OUTPUT
鏈上,容許ESTABLISHED
和RELATED
狀態的TCP
報文,那麼何爲鏈接狀態呢?下面介紹四種鏈接的狀態:linux
ESTABLISHED
:第一個成功穿越防火牆的報文以後全部的報文;NEW
:一個鏈接的第一個報文,例如TCP鏈接中的SYN報文;RELATED
:伴隨鏈接的報文,即某個已經處於ESTABLISHED
的鏈接所產生的報文,這些報文不屬於第一條鏈接,可是的確是由第一條鏈接產生的;INVALID
:沒法判斷狀態的報文。狀態: 正在鏈接 10.128.0.1:21... 狀態: 鏈接創建,等待歡迎消息... 狀態: 不安全的服務器,不支持 FTP over TLS。 狀態: 服務器不支持非 ASCII 字符。 狀態: 已登陸 狀態: 開始上傳 /Users/xiaolulwr/Documents/CAUC-Personal/我的博客/ssl.txt 狀態: 文件傳輸成功,傳輸了 3,550 字節 (用時1 秒) 狀態: 讀取「/root」的目錄列表... 狀態: 列出「/root」的目錄成功 狀態: 開始下載 /root/ssl.txt 狀態: 文件傳輸成功,傳輸了 3,550 字節 (用時1 秒) 狀態: 已從服務器斷開
PREROUTING
和 POSTROUTING
鏈,在這兩條鏈上配置規則能夠實現NAT功能。在配置NAT以前,首先回顧一下NAT的兩種形式:shell
172.20.10.0
網絡仍然是局域網,只是模擬了廣域網而已):主機(做爲廣域網服務器) 接口名稱:wlan IP地址:172.20.10.4 子網掩碼:255.255.255.240 默認網關:172.20.10.1 虛擬機A(做爲NAT路由器) 接口名稱:ens39(廣域網接口) IP地址:172.20.10.3 子網掩碼:255.255.255.240 默認網關:172.20.10.1 接口名稱:ens38(局域網接口) IP地址:192.168.1.1 子網掩碼:255.255.255.0 配置: ifconfig ens38 192.168.1.1 netmask 255.255.255.0 虛擬機B(做爲局域網主機) 接口名稱:eth1 IP地址:192.168.1.100 子網掩碼:255.255.255.0 默認網關:192.168.1.1 配置: ifconfig eth1 192.168.1.100 netmask 255.255.255.0 route add default gw 192.168.1.1
/etc/sysctl.conf
文件vi /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
# 適用於廣域網爲固定IP地址的狀況,本例是這種狀況 iptables -t nat -A POSTROUTING -o ens38 -s 192.168.1.0/24 -j SNAT --to-source 172.20.10.3 # 適用於廣域網爲動態分配IP地址的狀況,典型例子是PPPoE iptables -t nat -A POSTROUTING –o ens38 –s 192.168.1.0/24 –j MASQUERADE
ens38
接口上的192.168.1.0/24
網絡上的報文的源IP地址,轉換爲廣域網地址172.20.10.3
(或者經過PPPoE獲得的動態廣域網地址)併發送出去。這樣一來,在局域網中的虛擬機2就能夠訪問廣域網上的的資源了。