Linux iptables 防火墙相关命令介绍及使用
一.? Linux 防火墻的啟動和關閉
1.1 啟動命令
[root@singledb ~]# service iptables stop
Flushing firewall rules:?????????????????????????????????? [? OK? ]
Setting chains to policy ACCEPT: filter nat??????????????? [? OK? ]
Unloading iptables modules:??????????????????????????????? [? OK? ]
[root@singledb ~]# service iptables start
Applying iptables firewall rules:????????????????????????? [? OK? ]
Loading additional iptables modules: ip_conntrack_netbios_n[? OK? ]
?
1.2 設置開機自啟動
[root@singledb ~]# chkconfig iptables off
[root@singledb ~]# chkconfig --list iptables
iptables??????? 0:off?? 1:off?? 2:off?? 3:off?? 4:off?? 5:off?? 6:off
[root@singledb ~]# chkconfig iptables on
[root@singledb ~]# chkconfig --list iptables
iptables??????? 0:off?? 1:off?? 2:on??? 3:on??? 4:on??? 5:on??? 6:off
[root@singledb ~]#
?
?????? 在chkconfig --list 命令,列出了0到6個數字的狀態。Linux 啟動有7種模式。 這些數據分別代表這幾種模式下,iptables的狀態。? 3 是命令行模式,5 是有界面的。
?
關于這幾種模式,具體參考我的BLog:
?????? Linux 開機引導與關機過程 http://www.2cto.com/os/201202/119412.html
?
5.1 init 和運行級
?????? 傳統的init 定義了7個運行級(run level),每一個級別都代表系統應該補充運行的某些特定服務:
????????????? (1)0級是完全關閉系統的級別
????????????? (2)1級或者S級代表單用戶模式
????????????? (3)2-5 級 是多用戶級別
????????????? (4)6級 是 重新引導的級別
?
?
二. Iptables參數
?????? Iptalbes 是用來設置、維護和檢查Linux內核的IP包過濾規則的。可以定義不同的表,每個表都包含幾個內部的鏈,也能包含用戶定義的鏈。每個鏈都是一個規則列 表,對對應的包進行匹配:每條規則指定應當如何處理與之相匹配的包。這被稱作'target'(目標),也可以跳向同一個表內的用戶定義的鏈。
?
[root@singledb ~]# iptables --help
iptables v1.3.5
?
Usage: iptables -[AD] chain rule-specification [options]
?????? iptables -[RI] chain rulenum rule-specification [options]
?????? iptables -D chain rulenum [options]
?????? iptables -[LFZ] [chain] [options]
?????? iptables -[NX] chain
?????? iptables -E old-chain-name new-chain-name
?????? iptables -P chain target [options]
?????? iptables -h (print this help information)
?
Commands:
Either long or short options are allowed.
? --append? -A chain??????????? Append to chain
? --delete? -D chain??????????? Delete matching rule from chain
? --delete? -D chain rulenum
??????????????????????????????? Delete rule rulenum (1 = first) from chain
? --insert? -I chain [rulenum]
??????????????????????????????? Insert in chain as rulenum (default 1=first)
? --replace -R chain rulenum
????????????? ??????????????????Replace rule rulenum (1 = first) in chain
? --list??? -L [chain]????????? List the rules in a chain or all chains
? --flush?? -F [chain]????????? Delete all rules in? chain or all chains
? --zero??? -Z [chain]????????? Zero counters in chain or all chains
? --new???? -N chain??????????? Create a new user-defined chain
? --delete-chain
??????????? -X [chain]????????? Delete a user-defined chain
? --policy? -P chain target
??????????????????????????????? Change policy on chain to target
? --rename-chain
??????????? -E old-chain new-chain
??????????????????????????????? Change chain name, (moving any references)
Options:
? --proto?????? -p [!] proto??? protocol: by number or name, eg. `tcp'
? --source????? -s [!] address[/mask]
??????????????????????????????? source specification
? --destination -d [!] address[/mask]
??????????????????????????????? destination specification
? --in-interface -i [!] input name[+]
??????????????????????????????? network interface name ([+] for wildcard)
? --jump??????? -j target
??????????????????????????????? target for rule (may load target extension)
? --goto????? -g chain
????????????????????????????? jump to chain with no return
? --match?????? -m match
??????????????????????????????? extended match (may load extension)
? --numeric???? -n????????????? numeric output of addresses and ports
? --out-interface -o [!] output name[+]
??????????????????????????????? network interface name ([+] for wildcard)
? --table?????? -t table??????? table to manipulate (default: `filter')
? --verbose???? -v????????????? verbose mode
? --line-numbers??????????????? print line numbers when listing
? --exact?????? -x????????????? expand numbers (display exact values)
[!] --fragment? -f????????????? match second or further fragments only
? --modprobe=<command>????????? try to insert modules using this command
? --set-counters PKTS BYTES???? set the counter during insert/append
[!] --version?? -V????????????? print package version.
[root@singledb ~]#
?
2.1? TARGETS www.2cto.com
???? ??防火墻的規則指定所檢查包的特征和目標。如果包不匹配,將送往該鏈中下一條規則檢查;如果匹配,那么下一條規則由目標值確定.該目標值可以是用戶定義 的鏈名,或是某個專用值,如ACCEPT[通過], DROP[刪除], QUEUE[排隊], 或者RETURN[返回]。
?????? ACCEPT 表示讓這個包通過。DROP表示將這個包丟棄。QUEUE表示把這個包傳遞到用戶空間。RETURN表示停止這條鏈的匹配,到前一個鏈的規則重新開始。如 果到達了一個內建的鏈(的末端),或者遇到內建鏈的規則是RETURN,包的命運將由鏈準則指定的目標決定。
?
2.2? TABLES
?????? 當前有三個表(哪個表是當前表取決于內核配置選項和當前模塊)。
-t table 這個選項指定命令要操作的匹配包的表。如果內核被配置為自動加載模塊,這時若模塊沒有加載,(系統)將嘗試(為該表)加載適合的模塊。這些表如下:
?????? (1)filter 表:這是默認的表,包含了內建的鏈INPUT(處理進入的包)、FORWORD(處理通過的包)和OUTPUT(處理本地生成的包)。
?????? (2)nat 表: 這個表被查詢時表示遇到了產生新的連接的包,由三個內建的鏈構成:PREROUTING (修改到來的包)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改準備出去的包)。
?????? (3)mangle表: 這個表用來對指定的包進行修改。它有兩個內建規則:PREROUTING(修改路由之前進入的包)和OUTPUT(修改路由之前本地的包)。
?
2.3? OPTIONS :
?????? 這些可被iptables識別的選項可以區分不同的種類。
?
2.4? COMMANDS
?????? 這些選項指定執行明確的動作:若指令行下沒有其他規定,該行只能指定一個選項.對于長格式的命令和選項名,所用字母長度只要保證iptables能從其他選項中區分出該指令就行了。
(1)-A -append
?????? 在所選擇的鏈末添加一條或更多規則。當源(地址)或者/與 目的(地址)轉換為多個地址時,這條規則會加到所有可能的地址(組合)后面。
(2)-D -delete
?????? 從所選鏈中刪除一條或更多規則。這條命令可以有兩種方法:可以把被刪除規則指定為鏈中的序號(第一條序號為1),或者指定為要匹配的規則。
(3)-R -replace
?????? 從選中的鏈中取代一條規則。如果源(地址)或者/與 目的(地址)被轉換為多地址,該命令會失敗。規則序號從1開始。
(4)-I -insert
?????? 根據給出的規則序號向所選鏈中插入一條或更多規則。所以,如果規則序號為1,規則會被插入鏈的頭部。這也是不指定規則序號時的默認方式。
(5)-L -list
?????? 顯示所選鏈的所有規則。如果沒有選擇鏈,所有鏈將被顯示。也可以和z選項一起使用,這時鏈會被自動列出和歸零。精確輸出受其它所給參數影響。
(6)-F -flush
?????? 清空所選鏈。這等于把所有規則一個個的刪除。
(7)--Z -zero
?????? 把所有鏈的包及字節的計數器清空。它可以和-L配合使用,在清空前察看計數器,請參見前文。
(8)-N -new-chain
?????? 根據給出的名稱建立一個新的用戶定義鏈。這必須保證沒有同名的鏈存在。
(9)-X -delete-chain
?????? 刪除指定的用戶自定義鏈。這個鏈必須沒有被引用,如果被引用,在刪除之前你必須刪除或者替換與之有關的規則。如果沒有給出參數,這條命令將試著刪除每個非內建的鏈。
(10)-P -policy
?????? 設置鏈的目標規則。
(11)-E -rename-chain
?????? 根據用戶給出的名字對指定鏈進行重命名,這僅僅是修飾,對整個表的結構沒有影響。TARGETS參數給出一個合法的目標。只有非用戶自定義鏈可以使用規則,而且內建鏈和用戶自定義鏈都不能是規則的目標。
(12)-h Help.
? ?????幫助。給出當前命令語法非常簡短的說明。
?
2.5? PARAMETERS
以下參數構成規則詳述,如用于add、delete、replace、append 和check命令。
(1)-p -protocal [!]protocol
?????? 規則或者包檢查(待檢查包)的協議。指定協議可以是tcp、udp、icmp中的一個或者全部,也可以是數值,代表這些協議中的某一個。當然也可以使用在 /etc/protocols中定義的協議名。在協議名前加上"!"表示相反的規則。數字0相當于所有all。Protocol all會匹配所有協議,而且這是缺省時的選項。在和check命令結合時,all可以不被使用。
(2)-s -source [!] address[/mask]
?????? 指定源地址,可以是主機名、網絡名和清楚的IP地址。mask說明可以是網絡掩碼或清楚的數字,在網絡掩碼的左邊指定網絡掩碼左邊"1"的個數,因 此,mask值為24等于255.255.255.0。在指定地址前加上"!"說明指定了相反的地址段。標志--src 是這個選項的簡寫。
(3)-d --destination [!] address[/mask]
?????? 指定目標地址,要獲取詳細說明請參見-s標志的說明。標志--dst 是這個選項的簡寫。
(4)-j --jump target
?????? -j 目標跳轉,指定規則的目標;也就是說,如果包匹配應當做什么。目標可以是用戶自定義鏈(不是這條規則所在的),某個會立即決定包的命運的專用內建目標,或 者一個擴展(參見下面的EXTENSIONS)。如果規則的這個選項被忽略,那么匹配的過程不會對包產生影響,不過規則的計數器會增加。
(5)-i -in-interface [!] [name]
?????? i -進入的(網絡)接口[!][名稱] ,這是包經由該接口接收的可選的入口名稱,包通過該接口接收(在鏈INPUT、FORWORD和PREROUTING中進入的包)。當在接口名前使 用"!" 說明后,指的是相反的名稱。如果接口名后面加上"+",則所有以此接口名開頭的接口都會被匹配。如果這個選項被忽略,會假設為"+",那么將匹配任意接 口。
(6)-o --out-interface [!][name]
?????? -o --輸出接口[名稱] ,這是包經由該接口送出的可選的出口名稱,包通過該口輸出(在鏈FORWARD、OUTPUT和POSTROUTING中送出的包)。當在接口名前使 用"! "說明后,指的是相反的名稱。如果接口名后面加上"+",則所有以此接口名開頭的接口都會被匹配。如果這個選項被忽略,會假設為"+",那么將匹配所有任 意接口。
(7)[!] -f, --fragment
?????? [!] -f --分片,這意味著在分片的包中,規則只詢問第二及以后的片。自那以后由于無法判斷這種把包的源端口或目標端口(或者是ICMP類型的),這類包將不能匹 配任何指定對他們進行匹配的規則。如果"!"說明用在了"-f"標志之前,表示相反的意思。
?
2.6? OTHER OPTIONS
?????? 還可以指定下列附加選項:
(1)-v --verbose
?????? -v --詳細,詳細輸出。這個選項讓list命令顯示接口地址、規則選項(如果有)和TOS(Type of Service)掩碼。包和字節計數器也將被顯示,分別用K、M、G(前綴)表示1000、1,000,000和1,000,000,000倍(不過請參 看-x標志改變它),對于添加,插入,刪除和替換命令,這會使一個或多個規則的相關詳細信息被打印。
(2)-n --numeric
?????? -n --數字,數字輸出。IP地址和端口會以數字的形式打印。默認情況下,程序試顯示主機名、網絡名或者服務(只要可用)。
(3)-x -exact
?????? -x -精確,擴展數字。顯示包和字節計數器的精確值,代替用K,M,G表示的約數。這個選項僅能用于-L 命令。
(4)--line-numbers
?????? 當列表顯示規則時,在每個規則的前面加上行號,與該規則在鏈中的位置相對應。
?
2.7? MATCH EXTENSIONS
?????? iptables能夠使用一些與模塊匹配的擴展包。以下就是含于基本包內的擴展包,而且他們大多數都可以通過在前面加上!來表示相反的意思。
2.7.1 tcp
?????? 當--protocol tcp 被指定,且其他匹配的擴展未被指定時,這些擴展被裝載。它提供以下選項:
(1)--source-port [!] [port[ort]
?????? 源端口或端口范圍指定。這可以是服務名或端口號。使用格式端口:端口也可以指定包含的(端口)范圍。如果首端口號被忽略,默認是"0",如果末端口號被忽 略,默認是"65535",如果第二個端口號大于第一個,那么它們會被交換。這個選項可以使用--sport的別名。
(2)--destionation-port [!] [port:[port]
?????? 目標端口或端口范圍指定。這個選項可以使用--dport別名來代替。
(3)--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標記沒有設置的包。
(4)[!] --syn
?????? 只匹配那些設置了SYN位而清除了ACK和FIN位的TCP包。這些包用于TCP連接初始化時發出請求;例如,大量的這種包進入一個接口發生堵塞時會阻止 進入的TCP連接,而出去的TCP連接不會受到影響。這等于--tcp-flags SYN, RST, ACK SYN。如果"--syn"前面有"!"標記,表示相反的意思。
(5)--tcp-option [!] number
?????? 匹配設置了TCP選項的。
2.7.2? udp
?????? 當protocol udp 被指定,且其他匹配的擴展未被指定時,這些擴展被裝載,它提供以下選項:
(1)--source-port [!] [port:[port]
?????? 源端口或端口范圍指定。詳見TCP擴展的--source-port選項說明。
(2)--destination-port [!] [port:[port]
?????? 目標端口或端口范圍指定。詳見TCP擴展的--destination-port選項說明。
2.7.3? icmp
?????? 當protocol icmp被指定,且其他匹配的擴展未被指定時,該擴展被裝載。它提供以下選項:
(1)--icmp-type [!] typename
?????? 這個選項允許指定ICMP類型,可以是一個數值型的ICMP類型,或者是某個由命令iptables -p icmp -h所顯示的ICMP類型名。
2.7.4? mac
--mac-source [!] address
?????? 匹配物理地址。必須是XX:XX:XX:XX:XX這樣的格式。注意它只對來自以太設備并進入PREROUTING、FORWORD和INPUT鏈的包有效。
2.7.5 limit
?????? 這個模塊匹配標志用一個標記桶過濾器一一定速度進行匹配,它和LOG目標結合使用來給出有限的登陸數.當達到這個極限值時,使用這個擴展包的規則將進行匹配.(除非使用了"!"標記)
(1)--limit rate
?????? 最大平均匹配速率:可賦的值有'/second', '/minute', '/hour', or '/day'這樣的單位,默認是3/hour。
(2)--limit-burst number
?????? 待匹配包初始個數的最大值:若前面指定的極限還沒達到這個數值,則概數字加1.默認值為5
2.7.6 multiport
?????? 這個模塊匹配一組源端口或目標端口,最多可以指定15個端口。只能和-p tcp 或者-p udp 連著使用。
(1)--source-port [port[, port]
?????? 如果源端口是其中一個給定端口則匹配
(2)--destination-port [port[, port]
?????? 如果目標端口是其中一個給定端口則匹配
(3)--port [port[, port]
?????? 若源端口和目的端口相等并與某個給定端口相等,則匹配。
2.7.7 mark
?????? 這個模塊和與netfilter過濾器標記字段匹配(就可以在下面設置為使用MARK標記)。
--mark value [/mask]
?????? 匹配那些無符號標記值的包(如果指定mask,在比較之前會給掩碼加上邏輯的標記)。
2.7.8 owner
?????? 此模塊試為本地生成包匹配包創建者的不同特征。只能用于OUTPUT鏈,而且即使這樣一些包(如ICMP ping應答)還可能沒有所有者,因此永遠不會匹配。
(1)--uid-owner userid
?????? 如果給出有效的user id,那么匹配它的進程產生的包。
(2)--gid-owner groupid
?????? 如果給出有效的group id,那么匹配它的進程產生的包。
(3)--sid-owner seessionid
?????? 根據給出的會話組匹配該進程產生的包。
2.7.9? state
?????? 此模塊,當與連接跟蹤結合使用時,允許訪問包的連接跟蹤狀態。
--state state
?????? 這里state是一個逗號分割的匹配連接狀態列表。可能的狀態是:INVALID表示包是未知連接,ESTABLISHED表示是雙向傳送的連接,NEW 表示包為新的連接,否則是非雙向傳送的,而RELATED表示包由新連接開始,但是和一個已存在的連接在一起,如FTP數據傳送,或者一個ICMP錯誤。
2.7.10? unclean
?????? 此模塊沒有可選項,不過它試著匹配那些奇怪的、不常見的包。處在實驗中。
2.7.11? tos
?????? 此模塊匹配IP包首部的8位tos(服務類型)字段(也就是說,包含在優先位中)。
--tos tos
?????? 這個參數可以是一個標準名稱,(用iptables -m tos -h 察看該列表),或者數值。
2.8? LOG
?????? 為匹配的包開啟內核記錄。當在規則中設置了這一選項后,linux內核會通過printk()打印一些關于全部匹配包的信息(諸如IP包頭字段等)。
(1)--log-level level
?????? 記錄級別(數字或參看syslog.conf(5))。
(2)--log-prefix prefix
?????? 在紀錄信息前加上特定的前綴:最多14個字母長,用來和記錄中其他信息區別。
(3)--log-tcp-sequence
?????? 記錄TCP序列號。如果記錄能被用戶讀取那么這將存在安全隱患。
(4)--log-tcp-options
?????? 記錄來自TCP包頭部的選項。
(5)--log-ip-options
?????? 記錄來自IP包頭部的選項。
2.9? MARK
?????? 用來設置包的netfilter標記值。只適用于mangle表。
--set-mark mark
?
2.10 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包。
?
2.11 MIRROR
???? 這是一個試驗示范目標,可用于轉換IP首部字段中的源地址和目標地址,再傳送該包,并只適用于INPUT、FORWARD和OUTPUT鏈,以及只調用它們的用戶自定義鏈。
?
2.12? SNAT
?????? 這個目標只適用于nat表的POSTROUTING鏈。它規定修改包的源地址(此連接以后所有的包都會被影響),停止對規則的檢查,它包含選項:
(1)--to-source [-][ort-port]
?????? 可以指定一個單一的新的IP地址,一個IP地址范圍,也可以附加一個端口范圍(只能在指定-p tcp 或者-p udp的規則里)。如果未指定端口范圍,源端口中512以下的(端口)會被安置為其他的512以下的端口;512到1024之間的端口會被安置為1024 以下的,其他端口會被安置為1024或以上。如果可能,端口不會被修改。
(2)--to-destiontion [-][ort-port]
?????? 可以指定一個單一的新的IP地址,一個IP地址范圍,也可以附加一個端口范圍(只能在指定-p tcp 或者-p udp的規則里)。如果未指定端口范圍,目標端口不會被修改。
?
2.13? MASQUERADE
?????? 只用于nat表的POSTROUTING鏈。只能用于動態獲取IP(撥號)連接:如果你擁有靜態IP地址,你要用SNAT。偽裝相當于給包發出時所經過接 口的IP地址設置一個映像,當接口關閉連接會終止。這是因為當下一次撥號時未必是相同的接口地址(以后所有建立的連接都將關閉)。它有一個選項:
--to-ports [-port>]
?????? 指定使用的源端口范圍,覆蓋默認的SNAT源地址選擇(見上面)。這個選項只適用于指定了-p tcp或者-p udp的規則。
?
2.14? REDIRECT
?????? 只適用于nat表的PREROUTING和OUTPUT鏈,和只調用它們的用戶自定義鏈。它修改包的目標IP地址來發送包到機器自身(本地生成的包被安置為地址127.0.0.1)。它包含一個選項:
--to-ports []
?????? 指定使用的目的端口或端口范圍:不指定的話,目標端口不會被修改。只能用于指定了-p tcp 或-p udp的規則。
?
2.15? DIAGNOSTICS
?????? 診斷,不同的錯誤信息會打印成標準錯誤:退出代碼0表示正確。類似于不對的或者濫用的命令行參數錯誤會返回錯誤代碼2,其他錯誤返回代碼為1。
?
2.16? COMPATIBILITY WITH IPCHAINS
?????? 與ipchains的兼容性, iptables和Rusty Russell的ipchains非常相似。主要區別是INPUT 鏈只用于進入本地主機的包,而OUTPUT只用于自本地主機生成的包。因此每個包只經過三個鏈的一個;以前轉發的包會經過所有三個鏈。其他主要區別是-i 引用進入接口;-o引用輸出接口,兩者都適用于進入FORWARD鏈的包。當和可選擴展模塊一起使用默認過濾器表時,iptables是一個純粹的包過濾 器。這能大大減少以前對IP偽裝和包過濾結合使用的混淆,所以以下選項作了不同的處理:
-j MASQ
-M -S
-M -L
?
三.? Iptables 示例
1、查看本機關于IPTABLES的設置情況:
[root@singledb ~]# iptables -L -n
Chain FORWARD (policy ACCEPT)
target???? prot opt source?????????????? destination???????
ACCEPT???? all? --? 0.0.0.0/0??????????? 192.168.122.0/24??? state RELATED,ESTABLISHED
ACCEPT???? all? --? 192.168.122.0/24???? 0.0.0.0/0?????????
?
這里面顯示的IP地址加上網絡號, 這里網絡號是/24。 關于IP 地址內容,參考Blog:
?????? IP(Internet Protocal) 地址 說明
?????? http://blog.csdn.net/tianlesoftware/archive/2011/02/25/6207289.aspx
?
2.? Iptables 保存
?????? iptables的配置和其他用命令配置IP一樣,重起就會失去作用,可以用如下兩種方式進行保存。
# service iptables save
或者:
# iptables-save > /etc/sysconfig/iptables
?
?????? /etc/sysconfig/iptables 是默認的保存位置。 在/etc/sysconfig 目錄下還有一個iptables的配置文件:etc/sysconfig/iptables-config
?
注意:一般不建議用戶手工修改這個文件的內容,這個文件只用于保存啟動iptables時,需要自動應用的防火墻規則。
?
保存之后,把防火墻重啟一下,才會生效。
??? # service iptables restart
?
3、清除原有規則(慎用):
# iptables -F --> 清除預設表filter中的所有規則鏈的規則
# iptables -X --> 清除預設表filter中使用者自定鏈中的規則
?
4、設定預設規則
查看規則的狀態:
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target???? prot opt source?????????????? destination???????
Chain FORWARD (policy ACCEPT)
target???? prot opt source?????????????? destination???????
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination??????????
?
更改規則:
?[root@tp ~]# iptables -P INPUT DROP
?[root@tp ~]# iptables -P OUTPUT ACCEPT
?[root@tp ~]# iptables -P FORWARD DROP
?
如果是ssh連接,連接會中斷。
?
?????? 上面的意思是,當超出了IPTABLES里filter表里的兩個鏈規則(INPUT,FORWARD)時,不在這兩個規則里的數據包就DROP(放 棄).應該說這樣配置是很安全的.我們要控制流入數據包。而對于OUTPUT鏈,也就是流出的包我們不用做太多限制,而是采取ACCEPT。
?????? INPUT,FORWARD兩個鏈采用的是允許什么包通過,而OUTPUT鏈采用的是不允許什么包通過。 這樣設置還是挺合理的,當然你也可以三個鏈都DROP,但這樣做我認為是沒有必要的,而且要寫的規則就會增加.但如果你只想要有限的幾個規則是,如只做 WEB服務器.還是推薦三個鏈都是DROP.
?
5、添加規則.
???? 首先添加INPUT鏈, 如我們要開啟22端口:
??? # iptables -A INPUT -p tcp --dport 22 -j ACCEPT
???? 注意:如果你把OUTPUT 設置成DROP的就要寫上下面的規則,好多人都是忘了寫這一規則導致始終無法SSH。
???? # iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
?
6、端口操作相關示例:
?
6.1 添加端口
(1)??? 允許源地址為x.x.x.x/x的主機通過22(ssh)端口.
iptables -A INPUT -p tcp -s x.x.x.x/x --dport 22 -j ACCEPT
(2)允許80(http)端口的數據包進入
?????? iptables -A INPUT -p tcp --dport 80 -j ACCEPT
(3)允許110(pop3)端口的數據包進入,如果不加這規則,就只能通過web頁面來收信(無法用OE或Foxmail等來收)
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
(4) 允許25(smtp)端口的數據包進入,如果不加這規則,就只能通過web頁面來發信(無法用OE或Foxmail等來發)
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
(5)允許21(ftp)端口的數據包進入(傳數據)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
(6)允許20(ftp)端口的數據包進入(執行ftp命令,如dir等)
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
(7)允許53(dns)端口的數據包進入(tcp)
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
(8)允許53(dns)端口的數據包進入(udp)
iptables -A INPUT -p udp --dport 53 -j ACCEPT
(9)允許ICMP包通過,也就是允許ping
iptables -A INPUT -p icmp -j ACCEPT
(10)利用iptables 對連接狀態的支持
?????? iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(11)把INPUT鏈的默認規則設置為DROP
?????? iptables -P INPUT DROP
?
6.2 查看端口信息
[root@singledb ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target???? prot opt source?????????????? destination???????
ACCEPT???? tcp? --? 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp dpt:22
ACCEPT???? tcp? --? 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp dpt:2222
?
?????? 端口的信息添加到相信的鏈之后,可以查看到,如之前添加的22端口。 就在INPUT鏈。
?
6.3? 刪除端口信息
[root@singledb ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
[root@singledb ~]# iptables -D INPUT -p tcp --dport 2222 -j ACCEPT
[root@singledb ~]# iptables -L -n
?
刪除后,我們在次查看,INPUT 鏈中就沒有了相關的信息。
?
7、iptables限制IP訪問特定端口
7.1允許某個IP (192.168.6.100)的機器進行SSH連接:
[root@singledb ~]# iptables -A INPUT -s 192.168.6.100 -p tcp --dport 22 -j ACCEPT
[root@singledb ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target??????? prot opt? source?????????????? destination???????
ACCEPT???? tcp? --? 192.168.6.100??????? 0.0.0.0/0?????????? tcp dpt:22
?
7.2 允許某一段的IP 訪問SSH
[root@singledb ~]# iptables -D INPUT -s 192.168.6.100 -p tcp --dport 22 -j ACCEPT?????
[root@singledb ~]# iptables -A INPUT -s 192.168.6.0/24 -p tcp --dport 22 -j ACCEPT??
[root@singledb ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target???? prot opt source?????????????? destination???????
ACCEPT???? tcp? --? 192.168.6.0/24?????? 0.0.0.0/0?????????? tcp dpt:22
?????? 因為之前添加過這個端口,所以先刪除了22的配置,然后添加的,這里我們使用的192.168.6.0/24. 它表示的是192.168.6.1-192.168.6.254的IP都可以訪問。這里的24 代表網絡號。 具體參考:
?????? IP(Internet Protocal) 地址 說明
?????? http://blog.csdn.net/tianlesoftware/archive/2011/02/25/6207289.aspx
?
7.3 限制某一IP 訪問SSH
[root@singledb ~]# iptables -A INPUT -p tcp -s ! 192.168.6.100 --dport 22 -j ACCEPT? --注意!號有個空格
[root@singledb ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target???? prot opt source?????????????? destination???????
ACCEPT???? tcp? --? 192.168.6.0/24?????? 0.0.0.0/0?????????? tcp dpt:22
?
8、配置一個NAT表放火墻
8.1、查看本機關于NAT的設置情況
[root@singledb ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination???????
?
Chain POSTROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination???????
MASQUERADE? all? --? 192.168.122.0/24??? !192.168.122.0/24??
MASQUERADE? all? --? 192.168.122.0/24??? !192.168.122.0/24??
?
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination????
?
這些信息也可以在iptables的配置文件(/etc/sysconfig/iptables)里直接查看。
?
8.2 清除NET表的信息:
[root@singledb ~]#iptables -F -t nat
[root@singledb ~]# iptables -X -t nat
[root@singledb ~]#iptables -Z -t nat
?
8.3、添加規則
(1)防止外網用內網IP欺騙
[root@singledb ~]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
[root@singledb ~]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
[root@singledb ~]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
?
(2)禁止與211.101.46.253的所有連接
[root@singledb ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP
?
(3)禁用FTP(21)端口
[root@singledb ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
這樣寫范圍太大了,我們可以更精確的定義.
[root@singledb ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP
?????? 這樣只禁用211.101.46.253地址的FTP連接,其他連接還可以.如web(80端口)連接.
?
(4)drop非法連接
[root@singledb ~]# iptables -A INPUT -m state --state INVALID -j DROP
[root@singledb ~]#iptables -A OUTPUT -m state --state INVALID -j DROP
[root@singledb ~]# iptables-A FORWARD -m state --state INVALID -j DROP
?
(5)允許所有已經建立的和相關的連接
[root@singledb ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@singledb ~]#iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
?
9. 保存
[root@singledb ~]# service iptables save
Saving firewall rules to /etc/sysconfig/iptables:????????? [? OK? ]
[root@singledb ~]# service iptables restart
Flushing firewall rules:?????????????????????????????????? [? OK? ]
Setting chains to policy ACCEPT: filter nat??????????????? [? OK? ]
Unloading iptables modules:??????????????????????????????? [? OK? ]
Applying iptables firewall rules:????????????????????????? [? OK? ]
Loading additional iptables modules: ip_conntrack_netbios_n[? OK? ]
[root@singledb ~]#
轉載于:https://www.cnblogs.com/wanhl/archive/2012/10/24/2737096.html
總結
以上是生活随笔為你收集整理的Linux iptables 防火墙相关命令介绍及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (未写)tyvj-1333- Coder
- 下一篇: linux修改网卡的mac地址