① 急!!!利用 iptables 實現 linux 防火牆功能有關問題
自己看:
什麼是Iptables?
iptables 是建立在 netfilter 架構基礎上的一個包過濾管理工具,最主要的作用是用來做防火牆或透明代理。Iptables 從 ipchains 發展而來,它的功能更為強大。Iptables 提供以下三種功能:包過濾、NAT(網路地址轉換)和通用的 pre-route packet mangling。包過濾:用來過濾包,但是不修改包的內容。Iptables 在包過濾方面相對於 ipchians 的主要優點是速度更快,使用更方便。NAT:NAT 可以分為源地址 NAT 和目的地址 NAT。
Iptables 可以追加、插入或刪除包過濾規則。實際上真正執行這些過慮規則的是 netfilter 及其相關模塊(如 iptables 模塊和 nat 模塊)。Netfilter 是 Linux 核心中一個通用架構,它提供了一系列的 「表」(tables),每個表由若干 「鏈」(chains)組成,而每條鏈中可以有一條或數條 「規則」(rule)組成。
系統預設的表為 「filter」,該表中包含了 INPUT、FORWARD 和 OUTPUT 3 個鏈。
每一條鏈中可以有一條或數條規則,每一條規則都是這樣定義的:如果數據包頭符合這樣的條件,就這樣處理這個數據包。當一個數據包到達一個鏈時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件: 如果滿足,系統將根據該條規則所定義的方法處理該數據包;如果不滿足則繼續檢查下一條規則。最後,如果該數據包不符合該鏈中任一條規則的話,系統就會根據該鏈預先定義的策略來處理該數據包。
? table,chain,rule
iptables 可以操縱3 個表:filter 表,nat 表,mangle 表。
NAT 和一般的 mangle 用 -t 參數指定要操作哪個表。filter 是默認的表,如果沒有 -t 參數,就默認對 filter 表操作。
Rule 規則:過濾規則,埠轉發規則等,例如:禁止任何機器 ping 我們的伺服器,可以在伺服器上設置一條規則:
iptables -A INPUT -s ! 127.0.0.1 -p icmp -j DROP
從 –s 開始即是一條規則,-j 前面是規則的條件,-j 開始是規則的行為(目的)。整條命令解釋為,在filter 表中的 INPUT 規則鏈中插入一條規則,所有源地址不為 127.0.0.1 的 icmp 包都被拋棄。
Chain 規則鏈:由一系列規則組成,每個包順序經過 chain 中的每一條規則。chain 又分為系統 chain和用戶創建的 chain。下面先敘述系統 chain。
filter 表的系統 chain: INPUT,FORWAD,OUTPUT
nat 表的系統 chain: PREROUTING,POSTROUTING,OUTPUT
mangle 表的系統 chain: PREROUTING,OUTPUT
每條系統 chain 在確定的位置被檢查。比如在包過濾中,所有的目的地址為本地的包,則會進入INPUT 規則鏈,而從本地出去的包會進入 OUTPUT 規則鏈。
所有的 table 和 chain 開機時都為空,設置 iptables 的方法就是在合適的 table 和系統 chain 中添相應的規則。
--------------------------------------------------------------
IPTABLES 語法:
表: iptables從其使用的三個表(filter、nat、mangle)而得名, 對包過濾只使用 filter 表, filter還是默認表,無需顯示說明.
操作命令: 即添加、刪除、更新等。
鏈:對於包過濾可以針對filter表中的INPUT、OUTPUT、FORWARD鏈,也可以操作用戶自定義的鏈。
規則匹配器:可以指定各種規則匹配,如IP地址、埠、包類型等。
目標動作:當規則匹配一個包時,真正要執行的任務,常用的有:
ACCEPT 允許包通過
DROP 丟棄包
一些擴展的目標還有:
REJECT 拒絕包,丟棄包同時給發送者發送沒有接受的通知
LOG 包有關信息記錄到日誌
TOS 改寫包的TOS值
為使FORWARD規則能夠生效,可使用下面2種方法的某種:
[root@rhlinux root]# vi /proc/sys/net/ipv4/ip_forward
[root@rhlinux root]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@rhlinux root]# vi /etc/sysconfig/network
[root@rhlinux root]# echo "FORWARD_IPV4=true" > /etc/sysconfig/network
--------------------------------------------------------
iptables語法可以簡化為下面的形式:
iptables [-t table] CMD [chain] [rule-matcher] [-j target]
--------------------------------------------------------
常用操作命令:
-A 或 -append 在所選鏈尾加入一條或多條規則
-D 或 -delete 在所選鏈尾部刪除一條或者多條規則
-R 或 -replace 在所選鏈中替換一條匹配規則
-I 或 -insert 以給出的規則號在所選鏈中插入一條或者多條規則. 如果規則號為1,即在鏈頭部.
-L 或 -list 列出指定鏈中的所有規則,如果沒有指定鏈,將列出鏈中的所有規則.
-F 或 -flush 清除指定鏈和表中的所由規則, 假如不指定鏈,那麼所有鏈都將被清空.
-N 或 -new-chain 以指定名創建一條新的用戶自定義鏈,不能與已有鏈名相同.
-X 或 -delete-chain 刪除指定的用戶定義簾,必需保證鏈中的規則都不在使用時才能刪除,若沒有指定鏈,則刪除所有用戶鏈.
-P 或 -policy 為永久簾指定默認規則(內置鏈策略),用戶定義簾沒有預設規則,預設規則也使規則鏈中的最後一條規則,用-L顯示時它在第一行顯示.
-C 或 -check 檢查給定的包是否與指定鏈的規則相匹配.
-Z 或 -zero 將指定簾中所由的規則包位元組(BYTE)計數器清零.
-h 顯示幫助信息.
-------------------------------------------------------------
常用匹配規則器:
-p , [!] protocol 指出要匹配的協議,可以是tcp, udp, icmp, all, 前綴!為邏輯非,表示除該協議外的所有協議.
-s [!] address[/mask] 指定源地址或者地址范圍.
-sport [!] port[:port] 指定源埠號或范圍,可以用埠號也可以用/ETC/SERVICES文件中的名子.
-d [!] address[/mask] 指定目的地址或者地址范圍.
-dport [!] port[:port] 指定目的埠號或范圍,可以用埠號也可以用/ETC/SERVICES文件中的名子.
-icmp-type [!] typename 指定匹配規則的ICMP信息類型(可以使用 iptables -p icmp -h 查看有效的ICMP類型名)
-i [!] interface name[+] 匹配單獨或某種類型的介面,此參數忽略時,默認符合所有介面,介面可以使用"!"來匹配捕食指定介面來的包.參數interface是介面名,如 eth0, eht1, ppp0等,指定一個目前不存在的介面是完全合法的,規則直到介面工作時才起作用,折中指定對於PPP等類似連接是非常有用的."+"表示匹配所有此類型介面.該選項只針對於INPUT,FORWARD和PREROUTING鏈是合法的.
-o [!] interface name[+] 匹配規則的對外網路介面,該選項只針對於OUTPUT,FORWARD,POSTROUTING鏈是合法的.
[!] --syn 僅僅匹配設置了SYN位, 清除了ACK, FIN位的TCP包. 這些包表示請求初始化的TCP連接.阻止從介面來的這樣的包將會阻止外來的TCP連接請求.但輸出的TCP連接請求將不受影響.這個參數僅僅當協議類型設置為了TCP才能使用. 此參數可以使用"!"標志匹配已存在的返回包,一般用於限制網路流量,即只允許已有的,向外發送的連接所返回的包.
----------------------------------------------------------
如何制定永久規則集:
/etc/sysconfig/iptables 文件是 iptables 守護進程調用的默認規則集文件.
可以使用以下命令保存執行過的IPTABLES命令:
/sbin/iptables-save > /etc/sysconfig/iptables
要恢復原來的規則庫,可以使用:
/sbin/iptables-restore < /etc/sysconfig/iptables
iptables命令和route等命令一樣,重啟之後就會恢復,所以:
[root@rhlinux root]# service iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]
令一種方法是 /etc/rc.d/init.d/iptables 是IPTABLES的啟動腳本,所以:
[root@rhlinux root]# /etc/rc.d/init.d/iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]
以上幾種方法只使用某種即可.
若要自定義腳本,可直接使用iptables命令編寫一個規則腳本,並在啟動時執行:
例如若規則使用腳本文件名/etc/fw/rule, 則可以在/etc/rc.d/rc.local中加入以下代碼:
if [-x /etc/fw/rule]; then /etc/fw/sule; fi;
這樣每次啟動都執行該規則腳本,如果用這種方法,建議NTSYSV中停止IPTABLES.
----------------------------------------------------------
實例:
鏈基本操作:
[root@rh34 root]# iptables -L -n
(列出表/鏈中的所有規則,包過濾防火牆默認使用的是filter表,因此使用此命令將列出filter表中所有內容,-n參數可加快顯示速度,也可不加-n參數。)
[root@rh34 root]# iptables -F
(清除預設表filter中所有規則鏈中的規則)
[root@rh34 root]# iptables -X
(清除預設表filter中使用者自定義鏈中的規則)
[root@rh34 root]# iptables -Z
(將指定鏈規則中的所有包位元組計數器清零)
------------------------------------------------------------
設置鏈的默認策略,默認允許所有,或者丟棄所有:
[root@rh34 root]# iptables -P INPUT ACCEPT
[root@rh34 root]# iptables -P OUTPUT ACCEPT
[root@rh34 root]# iptables -P FORWARD ACCEPT
(以上我們在不同方向設置默認允許策略,若丟棄則應是DROP,嚴格意義上防火牆應該是DROP然後再允許特定)
---------------------------------------------------------------
向鏈中添加規則,下面的例子是開放指定網路介面(信任介面時比較實用):
[root@rh34 root]# iptables -A INPUT -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A OUTPUT -o eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -o eth1 -j ACCEPT
--------------------------------------------------------------
使用用戶自定義鏈:
[root@rh34 root]# iptables -N brus
(創建一個用戶自定義名叫brus的鏈)
[root@rh34 root]# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此鏈中設置了一條規則)
[root@rh34 root]# iptables -A INPUT -s 0/0 -d 0/0 -j brus
(向默認的INPUT鏈添加一條規則,使所有包都由brus自定義鏈處理)
----------------------------------------------------------------
基本匹配規則實例:
匹配協議:
iptables -A INPUT -p tcp
(指定匹配協議為TCP)
iptables -A INPUT -p ! tcp
(指定匹配TCP以外的協議)
匹配地址:
iptables -A INPUT -s 192.168.1.1
(匹配主機)
iptables -A INPUT -s 192.168.1.0/24
(匹配網路)
iptables -A FORWARD -s ! 192.168.1.1
(匹配以外的主機)
iptables -A FORWARD -s ! 192.168.1.0/24
(匹配以外的網路)
匹配介面:
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
(匹配某個指定的介面)
iptables -A FORWARD -o ppp+
(匹配所有類型為ppp的介面)
匹配埠:
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
(匹配單一指定源埠)
iptables -A INPUT -p ucp --dport 53
(匹配單一指定目的埠)
iptables -A INPUT -p ucp --dport ! 53
(指定埠以外)
iptables -A INPUT -p tcp --dport 22:80
(指定埠范圍,這里我們實現的是22到80埠)
---------------------------------------------------------------------------------
指定IP碎片的處理:
[root@rh34 root]# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 192.168.1.234 tcp dpt:http
ACCEPT tcp -f 192.168.1.0/24 192.168.1.234 tcp dpt:http
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
----------------------------------------------------------------------------------
設置擴展的規測匹配:
(希望獲得匹配的簡要說明,可使用: iptables -m name_of_match --help)
多埠匹配擴展:
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
(匹配多個源埠)
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
(匹配多個目的埠)
iptables -A INPUT -p tcp -m multiport --port 22,53,80
(匹配多個埠,無論是源還是目的埠)
-----------------------------------------------------------------------------
TCP匹配擴展:
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
(表示SYN、ACK、FIN的標志都要被檢查,但是只有設置了SYN的才匹配)
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
(表示ALL:SYN、ACK、FIN、RST、URG、PSH的標志都被檢查,但是只有設置了SYN和ACK的才匹配)
iptables -p tcp --syn
(選項--syn是以上的一種特殊情況,相當於「--tcp-flags SYN,RST,ACK SYN」的簡寫)
--------------------------------------------------------------------------------
limit速率匹配擴展:
[root@redhatlinux9 root]# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小時允許通過300個數據包)
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定觸發時間的值(默認為5),用來比對瞬間大量數據包的數量。)
(上面的例子用來比對一次同時湧入的數據包是否超過十個,超過此上限的包將直接被丟棄)
[root@redhatlinux9 root]# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3
(假設均勻通過,平均每分鍾3個,那麼觸發值burst保持為3。如果每分鍾通過的包的數目小於3,那麼觸發值busrt將在每個周期(若每分鍾允許通過3個,則周期數為20秒)後加1,但最大值為3。每分鍾要通過的包數量如果超過3,那麼觸發值busrt將減掉超出的數值,例如第二分鍾有4個包,那麼觸發值變為2,同時4個包都可以通過,第三分鍾有6個包,則只能通過5個,觸發值busrt變為0。之後,每分鍾如果包數量小於等於3個,則觸發值busrt將加1,如果每分鍾包數大於3,觸發值busrt將逐漸減少,最終維持為0)
(即每分鍾允許的最大包數量等於限制速率(本例中為3)加上當前的觸發值busrt數。任何情況下,都可以保證3個包通過,觸發值busrt相當於是允許額外的包數量)
---------------------------------------------------------------------------------
基於狀態的匹配擴展(連接跟蹤):
每個網路連接包括以下信息:源和目的地址、源和目的埠號,稱為套接字對(cocket pairs);協議類型、連接狀態(TCP協議)和超時時間等。防火牆把這些叫做狀態(stateful)。能夠監測每個連接狀態的防火牆叫做狀態寶過濾防火牆,除了能完成普通包過濾防火牆的功能外,還在自己的內存中維護一個跟蹤連接狀態的表,所以擁有更大的安全性。
其命令格式如下:
iptables -m state --state [!] state [,state,state,state]
state表示一個用逗號隔開的的列表,用來指定的連接狀態可以有以下4種:
NEW:該包想要開始一個連接(重新連接或將連接重定向)。
RELATED:該包屬於某個已經建立的連接所建立的新連接。例如FTP的數據傳輸連接和控制連接之間就是RELATED關系。
ESTABLISHED:該包屬於某個已經建立的連接。
INVALID:該包不匹配於任何連接,通常這些包會被DROP。
例如:
[root@redhatlinux9 root]# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(匹配已經建立的連接或由已經建立的連接所建立的新連接。即匹配所有的TCP回應包)
[root@redhatlinux9 root]# iptables -A INPUT -m state --state NEW -i ! eth0
(匹配所有從非eth0介面來的連接請求包)
下面是一個被動(Passive)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
[root@redhatlinux9 root]# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
下面是一個主動(Active)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
--------------------------------------------------------------------------------------
日誌記錄:
格式為: -j LOG --log-level 7 --log-prefix "......"
[root@redhatlinux9 root]# iptables -A FORWARD -m tcp -p tcp -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -m icmp -p icmp -f -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
[root@redhatlinux9 root]# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"
------------------------------------------------
回答你的問題:
1:設置為DROP默認不允許,然後你再開啟,這樣比門戶大開再阻止某些服務來的安全(避免遺漏)
2:前面阻止了後面就無效了,有先後順序的.
3:你了解了服務和埠號等即可用規則限制.
② 淺談iptables
iptables是linux系統下用來做防火牆的二進制文件(linux上位於/sbin/iptables,android中位於/system/bin/iptables),底層依賴於內核的netfilter模塊,用來完成封包過濾、封包重定向和網路地址轉換(NAT)等功能(在android上需要root使用)。
舉個例子來簡單看看iptables命令的基本用法。
意思是在nat轉發表的OUTPUT輸出鏈中增加這樣一條規則:倘若OUTPUT輸出鏈攔到了tcp請求,則將其重定向到本地的8123埠。
可以看到iptables中有 表 、 鏈 和 規則 的概念,那麼先通過iptables傳輸數據包的過程來簡單了解下表和鏈是什麼以及他們之間的關系。
可以看到 鏈 就是對數據包傳輸路徑的一種抽象,一個數據包根據其具體場景以固定的順序依次經過PREROUTING、INPUT等各個鏈,在經過各個鏈時,又有不同的表在監聽這個鏈,而nat、filter等 表 中有包含一系列的 規則 ,當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則。
值得注意的是,
至此我們了解了表、鏈和規則是什麼以及他們之間的關系,下面來具體看下 iptables命令的基本用法 。
更多關於各command、parameter的具體含義以及用法可以參考 https://wangchujiang.com/linux-command/c/iptables.html
iptables對網路數據包做過濾或攔截時其維度只能局限於網路數據包收發的ip地址、埠號、網卡、tcp/udp協議,因此可以推測iptables最終是在ip層對網路數據包做的攔截。
那iptables基於netfilter具體是怎麼做到在各個鏈上對數據包做攔截的呢?
/net/ipv4/ip_output.c
/net/ipv4/ip_input.c
/net/ipv4/ip_forward.c
可以看到內核在每一個數據轉發的關鍵節點都調用了NF_HOOK這個宏,來看下NF_HOOK這個宏幹了啥
關於NF_HOOK相關具體邏輯可參見 https://sites.google.com/site/ibms/network-security-development/netfilter%E8%AE%BE%E8%AE%A1%E4%B8%8E%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90
③ iptables命令詳解是什麼
禁止進入本機的,源地址為所有,目的地址為所有,目的埠為TCP埠13,的數據包。
iptables--靜態防火牆。iptables是復雜的,它集成到linux內核中。用戶通過iptables,可以對進出你的計算機的數據包進行過濾。通過iptables命令設置規則,來把守計算機網路——哪些數據允許通過,哪些不能通過,哪些通過的數據進行記錄(log)。
(3)iptables過濾埠號擴展閱讀:
iptables傳輸數據包的過程
① 當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
② 如果數據包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。