iptables是內置于多數(shù)發(fā)行版中的網(wǎng)絡防火墻包過濾器祟印。我也不知道該怎么解釋,,別看很輕量化逛球,但是功能很強大~
iptables的引入是用來替換掉老的ipchains,ipclains在Linux內核2.2系列中使用苫昌,用來作為封包過濾和防火墻的功能颤绕。但是ipchains的功能和定制化很局限。在Linux內核2.3系列開始引入了netfilter項目祟身,其中iptables防火墻就是這個項目的一部分奥务,在2.4內核中iptables取代了先前的ipchains作為內置的包過濾器。
對于iptables的歷史我沒有深究袜硫,這篇博客重點在于iptables的用法和規(guī)則設定氯葬。在網(wǎng)上簡單了解一下發(fā)現(xiàn),Linux包過濾功能的歷史并不長婉陷,本篇參考了以下幾個地方的內容:
iptables工作機制
iptables分為五個規(guī)則鏈:
- PREROUTING 數(shù)據(jù)包進入路由表之前
- INPUT 數(shù)據(jù)包入口
- FORWARD 轉發(fā)關卡
- OUTPUT 數(shù)據(jù)包出口
-
POSTROUTING 數(shù)據(jù)包離開路由后
這五個規(guī)則鏈是五個鉤子函數(shù)(hook),只要是經(jīng)過本機的數(shù)據(jù)包帚称,一定會經(jīng)過這五個鏈中的一個官研。那么就可以通過配置過濾規(guī)則來實現(xiàn)特定的場景。
和四個表:
- filter 一般的過濾功能
- nat 用于nat功能(端口轉發(fā)闯睹、地址映射等)
- mangle 對數(shù)據(jù)包進行修改(TOS戏羽、TTL)
- raw 優(yōu)先級最高,為了不讓iptables做數(shù)據(jù)包的連接跟蹤處理楼吃,以提高性能始花。
其中每個表對應多個鏈,都有不同所刀,這是每個表的默認規(guī)則鏈:
- filter:INPUT衙荐;FORWARD;OUTPUT浮创;
- nat:PREROUTING忧吟;POSTROUTING;OUTPUT斩披;
- mangle:PREROUTING溜族;POSTROUTING;INPUT垦沉;OUTPUT煌抒;FORWARD;
- raw:OUTPUT厕倍;PREROUTING寡壮;
iptables的策略
規(guī)則鏈確定了作用的位置;而表則劃分出了不同的功能讹弯。filter表主要是過濾的功能况既,針對特定的IP、端口组民、網(wǎng)段進行限制棒仍;nat表主要定義地址轉換的功能等。
iptables
的策略主要分為兩種:“通”策略和“堵”策略:
- 通策略臭胜,默認門是關著的莫其,即默認規(guī)則為
DROP
,根據(jù)需要進行放行耸三。 - 堵策略乱陡,默認門是開著的,即默認規(guī)則為
ACCEPT
仪壮,根據(jù)需要攔截數(shù)據(jù)包憨颠。
注意:iptables
的規(guī)則是嚴格按照先后順序執(zhí)行的,所以要將比較嚴格的規(guī)則前置睛驳,檢查規(guī)則的時候是由上向下的順序烙心。
此外,iptables
還支持自定義鏈乏沸,必須跟某種特定的鏈關聯(lián)起來淫茵,在此先不做討論。
iptables規(guī)則語法
iptables的命令格式:
iptables -t [tables] COMMAND chain rules -j ACTION
- -t tables:四個表蹬跃,缺省是filter表匙瘪,可忽略此選項
- COMMAND:命令,定義對規(guī)則采取的操作
- chain:指定是在哪一條鏈上的操作
- rules:指定匹配規(guī)則
- -j ACTION:指定做出如何的處理
E.g.
禁止123.123.123.123地址對本機80端口的訪問:
iptables -t filter -A INPUT -s 123.123.123.123 -p tcp --dport 80 -j DROP
iptables -t filter -A INPUT -s 123.123.123.123 -p tcp --dport 80 -j REJECT
默認OUTPUT鏈為“關”:
iptables -P OUTPUT DROP
查看詳細規(guī)則:
iptables -L -n -v
COMMAND部分詳解
鏈管理命令(立即生效)
-P:設置默認策略:開&&關
iptables -P OUTPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P OUTPUT REJECT
決定OUTPUT鏈默認接收或丟棄蝶缀。不同的是REJECT是直接丟棄丹喻,而DROP是悄悄丟棄數(shù)據(jù)包。這在掃描端口的時候會有差別翁都。
-F:清空規(guī)則鏈
iptables -t nat -F
iptables -F INPUT
分別是清空nat表的規(guī)則和清空filter表的INPUT鏈規(guī)則碍论。
注意:由于是立即生效的命令,因此在清空filter表時先確定沒有默認DROP的鏈柄慰,否則敲完回車后就會將你拒之門外了鳍悠。有控制臺還好,沒有的話就麻煩的很了
-N:新建一個自定義鏈
iptables -N inboard_tcp_web
-X:用于刪除用戶自定義的空鏈
刪除空鏈坐搔,因此刪除之前最好先執(zhí)行iptables -F
藏研。
-E:用來給自定義鏈重命名
iptables -E oldname newname
-Z:清空鏈。清空鏈以及鏈默認規(guī)則的計數(shù)器:1.匹配數(shù)據(jù)吧個數(shù)概行;2.多少字節(jié)蠢挡。
iptables -Z
規(guī)則管理命令
-A:追加規(guī)則。當前鏈的規(guī)則后新加一條規(guī)則凳忙。(iptables執(zhí)行有前后順序)
-I [num]:插入規(guī)則业踏。插入為第幾條規(guī)則
iptabels -t filter -I 1 -s 192.168.1.106 -p tcp --dport 80 -j DROP
-R [num]:替換。替換(修改)為第幾條規(guī)則消略。相當于bash
中的mv
命令堡称。
-D [num]:刪除。刪除第幾條規(guī)則艺演。
查看規(guī)則命令
iptables -L
子命令:
- -v/vv/vvv 詳細信息
- -x 計數(shù)器顯示精確值却紧,不做單位換算
- –line-numbers 顯示規(guī)則行號
- -t nat 顯示指定位置的信息
關于規(guī)則匹配
地址匹配
- -s:匹配源地址
IP | IP/Mask | 0.0.0.0/0.0.0.0
- 感嘆號
!
表示取反 - -d:匹配目的地址
- -p:匹配通信協(xié)議(TCP/UDP/ICMP)
- -i eth0:指定數(shù)據(jù)包流入的網(wǎng)卡
- -o eth1:指定數(shù)據(jù)包流出的網(wǎng)卡
協(xié)議匹配
-p tcp:匹配TCP通信協(xié)議:
-
--dport XX/XX-XX
指定目的端口,只能表示連續(xù)端口胎撤,不可指定非連續(xù)端口號 -
--sport XX/XX-XX
指定源端口晓殊,同上
-p tcp --tcp-flags
指定TCP的標志位(SYN,ACK,FIN,PSH,RST,URG)。一般格式如下:
iptables -A INPUT -p tcp --tcpflags syn,ack,fin,rst syn ...
iptables -A INPUT -p tcp --syn ...
一般分為前后兩部分:syn,ack,fin,rst
表示受檢查的標志位伤提;syn
表示匹配必須為1的標志位巫俺,而且其他的必須為零。常用來匹配三次握手的第一個數(shù)據(jù)包肿男。另一種寫法是直接寫成--syn
介汹。
-p udp:匹配UDP通信協(xié)議(同tcp):
-
--dport XX/XX-XX
指定目的端口却嗡,只能表示連續(xù)端口,不可指定非連續(xù)端口號 -
--sport XX/XX-XX
指定源端口嘹承,同上
-p icmp:匹配icmp數(shù)據(jù)包窗价,通常是ping包:
-
-p icmp --icmp-type 8
回顯icmp請求 -
-p icmp --icmp-type 0
回顯icmp應答
E.g.
以下操作中INPUT,OUTPUT默認丟棄
開放本機icmp請求權限:
iptables -A OUTPUT -s 192.168.1.100 -p icmp --icmp-type 8 -j ACCEPT
但是此時仍無反應,接下來開放本機的icmp應答權限:
iptables -A INPUT -d 192.168.1.100 -p icmp --icmp-type 0 -j ACCEPT
這時候就會成功ping通外部機器叹卷。但是此時外部主機是ping不通本機的撼港,這就需要分別在INPUT和OUTPUT上做相反的規(guī)則,在此不做贅述骤竹。
-m 啟用擴展模塊:
-
-m multiport -p tcp --dport 21,22,23,80
啟用多端口擴展模塊 -
-m state --state NEW,ESTABLISH
增加狀態(tài)檢測模塊
ACTION部分
DROP:悄悄丟棄帝牡。一般使用DROP,效果與REJECT相同蒙揣,可以隱藏身份和防火墻結構靶溜。
REJECT:明示拒絕,端口掃描顯示被拒絕鸣奔。
ACCEPT:接收數(shù)據(jù)包墨技。
這三個是常用動作,續(xù)更…
狀態(tài)檢測
通常挎狸,對于整個TCP協(xié)議來講扣汪,是一個保持連接的通信協(xié)議。在三次握手四次揮手過程中锨匆,第一次握手稱之為NEW連接崭别;從第二次握手以后,標志位ack都等于1恐锣,稱之為已建立的連接:ESTABLISH茅主;類似FTP連接,監(jiān)聽端口獨立于數(shù)據(jù)傳輸端口而存在土榴,包括20,21兩個端口诀姚,我們稱之為RELATED;對于我們無法識別的狀態(tài)玷禽,稱之為INVALID赫段。
- NEW 新建立的連接
- ESTABLISH 已存在的連接
- INVALID 無法識別的連接
- RELATED 有聯(lián)系的連接(沒用過,不深究)
這樣做矢赁,可以指定源地址可以連接糯笙,禁用其他連接:
iptables -A INPUT -s 192.168.1.106/24 -d 192.168.1.100 -p tcp --dport 22 -m state --state NEW,ESTABLISH -j ACCEPT
iptables -A OUTPUT -d 192.168.1.106 -m state --state ESTABLISH -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
在OUTPUT鏈僅開放192.168.1.106
的規(guī)則太嚴格了,如果需要其他連接撩银,可以改成這樣:
iptables -R OUTPUT 1 -m state --state ESTABLISH -j ACCEPT