首頁 > 軟體

Linux中iptables基礎命令

2020-06-16 17:38:31

防火牆(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@linuxidc ~]#vim  /etc/sysctl.conf
[root@linuxidc ~]#net.ipv4.ip_forward = 0  ## 把0更改為1即為開啟
[root@linuxidc ~]#/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@linuxidc ~]#iptables  -A  INPUT  -s  172.18.0.0/18  -d 172.18.42.200  -p  tcp  -j  ACCEPT
[root@linuxidc ~]#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@linuxidc ~]# 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@linuxidc ~]# 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@linuxidc ~]#iptables  -A INPUT  -s 0/0 -d 172.18.42.200 -p icmp --icmp-type 8 -j ACCEPT
[root@linuxidc ~]#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@linuxidc ~]#iptables  -A INPUT  -s 0/0 -d 172.18.42.200 -p tcp -m multiport --dports 80,22 -j ACCEPT
[root@linuxidc ~]#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@linuxidc ~]#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@linuxidc ~]#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@linuxidc ~]#iptables -I OUTPUT -s 172.18.42.200 -d 0/0 -p tcp -sport 80 -m string --algo bm --string "linuxidc" -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@linuxidc ~]#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@linuxidc ~]#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@linuxidc ~]#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@linuxidc ~]#iptables -A INPUT  -m state --state ESTABLISHED -j ACCEPT
[root@linuxidc  ~]#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@linuxidc ~]# vim /proc/sys/net/netfilter/nf_conntrack_max

(2)降低nf_conntrack_timeout檔案的的時間(不同協定的連線追蹤時長不同)
[root@linuxidc ~]#vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait
[root@linuxidc ~]#vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
[root@linuxidc ~]# vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_fin_wait
[root@linuxidc ~]# vim /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait

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

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

被動:

[root@linuxidc  ~]#modprobe nf_conntrack_ftp  ##核心載入nf_conntarck_ftp模組
[root@linuxidc  ~]#iptables -A INPUT -m state --state ESTABLISHED RELATED -j ACCEPT
[root@linuxidc  ~]#iptables -A OUTPUT -s 172.18.42.200 -p tcp --sport 21 -m state --state NEW -j ACCEPT

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

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

[root@linuxidc ~]iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
[root@linuxidc ~]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 "(linuxidc's log)"


(2)REDIRECT:埠重定向(之後在報文流入本機前才有用:prerouting)
--to-ports port[-port]:對映到某個埠上
[root@linuxidc ~]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@linuxidc ~]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@linuxidc ~]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@linuxidc ~]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@linuxidc ~]iptables -t nat -A POSTROUTING -s 0/0 -d 172.18.42.201 -j MASQUERADE

更多iptables相關教學見以下內容

CentOS 7.0關閉預設防火牆啟用iptables防火牆  http://www.linuxidc.com/Linux/2015-05/117473.htm

iptables使用範例詳解 http://www.linuxidc.com/Linux/2014-03/99159.htm

Linux防火牆iptables詳細教學 http://www.linuxidc.com/Linux/2013-07/87045.htm

iptables的備份、恢復及防火牆指令碼的基本使用 http://www.linuxidc.com/Linux/2013-08/88535.htm

Linux下防火牆iptables用法規則詳解 http://www.linuxidc.com/Linux/2012-08/67952.htm

Linux下iptables防火牆設定 http://www.linuxidc.com/Linux/2015-10/123843.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-07/132922.htm


IT145.com E-mail:sddin#qq.com