歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> 學習Linux >> Linux中iptables基礎命令

Linux中iptables基礎命令

日期:2017/3/6 9:32:53   编辑:學習Linux

Linux中iptables基礎命令


Linux中iptables基礎命令


防火牆(Firewalld)是一種隔離工具,防范與非授權的訪問,使主機更安全。它主要工作與網絡或主機的邊緣,對於進出本網絡或主機的通信報文根據事先定義好的規則進行匹配檢測;對於能夠被規則所匹配到的報文做出相應的處理。
防火牆的分類:
主機防火牆:工作范圍是單個主機

網絡防火牆:工作范圍是整個網絡;網絡防火牆中還可以包含主機防火牆
防火牆的實現方式:
硬件防火牆:NetScreen、CheckPoint
軟件防火牆:iptables

本文所介紹的iptables就是Linux的軟防火前的實現。
iptables最主要的特點就是4表5鏈,以及每種不同的表所對應不同的鏈;

5鏈:prerouting、input、output、forward、postrouting
4表:filter、mangle、nat、raw
filter:主要功能是過濾;對應的鏈為:input、output、forward
mangle:主要功能是拆解報文、做出修改、重新封裝;對應的鏈為:prerouting、input、output、forward、postrouting
nat:主要功能是網絡地址轉換;對應的鏈為:prerouting、postrouting、output
raw:在限定的時間范圍內,關閉在nat表上的啟用的連接追蹤機制;對應的鏈為:output、prerouting
同一鏈上的不同表的應用優先級:raw、mangle、nat、filter


報文在主機內的流向示意圖:

報文流向有兩種:
流入本機的報文:報文流入-->prerouting-->input-->output-->postrouting-->報文流出
由本機轉發報文:報文流入-->prerouting-->forward-->postrouting-->postrouting
注意:報文是由本機處理,但是是否轉發是由路由來決定的;在報文流入本機之後,路由1會判斷報文的目標地址是否為本機,如果是,則流入input;如果不是,則流入forwrad,在報文離開本機之前路由2會判斷報文經由那個接口送往下一個網關(下一跳),同時在轉發之前,要確保轉發功能是開啟的;1表示開啟,0表示關閉:

[root@bkjia ~]#vim /etc/sysctl.conf
[root@bkjia ~]#net.ipv4.ip_forward = 0 ## 把0更改為1即為開啟
[root@bkjia ~]#/sbin/sysctl -p ##修改之後立即生效

iptables的規則:根據規則匹配條件嘗試匹配檢查報文,對成功匹配的報文做出相應的處理
組成部分:匹配條件、處理動作
匹配條件:基本匹配、擴展匹配
處理動作:基本處理動作、擴展處理動作、自定義處理動作
注意:添加規則時的考量點;
(1)要實現什麼樣的功能;判斷添加至那個表上
(2)報文流經的位置;判斷添加至那個鏈上
(3)同類的規則,匹配范圍小的放在前面,用於特殊處理
(4)不同類的規則,匹配范圍大的放在前面
(5)將那些可由一條規則描述的多個規則合並為一個
(6)設置默認策略

iptables的相關命令:

iptables [-t table] {-A|-C|-D} chain rule-specification

iptables [-t table] {-A|-C|-D} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain target

iptables [-t table] -E old-chain-name new-chain-name


rule-specification = [matches...] [ -j target]


實現對鏈管理:管理一整條鏈
-N:新增一條自定義鏈
-X:刪除一條自定義鏈(刪除時要確保鏈下沒有規則)
-P:設置鏈的默認策略
-E:重命名於未被引用的自定義鏈(引用計數為0,即references為0)

實現對規則管理:管理鏈上的某條規則
-A:追加一個規則;默認為末尾
-I:插入一個規則;默認為最開始處
-D:刪除某條規則
-R:指明修改第幾條規則
-F:清空所有的規則

查看某表上的規則:
-L:列出規則
-n:以數字格式顯示地址個端口
-v:顯示詳細信息
--line-numbers:顯示鏈上的規則和編號
-x:顯示計數器的精確值


