iptables主要經過存儲在linux內核中的一個個表來控制IP包的。能夠想象成excel表格。你能夠自定義所需的iptables表。不過已經內置了三張隊列表。html
filter
這是默認的表,包含了內建的鏈INPUT(處理進入的包),FORWORD(處理經過的包)和OUTPUT(處理本地生成的包)nat
這個表被查詢時表示遇到了產生新的鏈接的包,由三個內建的鏈構成:PREROUTING (修改到來的包)、OUTPUT(修改路由以前本地的包)、POSTROUTING(修改準備出去的包)。mangle
這個表用來對指定的包進行修改。它有兩個內建規則:PREROUTING(修改路由以前進入的包)和OUTPUT(修改路由以前本地的包)。iptables包含4個表,5個鏈。其中表是按照對數據包的操做區分的,鏈是按照不一樣的Hook點來區分的,表和鏈其實是netfilter的兩個維度。linux
4個表:filter,nat,mangle,raw,默認表是filter(沒有指定表的時候就是filter表)。表的處理優先級:raw>mangle>nat>filterweb
filter:通常的過濾功能算法
nat:用於nat功能(端口映射,地址映射等)安全
mangle:用於對特定數據包的修改bash
raw:有限級最高,設置raw時通常是爲了避免再讓iptables作數據包的連接跟蹤處理,提升性能服務器
5個鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。網絡
PREROUTING:數據包進入路由表以前app
INPUT:經過路由表後目的地爲本機ssh
FORWARDING:經過路由表後,目的地不爲本機
OUTPUT:由本機產生,向外轉發
POSTROUTIONG:發送到網卡接口以前。
iptables執行規則時,是從從規則表中從上至下順序執行的,若是沒遇到匹配的規則,就一條一條往下執行,若是遇到匹配的規則後,那麼就執行本規則,執行後根據本規則的動做(accept, reject, log等),決定下一步執行的狀況。
用iptables -ADC 來指定鏈的規則,-A添加 -D刪除 -C 修改 iptables - [RI] chain rule num rule-specification[option] 用iptables - RI 經過規則的順序指定 iptables -D chain rule num[option] 刪除指定規則 iptables -[LFZ] [chain][option] 用iptables -LFZ 鏈名 [選項] iptables -[NX] chain 用 -NX 指定鏈 iptables -P chain target[options] 指定鏈的默認目標 iptables -E old-chain-name new-chain-name -E 舊的鏈名 新的鏈名 用新的鏈名取代舊的鏈名 說明 Iptalbes 是用來設置、維護和檢查Linux內核的IP包過濾規則的。 能夠定義不一樣的表,每一個表都包含幾個內部的鏈,也能包含用戶定義的鏈。每一個鏈都是一個規則列表,對對應的包進行匹配:每條規則指定應當如何處理與之相匹配的包。這被稱做'target'(目標),也能夠跳向同一個表內的用戶定義的鏈。 TARGETS 防火牆的規則指定所檢查包的特徵,和目標。若是包不匹配,將送往該鏈中下一條規則檢查;若是匹配,那麼下一條規則由目標值肯定.該目標值能夠是用戶定義的鏈名,或是某個專用值,如ACCEPT[經過], DROP[刪除], QUEUE[排隊], 或者 RETURN[返回]。 ACCEPT 表示讓這個包經過。DROP表示將這個包丟棄。QUEUE表示把這個包傳遞到用戶空間。RETURN表示中止這條鏈的匹配,到前一個鏈的規則從新開始。若是到達了一個內建的鏈(的末端),或者遇到內建鏈的規則是RETURN,包的命運將由鏈準則指定的目標決定。 TABLES 當前有三個表(哪一個表是當前表取決於內核配置選項和當前模塊)。 -t table 這個選項指定命令要操做的匹配包的表。若是內核被配置爲自動加載模塊,這時若模塊沒有加載,(系統)將嘗試(爲該表)加載適合的模塊。這些表以下:filter,這是默認的表,包含了內建的鏈INPUT(處理進入的包)、FORWORD(處理經過的包)和OUTPUT(處理本地生成的包)。nat,這個表被查詢時表示遇到了產生新的鏈接的包,由三個內建的鏈構成:PREROUTING (修改到來的包)、OUTPUT(修改路由以前本地的包)、POSTROUTING(修改準備出去的包)。mangle 這個表用來對指定的包進行修改。它有兩個內建規則:PREROUTING(修改路由以前進入的包)和OUTPUT(修改路由以前本地的包)。 OPTIONS 這些可被iptables識別的選項能夠區分不一樣的種類。 COMMANDS 這些選項指定執行明確的動做:若指令行下沒有其餘規定,該行只能指定一個選項.對於長格式的命令和選項名,所用字母長度只要保證iptables能從其餘選項中區分出該指令就好了。 -A -append 在所選擇的鏈末添加一條或更多規則。當源(地址)或者/與 目的(地址)轉換爲多個地址時,這條規則會加到全部可能的地址(組合)後面。 -D -delete 從所選鏈中刪除一條或更多規則。這條命令能夠有兩種方法:能夠把被刪除規則指定爲鏈中的序號(第一條序號爲1),或者指定爲要匹配的規則。 -R -replace 從選中的鏈中取代一條規則。若是源(地址)或者/與 目的(地址)被轉換爲多地址,該命令會失敗。規則序號從1開始。 -I -insert 根據給出的規則序號向所選鏈中插入一條或更多規則。因此,若是規則序號爲1,規則會被插入鏈的頭部。這也是不指定規則序號時的默認方式。 -L -list 顯示所選鏈的全部規則。若是沒有選擇鏈,全部鏈將被顯示。也能夠和z選項一塊兒使用,這時鏈會被自動列出和歸零。精確輸出受其它所給參數影響。 -F -flush 清空所選鏈。這等於把全部規則一個個的刪除。 --Z -zero 把全部鏈的包及字節的計數器清空。它能夠和 -L配合使用,在清空前察看計數器,請參見前文。 -N -new-chain 根據給出的名稱創建一個新的用戶定義鏈。這必須保證沒有同名的鏈存在。 -X -delete-chain 刪除指定的用戶自定義鏈。這個鏈必須沒有被引用,若是被引用,在刪除以前你必須刪除或者替換與之有關的規則。若是沒有給出參數,這條命令將試着刪除每一個非內建的鏈。 -P -policy 設置鏈的目標規則。 -E -rename-chain 根據用戶給出的名字對指定鏈進行重命名,這僅僅是修飾,對整個表的結構沒有影響。TARGETS參數給出一個合法的目標。只有非用戶自定義鏈可使用規則,並且內建鏈和用戶自定義鏈都不能是規則的目標。 -h Help. 幫助。給出當前命令語法很是簡短的說明。 PARAMETERS 參數 如下參數構成規則詳述,如用於add、delete、replace、append 和 check命令。 -p -protocal [!]protocol 規則或者包檢查(待檢查包)的協議。指定協議能夠是tcp、udp、icmp中的一個或者所有,也能夠是數值,表明這些協議中的某一個。固然也可使用在/etc/protocols中定義的協議名。在協議名前加上"!"表示相反的規則。數字0至關於全部all。Protocol all會匹配全部協議,並且這是缺省時的選項。在和check命令結合時,all能夠不被使用。 -s -source [!] address[/mask] 指定源地址,能夠是主機名、網絡名和清楚的IP地址。mask說明能夠是網絡掩碼或清楚的數字,在網絡掩碼的左邊指定網絡掩碼左邊"1"的個數,所以,mask值爲24等於255.255.255.0。在指定地址前加上"!"說明指定了相反的地址段。標誌 --src 是這個選項的簡寫。 -d --destination [!] address[/mask] 指定目標地址,要獲取詳細說明請參見 -s標誌的說明。標誌 --dst 是這個選項的簡寫。 -j --jump target -j 目標跳轉 指定規則的目標;也就是說,若是包匹配應當作什麼。目標能夠是用戶自定義鏈(不是這條規則所在的),某個會當即決定包的命運的專用內建目標,或者一個擴展(參見下面的EXTENSIONS)。若是規則的這個選項被忽略,那麼匹配的過程不會對包產生影響,不過規則的計數器會增長。 -i -in-interface [!] [name] i -進入的(網絡)接口 [!][名稱] 這是包經由該接口接收的可選的入口名稱,包經過該接口接收(在鏈INPUT、FORWORD和PREROUTING中進入的包)。當在接口名前使用"!"說明後,指的是相反的名稱。若是接口名後面加上"+",則全部以此接口名開頭的接口都會被匹配。若是這個選項被忽略,會假設爲"+",那麼將匹配任意接口。 -o --out-interface [!][name] -o --輸出接口[名稱] 這是包經由該接口送出的可選的出口名稱,包經過該口輸出(在鏈FORWARD、OUTPUT和POSTROUTING中送出的包)。當在接口名前使用"!"說明後,指的是相反的名稱。若是接口名後面加上"+",則全部以此接口名開頭的接口都會被匹配。若是這個選項被忽略,會假設爲"+",那麼將匹配全部任意接口。 [!] -f, --fragment [!] -f --分片 這意味着在分片的包中,規則只詢問第二及之後的片。自那之後因爲沒法判斷這種把包的源端口或目標端口(或者是ICMP類型的),這類包將不能匹配任何指定對他們進行匹配的規則。若是"!"說明用在了"-f"標誌以前,表示相反的意思。 OTHER OPTIONS 其餘選項 還能夠指定下列附加選項: -v --verbose -v --詳細 詳細輸出。這個選項讓list命令顯示接口地址、規則選項(若是有)和TOS(Type of Service)掩碼。包和字節計數器也將被顯示,分別用K、M、G(前綴)表示1000、1,000,000和1,000,000,000倍(不過請參看-x標誌改變它),對於添加,插入,刪除和替換命令,這會使一個或多個規則的相關詳細信息被打印。 -n --numeric -n --數字 數字輸出。IP地址和端口會以數字的形式打印。默認狀況下,程序試顯示主機名、網絡名或者服務(只要可用)。 -x -exact -x -精確 擴展數字。顯示包和字節計數器的精確值,代替用K,M,G表示的約數。這個選項僅能用於 -L 命令。 --line-numbers 當列表顯示規則時,在每一個規則的前面加上行號,與該規則在鏈中的位置相對應。 MATCH EXTENSIONS 對應的擴展 iptables可以使用一些與模塊匹配的擴展包。如下就是含於基本包內的擴展包,並且他們大多數均可以經過在前面加上!來表示相反的意思。 tcp 當 --protocol tcp 被指定,且其餘匹配的擴展未被指定時,這些擴展被裝載。它提供如下選項: --source-port [!] [port[:port]] 源端口或端口範圍指定。這能夠是服務名或端口號。使用格式端口:端口也能夠指定包含的(端口)範圍。若是首端口號被忽略,默認是"0",若是末端口號被忽略,默認是"65535",若是第二個端口號大於第一個,那麼它們會被交換。這個選項可使用 --sport的別名。 --destionation-port [!] [port:[port]] 目標端口或端口範圍指定。這個選項可使用 --dport別名來代替。 --tcp-flags [!] mask comp 匹配指定的TCP標記。第一個參數是咱們要檢查的標記,一個用逗號分開的列表,第二個參數是用逗號分開的標記表,是必須被設置的。標記以下:SYN ACK FIN RST URG PSH ALL NONE。所以這條命令:iptables -A FORWARD -p tcp --tcp-flags SYN, ACK, FIN, RST SYN只匹配那些SYN標記被設置而ACK、FIN和RST標記沒有設置的包。 [!] --syn 只匹配那些設置了SYN位而清除了ACK和FIN位的TCP包。這些包用於TCP鏈接初始化時發出請求;例如,大量的這種包進入一個接口發生堵塞時會阻止進入的TCP鏈接,而出去的TCP鏈接不會受到影響。這等於 --tcp-flags SYN, RST, ACK SYN。若是"--syn"前面有"!"標記,表示相反的意思。 --tcp-option [!] number 匹配設置了TCP選項的。 udp 當protocol udp 被指定,且其餘匹配的擴展未被指定時,這些擴展被裝載,它提供如下選項: --source-port [!] [port:[port]] 源端口或端口範圍指定。詳見 TCP擴展的--source-port選項說明。 --destination-port [!] [port:[port]] 目標端口或端口範圍指定。詳見 TCP擴展的--destination-port選項說明。 icmp 當protocol icmp被指定,且其餘匹配的擴展未被指定時,該擴展被裝載。它提供如下選項: --icmp-type [!] typename 這個選項容許指定ICMP類型,能夠是一個數值型的ICMP類型,或者是某個由命令iptables -p icmp -h所顯示的ICMP類型名。 mac --mac-source [!] address 匹配物理地址。必須是XX:XX:XX:XX:XX這樣的格式。注意它只對來自以太設備並進入PREROUTING、FORWORD和INPUT鏈的包有效。 limit 這個模塊匹配標誌用一個標記桶過濾器一必定速度進行匹配,它和LOG目標結合使用來給出有限的登錄數.當達到這個極限值時,使用這個擴展包的規則將進行匹配.(除非使用了"!"標記) --limit rate 最大平均匹配速率:可賦的值有'/second', '/minute', '/hour', or '/day'這樣的單位,默認是3/hour。 --limit-burst number 待匹配包初始個數的最大值:若前面指定的極限還沒達到這個數值,則概數字加1.默認值爲5 multiport 這個模塊匹配一組源端口或目標端口,最多能夠指定15個端口。只能和-p tcp 或者 -p udp 連着使用。 --source-port [port[, port]] 若是源端口是其中一個給定端口則匹配 --destination-port [port[, port]] 若是目標端口是其中一個給定端口則匹配 --port [port[, port]] 若源端口和目的端口相等並與某個給定端口相等,則匹配。 mark 這個模塊和與netfilter過濾器標記字段匹配(就能夠在下面設置爲使用MARK標記)。 --mark value [/mask] 匹配那些無符號標記值的包(若是指定mask,在比較以前會給掩碼加上邏輯的標記)。 owner 此模塊試爲本地生成包匹配包建立者的不一樣特徵。只能用於OUTPUT鏈,並且即便這樣一些包(如ICMP ping應答)還可能沒有全部者,所以永遠不會匹配。 --uid-owner userid 若是給出有效的user id,那麼匹配它的進程產生的包。 --gid-owner groupid 若是給出有效的group id,那麼匹配它的進程產生的包。 --sid-owner seessionid 根據給出的會話組匹配該進程產生的包。 state 此模塊,當與鏈接跟蹤結合使用時,容許訪問包的鏈接跟蹤狀態。 --state state 這裏state是一個逗號分割的匹配鏈接狀態列表。可能的狀態是:INVALID表示包是未知鏈接,ESTABLISHED表示是雙向傳送的鏈接,NEW表示包爲新的鏈接,不然是非雙向傳送的,而RELATED表示包由新鏈接開始,可是和一個已存在的鏈接在一塊兒,如FTP數據傳送,或者一個ICMP錯誤。 unclean 此模塊沒有可選項,不過它試着匹配那些奇怪的、不常見的包。處在實驗中。 tos 此模塊匹配IP包首部的8位tos(服務類型)字段(也就是說,包含在優先位中)。 --tos tos 這個參數能夠是一個標準名稱,(用iptables -m tos -h 察看該列表),或者數值。 TARGET EXTENSIONS iptables可使用擴展目標模塊:如下都包含在標準版中。 LOG 爲匹配的包開啓內核記錄。當在規則中設置了這一選項後,linux內核會經過printk()打印一些關於所有匹配包的信息(諸如IP包頭字段等)。 --log-level level 記錄級別(數字或參看 syslog.conf(5))。 --log-prefix prefix 在紀錄信息前加上特定的前綴:最多14個字母長,用來和記錄中其餘信息區別。 --log-tcp-sequence 記錄TCP序列號。若是記錄能被用戶讀取那麼這將存在安全隱患。 --log-tcp-options 記錄來自TCP包頭部的選項。 --log-ip-options 記錄來自IP包頭部的選項。 MARK 用來設置包的netfilter標記值。只適用於mangle表。 --set-mark mark REJECT 做爲對匹配的包的響應,返回一個錯誤的包:其餘狀況下和DROP相同。 此目標只適用於INPUT、FORWARD和OUTPUT鏈,和調用這些鏈的用戶自定義鏈。這幾個選項控制返回的錯誤包的特性: --reject-with type Type能夠是icmp-net-unreachable、icmp-host-unreachable、icmp-port-nreachable、icmp-proto-unreachable、 icmp-net-prohibited 或者 icmp-host-prohibited,該類型會返回相應的ICMP錯誤信息(默認是port-unreachable)。選項 echo-reply也是容許的;它只能用於指定ICMP ping包的規則中,生成ping的迴應。最後,選項tcp-reset能夠用於在INPUT鏈中,或自INPUT鏈調用的規則,只匹配TCP協議:將回應一個TCP RST包。 TOS 用來設置IP包的首部八位tos。只能用於mangle表。 --set-tos tos 你可使用一個數值型的TOS 值,或者用iptables -j TOS -h 來查看有效TOS名列表。 MIRROR 這是一個試驗示範目標,可用於轉換IP首部字段中的源地址和目標地址,再傳送該包,並只適用於INPUT、FORWARD和OUTPUT鏈,以及只調用它們的用戶自定義鏈。 SNAT 這個目標只適用於nat表的POSTROUTING鏈。它規定修改包的源地址(此鏈接之後全部的包都會被影響),中止對規則的檢查,它包含選項: --to-source [-][:port-port] 能夠指定一個單一的新的IP地址,一個IP地址範圍,也能夠附加一個端口範圍(只能在指定-p tcp 或者-p udp的規則裏)。若是未指定端口範圍,源端口中512如下的(端口)會被安置爲其餘的512如下的端口;512到1024之間的端口會被安置爲1024如下的,其餘端口會被安置爲1024或以上。若是可能,端口不會被修改。 --to-destiontion [-][:port-port] 能夠指定一個單一的新的IP地址,一個IP地址範圍,也能夠附加一個端口範圍(只能在指定-p tcp 或者-p udp的規則裏)。若是未指定端口範圍,目標端口不會被修改。 MASQUERADE 只用於nat表的POSTROUTING鏈。只能用於動態獲取IP(撥號)鏈接:若是你擁有靜態IP地址,你要用SNAT。假裝至關於給包發出時所通過接口的IP地址設置一個映像,當接口關閉鏈接會終止。這是由於當下一次撥號時未必是相同的接口地址(之後全部創建的鏈接都將關閉)。它有一個選項: --to-ports [-port>] 指定使用的源端口範圍,覆蓋默認的SNAT源地址選擇(見上面)。這個選項只適用於指定了-p tcp或者-p udp的規則。 REDIRECT 只適用於nat表的PREROUTING和OUTPUT鏈,和只調用它們的用戶自定義鏈。它修改包的目標IP地址來發送包到機器自身(本地生成的包被安置爲地址127.0.0.1)。它包含一個選項: --to-ports [ ] 指定使用的目的端口或端口範圍:不指定的話,目標端口不會被修改。只能用於指定了-p tcp 或 -p udp的規則。 DIAGNOSTICS 診斷 不一樣的錯誤信息會打印成標準錯誤:退出代碼0表示正確。相似於不對的或者濫用的命令行參數錯誤會返回錯誤代碼2,其餘錯誤返回代碼爲1。 與ipchains的兼容性 iptables和Rusty Russell的ipchains很是類似。主要區別是INPUT 鏈只用於進入本地主機的包,而OUTPUT只用於自本地主機生成的包。所以每一個包只通過三個鏈的一個;之前轉發的包會通過全部三個鏈。其餘主要區別是 -i 引用進入接口;-o引用輸出接口,二者都適用於進入FORWARD鏈的包。當和可選擴展模塊一塊兒使用默認過濾器表時,iptables是一個純粹的包過濾器。這能大大減小之前對IP假裝和包過濾結合使用的混淆,因此如下選項做了不一樣的處理: -j MASQ -M -S -M -L 在iptables中有幾個不一樣的鏈。
ACCEPT 將封包放行,進行完此處理動做後,將再也不比對其它規則,直接跳往下一個規則煉(nat:postrouting)。 REJECT 攔阻該封包,並傳送封包通知對方,能夠傳送的封包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(這個封包會要求對方關閉聯機),進行完此處理動做後,將再也不比對其它規則,直接 中斷過濾程序。 範例以下: iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset DROP 丟棄封包不予處理,進行完此處理動做後,將再也不比對其它規則,直接中斷過濾程序。 REDIRECT 將封包從新導向到另外一個端口(PNAT),進行完此處理動做後,將 會繼續比對其它規則。 這個功能能夠用來實做通透式 porxy 或用來保護 web 服務器。例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 MASQUERADE 改寫封包來源 IP 爲防火牆 NIC IP,能夠指定 port 對應的範圍,進行完此處理動做後,直接跳往下一個規則煉(mangle:postrouting)。這個功能與 SNAT 略有不一樣,當進行 IP 假裝時,不需指定要假裝成哪一個 IP,IP 會從網卡直接讀取,當使用撥接連線時,IP 一般是由 ISP 公司的 DHCP 服務器指派的,這個時候 MASQUERADE 特別有用。範例以下: iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000 LOG 將封包相關訊息紀錄在 /var/log 中,詳細位置請查閱 /etc/syslog.conf 組態檔,進行完此處理動做後,將會繼續比對其它規則。例如: iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets" SNAT 改寫封包來源 IP 爲某特定 IP 或 IP 範圍,能夠指定 port 對應的範圍,進行完此處理動做後,將直接跳往下一個規則煉(mangle:postrouting)。範例以下: iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000 DNAT 改寫封包目的地 IP 爲某特定 IP 或 IP 範圍,能夠指定 port 對應的範圍,進行完此處理動做後,將會直接跳往下一個規則煉(filter:input 或 filter:forward)。範例以下: iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100 MIRROR 鏡射封包,也就是未來源 IP 與目的地 IP 對調後,將封包送回,進行完此處理動做後,將會中斷過濾程序。 QUEUE 中斷過濾程序,將封包放入隊列,交給其它程序處理。透過自行開發的處理程序,能夠進行其它應用,例如:計算聯機費用.......等。 RETURN 結束在目前規則煉中的過濾程序,返回主規則煉繼續過濾,若是把自訂規則煉當作是一個子程序,那麼這個動做,就至關於提前結束子程序並返回到主程序中。 MARK 將封包標上某個代號,以便提供做爲後續過濾的條件判斷依據,進行完此處理動做後,將會繼續比對其它規則。範例以下: iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
iptables 匹配規則 1. 源地址匹配: a. ip地址匹配 iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP 用「,」分隔多個源地址,地址與「,」之間不能有空格 b. 網段匹配 iptables -t filter -I INPUT -s 192.168.1.0/24 -j DROP c. 反向匹配 iptables -t filter -I INPUT ! -s 192.168.1.10 -j ACCEPT 當源地址不是192.168.1.10時ACCEPT,注意!當源地址是192.168.1.10時,此規則匹配不上,不會由於此規則而拒絕! 2. 目的地址匹配: 參數 -d ,使用方法與源地址匹配一致 3. 協議匹配: 參數 -p :protocol iptables -t filter -A INPUT -p tcp -j ACCEPT -p支持的協議有:tcp, udp, udplite, icmp, icmpv6, ah, sctp等 其中ping屬於icmp協議,ssh屬於tcp協議 4. 網卡匹配 iptables -t filter -I INPUT -i eth0 -j ACCEPT 參數 -i, -o, 其中-i表示入網卡,-o表示出網卡。-i參數可用於prerouting,forward,input。3個鏈。-o參數可用於forward,output,postrouting。3個鏈。也可用使用「!」表示反向匹配 5. 擴展匹配 端口匹配: 上述4種匹配規則都屬於基本匹配,端口匹配屬於擴展匹配,須要導入擴展模塊而且須要指定匹配協議 例: iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -j ACCEPT 其中 -p 指定協議,-m 指定擴展模塊,--dport/--sport 指定目的端口/源端口(注意雙中橫線),-m可缺省,默認使用與-p相同的模塊 其餘用法: 反向匹配: ! --dport 22 目的端口不等於22 區間匹配: --dport 22:25 目的端口在[22,25]之間 --dport 22: 目的端口在[22:65535]之間 --dport :80 目的端口在[0:80]之間 離散端口匹配: iptables -t filter -I INPUT -p tcp -m multiport --dport 1,2,3,4 連續ip匹配: 例: iptables -t filter -I INPUT -m iprange --src-range 1.1.1.1-1.1.1.4 -j DROP 也可使用!來取反,如:iptables -t filter -I INPUT -m iprange ! --src-range 1.1.1.1-1.1.1.4 -j DROP 報文內容匹配: 例: iptables -t filter -I INPUT -m string --algo bm --string "XXOO" -j ACCEPT 含義:當報文中含有「XXOO」時,經過報文。字符串匹配算法使用 bm 其中: --algo 指定匹配算法。包括bm與kmp。 --string 須要匹配的字符串 時間段匹配: 例: iptables -t filter -I INPUT -m time --timestart 09:00:00 --timestop 19:00:00 -p tcp --dport 80 -j ACCEPT 含義:在09到19點時間內,拒絕全部從80端口進入的tcp請求 time 模塊參數 --timestart 起始時間 --timeend 結束時間 --weekdays 星期n,可選值有1到7,也有Mon,Tue,Wed,Thu,Fri,Sat,Sun。可使用!取反 --monthdays 一個月的第幾天。可使用!取反 --datestart 一個月的起始天數 --dateend 一個月的結束天數 例: iptables -t filter -I INPUT -m time ! --weekdays 6,7 ! --monthdays 22.23 --timestart 09:00:00 --timestop 19:00:00 --datestart 2018-10-10 --datestop 2018-12-12 -p tcp --dport 80 -j ACCEPT 含義:當(今天不是星期6或星期7)且(今天不本月的22或23好)且(當前時間在09到19點之間)且(今天的日誌在2018-10-10到2018-12-12號之間)且(是TCP協議)且(目標端口是80)則接受請求 鏈接數匹配: 例:iptables -I INPUT -m connlimit --connlimit-above 2 --connlimit-mask 24 -j ACCEPT 含義: 當ip地址是24位掩碼,且鏈接數超過2則接受請求 --connlimit-above 鏈接數超過n時 --connlimit-upto 等價於 !--connlimit-above 當鏈接數未達到之低昂鏈接數時 報文速率限制: 例:iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT 含義:當每分鐘收到包數量在10之內,則接受請求 可是當每分鐘數量超過10個時,沒有相應邏輯,當想要完成超過10請求每分鐘則拒絕請求的邏輯須要配合一條拒絕邏輯使用。如: 參數: --limit-brust 表示「令牌桶」算法中令牌的數量,默認爲5 --limit 結合令牌桶算法,能夠理解爲生成令牌的速率。白話可粗略理解爲放過包的速率 可選速率限制參數: /second,/minute,/hour,/day表示n個請求每秒/分/小時/天 其中:令牌桶邏輯爲:每創建一個請求須要消耗一個令牌,請求釋放時銷燬令牌。當沒有可用令牌時,請求被拒絕。在默認5令牌的狀況下,10/minute 不是每6秒接受一個請求,而是每6秒生成一個令牌到令牌桶。只要桶中有令牌請求就能夠經過。limit-brust表示令牌桶中的令牌最大值 icmp協議限制: 常見的使用icmp協議的操做就是ping,能夠經過此模塊限制ping的接收與發送 例:iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT 含義:不接受ping請求,可是能夠執行ping操做 --icmp-type表示 icmp請求類型,8/0分別表示type/code。細節見下圖(來自朱雙印先生的博客http://www.zsythink.net/archives/1588) 請求state限制: 請求有5種狀態:NEW,ESTABLISHED,RELATED,INVALID,UNTRACKED五種 若是咱們的機器不但願被別人主動鏈接,只但願接接受別人對咱們的請求作出的相應,可這樣作 iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 表示接受ESTABLISHED和RELATED的請求,固然想要達到不響應別人的請求,須要在此以後加一條拒絕全部請求
查看某個表中的iptables規則,默認的是filter表
iptables -t [table] -L
首先開啓IP轉發功能,默認是關閉的
臨時修改:修改事後就立刻生效,但若是系統重啓後則又恢復爲默認值0。
# echo 1 >/proc/sys/net/ipv4/ip_forward
永久修改方法1: vi /etc/sysctl.conf # 找到下面的值並將0改爲1 默認值是禁止ip轉發,修改成即開啓ip轉發功能。 net.ipv4.ip_forward = 1 # sysctl –p(使之當即生效)
01
#永久修改方法2:
echo 'net.ipv4.ip_forword=1' >> /etc/sysctl.conf sysctl -p
配置端口轉發
# iptables -t nat -A PREROUTING -p tcp -d 113.108.110.61 --dport 728 -j DNAT --to-destination 172.16.4.97:80 PREROUTING (修改到來的包)DNAT 改寫封包目的地 # iptables -t nat -A POSTROUTING -p tcp -s 172.16.4.97 --sport 80 -j SNAT --to-source 172.16.4.247 POSTROUTING(修改準備出去的包)SNAT 改寫封包來源 # service iptables save (將當前規則保存到 /etc/sysconfig/iptables)
或者,你也能夠直接修改文件:/etc/sysconfig/iptables
-A PREROUTING -d 172.16.4.247/32 -p tcp -m tcp --dport 728 -j DNAT --to-destination 172.16.4.97:80
-A POSTROUTING -s 172.16.4.97/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 172.16.4.247
最後不要忘了開放728端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 728 -j ACCEPT
配置完成後,記得重啓防火牆:
# service iptables restart
tcp 端口範圍映射 # iptables -t nat -A PREROUTING -p tcp --dport 2000:2500 -j DNAT --to 192.168.66.2:2000-2500
端口轉發匹配驗證 nat內機器輸出源端口是9999
nat外機器:發出的數據包源端口是9999, 目的端口是5500-5555
sudo nc -v -u -p 9999 172.16.20.183 5500-5555