匹配條件:
基本匹配:netfilter自帶的匹配機制
[!] -s, --source address[/mask][,...]:原地址匹配(!s是取反)
[!] -d, --destination address[/mask][,...]:目標地址匹配
[!] -i, --in-interface name:限制報文流入的接口(只能用於prerouting、input、forward這三個鏈)
[!] -o, --out-interface name:限制報文流出的接口(只能用於output、forward、postrouting這三個鏈)
[!] -p{tcp|udp|icmp}:限制協議;指明用哪一種協議
[root@bkjia ~]#iptables -A INPUT -s 172.18.0.0/18 -d 172.18.42.200 -p tcp -j ACCEPT
[root@bkjia ~]#iptables -A OUTPUT -s 172.18.42.200 -d 172.18.0.0/16 -p tcp -j ACCEPT

擴展匹配:經由擴展模塊引入的匹配機制;-m matchname
隱式擴展:無需指明,可以不適用-m選項專門加載響應模塊;前提要使用-p選項可匹配何種協議
顯示擴展:需要指明,必須由-m選項專門加載響應模塊


隱式擴展:

tcp:隱含指明了“-m tcp",有專用選項:
[!] --source-port,--sport port[:port]:匹配報文中的tcp首部的源端口;可以是端口范圍
[!] --destination-port,--dport port [:port]:匹配報文中的tcp首部的目標端口;可以是端口范圍
[!] --tcp-flags mask comp:檢查報文中mask指明的tcp標志位,而要這些標志位comp必須為1
例如:--tcp-flags syn,fin,ack,rst syn
此時: syn必須為1

[!] --syn:
--syn相當於"--tcp-flags syn,fin,ack,syn“,tcp中的第一次握手
[root@bkjia ~]# iptables -A INPUT -s 0/0 -d 10.0.1.2 -p tcp --dport 80 --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT
[root@bkjia ~]# iptables -A INPUT -d 0/0 -s 10.0.1.2 -p tcp --sport 80 -j ACCEPT

udp:
[!] --source-port,--sport port[:port]:匹配報文中的tcp首部的源端口;可以是端口范圍
[!] --destination-port,--dport port [:port]:匹配報文中的tcp首部的目標端口;可以是端口范圍

icmp:隱含指明了“-m icmp”,有專用選項
[!] --icmp-type {type[/code][typename]
type/code:
0/0:表示響應
0/8:表示請求
[root@bkjia ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p icmp --icmp-type 8 -j ACCEPT
[root@bkjia ~]#iptables -A OUTPUT -s 172.18.42.200 -d 0/0 -p icmp --icmp-type 0 -j ACCEPT


顯示擴展:

(1)multiport擴展:以離散方式定義多端口匹配;最多指定15個端口;
[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
[!] --ports port[,port|,port:port]...:同時匹配多個端口(指明多個端口;)
[root@bkjia ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p tcp -m multiport --dports 80,22 -j ACCEPT
[root@bkjia ~]#iptables -A OUTPUT -s 172.18.42.200 -d 0/0 -p tcp -m multiport --sports 80,22 -A ACCEPT


(2)iprange擴展:指明一段連續的ip地址范圍作為源地址或目標地址匹配
[!] --src-range from[-to]:源IP地址;
[!] --dst-range from[-to]:目標IP地址;
[root@bkjia ~]#iptables -A INPUT -d 172.18.42.200 -p tcp -dport 80 -m iprange --src-range 172.18.42.1-172.18.42.100 -j ACCEPT
[root@bkjia ~]#iptables -A OUTPUT -s 172.18.42.200 -p tcp -sport 80 -m iprange --dst-range 172.18.42.1-172.18.42.100 -j ACCEPT


(3)string擴展:對報文中的應用層數據做字符串模式匹配檢測;
--algo {bm|kmp}:字符串匹配檢測算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] --string pattern:要檢測的字符串模式;
[!] --hex-string pattern:要檢測的字符串模式(16進制格式);
1 [root@bkjia ~]#iptables -I OUTPUT -s 172.18.42.200 -d 0/0 -p tcp -sport 80 -m string --algo bm --string "bkjia" -j A DROP

注意:要求越嚴格的越要放在前面;之所以使用“OUTPUT”是因為在接受了報文之後才能夠響應輸出;如果直接是“INPUT”使用“DROP”,則報文會被直接拒絕,根本不會流入本機內部


(4)time擴展:根據將報文到達的時間與指定的時間范圍進行匹配;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結束日期時間
--timestart hh:mm[:ss]:起始時間
--timestop hh:mm[:ss]:結束時間
[!]--monthdays day[,day...]:匹配1-12月中的某些天
[!]--weekdays day[,day...]:匹配一個周中的某些天
--kerneltz:使用內核上的時區,而非默認的UTC;
1 [root@bkjia ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p tcp -dport 80 -m time --timestart 08:30:00 --timestop 18:00:00 --weekdays 1,2,3,4,5 -j ACCEPT


(5)connlimit擴展:根據每客戶端IP做並發連接數數量匹配;即每客戶端最大可同時發起的連接數量
--connlimit-upto n:連接的數量小於等於n時則匹配;
--connlimit-above n:連接的數量大於n時匹配
[root@bkjia ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p tcp -dport 80 -m connlimit --connlimit-upto 20 -j ACCEPT

(6)limit擴展:基於收發報文的速率做匹配;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
[root@bkjia ~]#iptables -A INPUT -s 0/0 -d 172.18.42.200 -p tcp -dport 80 -m limit --limit 20/second --limit-burst 5 -j ACCEPT


(7)state擴展(conntrack的子集):用於對報文的根據”連接追蹤機制“去檢查連接的狀態(但是對服務的連接數量會有很大的影響)
連接模板:占用內存空間中的一段空間(內核空間)
[!] --state state
conntrack機制:追蹤本機上的請求和響應之間的關系;狀態有如下幾種:
NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求;
ESTABLISHED:NEW狀態之後,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信狀態;
RELATED:相關聯的連接;如ftp協議中的數據連接與命令連接之間的關系;
INVALID:無法識別的連接(一般不會放行)
UNTRACKED:未進行追蹤的連接(在連接模板中沒有相關記錄)

[root@bkjia ~]#iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
[root@bkjia ~]#iptables -A OUTPUT -s 172.18.42.200 -d 0/0 -p tcp -sport 80 -m state --state NEW -j ACCEPT

查看連接追蹤功能所能夠容納的最大連接數量:
/proc/sys/net/nf_conntrack_max
修改鏈接追蹤功能所能夠容納的最大連接數量
echo Num > /proc/sys/net/nf_conntrack_max
sysctl -w net.nf_conntrack_max=Num
缺點:如果連接模板超載,當有一個新的請求時,web網頁會顯示連接超時;同時conntrack所能夠連接數量的最大值取決於/proc/sysnet/nf_conntrack_max的設定;已經追蹤到的記錄並記錄在/prco/net/nf_conntrack文件中,但當模板滿載時,後續的新連接可能會被超時,而連接超時的時長將會被刪除;解決的辦法有兩個
(1)加大nf_conntrack_max的值

[root@bkjia ~]# vim /proc/sys/net/netfilter/nf_conntrack_max

(2)降低nf_conntrack_timeout文件的的時間(不同協議的連接追蹤時長不同)
[root@bkjia ~]#vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait
[root@bkjia ~]#vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
[root@bkjia ~]# vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_fin_wait
[root@bkjia ~]# vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait

開放主/被動模式的ftp服務:
主動:

[root@bkjia ~]#iptables -A INPUT -d 172.18.42.200 -p tcp --dport 21 -m state --state ESTABLISHED -j ACCEPT
[root@bkjia ~]#iptables -A OUTPUT -s 172.18.42.200 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

被動:

[root@bkjia ~]#modprobe nf_conntrack_ftp ##內核加載nf_conntarck_ftp模塊
[root@bkjia ~]#iptables -A INPUT -m state --state ESTABLISHED RELATED -j ACCEPT
[root@bkjia ~]#iptables -A OUTPUT -s 172.18.42.200 -p tcp --sport 21 -m state --state NEW -j ACCEPT

保存編寫好的規則並開機啟動
[root@bkjia ~]#server iptables save
[root@bkjia ~]#iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] ##系統默認的保存路徑
[root@bkjia ~]#iptables-save > /path/to/rule_file ## 可自己指明保存的路徑
[root@bkjia ~]#chkconfig iptables on ##設置為當前規則可開機啟動
[root@bkjia ~]#service iptables restart ##會自動從系統默認的保存路徑中重載規則

處理動作:
(1)LOG:匹配報文中的日志功能
--log-level level:(emerg, alert, crit, error, warning, notice,info or debug.)
--log-prefix prefix:說明報文的日志信息是由誰產生的

[root@bkjia ~]iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
[root@bkjia ~]iptables -A FORWARD -s 0/0 -d172.18.42.200 -p tcp -m multiport --dports 80,21,23,22 -m state -state NEW -j LOG --log-prefix "(bkjia's log)"


(2)REDIRECT:端口重定向(之後在報文流入本機前才有用:prerouting)
--to-ports port[-port]:映射到某個端口上
[root@bkjia ~]iptables -t nat -A PREROUTING -d 172.18.42.200 -p tcp 80 -j REDIRECT --to-ports 172.18.42.201:8080
## 此命令是把80的端口映射在8080上,雖然訪問的是80,但正真提供服務的是8080

(3)SNAT(本地主機請求遠程服務器):源地址轉換;發生在postrouting
修改IP報文中的源IP地址
使用場景:本地網絡中的主機可使用統一地址與外部主機通信,從而實現地址偽裝
請求:由內網主機發起,修改源IP,如果修改則由管理員定義
響應:修改目標IP,由nat自動根據會話表中追蹤機制實現相應的修改

--to-source [ipaddr[-ipaddr]][:port[-port]]
[root@bkjia ~]iptables -t nat -A POSTROUTING -s 172.18.42.200 -d 172.18.42.201 -p tcp --dport 80 -j SNAT --to-source 172.18.42.202
##請求80端口的是172.18.42.202主機,但正在請求的卻是172.18.42.200主機


(4)DNAT(遠程主機請求本地服務器):目標地址轉換;發生在prerouting
修改IP報文中的目標IP
使用場景:讓本地網絡中的吳福氣使用統一的地址想外提供服務,但隱藏了自己的真實地址
請求:有外網主機發情,修改其目標地址,由管理員定義
響應:修改源地址,但由nat自動根據會話表中的追蹤機制來實現相對應的修改
--to-destination [ipaddr[-ipaddr]] [:port[-port]]
[root@bkjia ~]iptables -t nat -A PREROUTING -s 172.18.42.200 -d 172.18.42.201 -p tcp --dport 80 -j DNAT --to-destination 172.18.42.202
##請求的是172.18.42.201的80端口,但真正提供服務的卻是172.18.42.202的80端口
[root@bkjia ~]iptables -t nat -A PREROUTING -s 172.18.42.200 -d 172.18.42.201 -p tcp --dport 80 -j DNAT --to-destination 172.18.42.202:8080
##真正提供服務的是172.18.42.202的8080端口

(5)MASQUERADE:源地址轉換;發生在postrouting
當源地址為動態獲取的地址時,MASQUERADE會自動判斷要轉換為的地址
[root@bkjia ~]iptables -t nat -A POSTROUTING -s 0/0 -d 172.18.42.201 -j MASQUERADE

更多iptables相關教程見以下內容:

CentOS 7.0關閉默認防火牆啟用iptables防火牆

iptables使用范例詳解

Linux防火牆iptables詳細教程

iptables的備份、恢復及防火牆腳本的基本使用

Linux下防火牆iptables用法規則詳解

Linux下iptables防火牆設置

本文永久更新鏈接地址:

http://xxxxxx/Linuxjc/1141006.html TechArticle

Copyright © Linux教程網 All Rights Reserved