iptables 能夠理解爲包過濾型防火牆,嚴格來講iptbles就是規則管理工具web
Firewall: 防火牆,隔離工具;安全
防火牆:工做於主機或網絡的邊緣,對於進出本主機或網絡的報文根據事先定義好的檢查規則做匹配檢測,對於可以被規則所匹配到的報文作出相應處理的組件;服務器
防火牆按工做的位置能夠分爲:網絡
主機防火牆:就是對進入本機的報文進行檢查和過濾併發
網絡防火牆:是工做於一個網絡的邊緣,對進入本網絡的報文進行檢查和過濾的app
iptables的功能(也叫表):ssh
filter:過濾,防火牆
curl
nat:網絡地址轉換,轉換源地址(SNAT),轉換目的地址(DNAT)
tcp
mangle:拆解報文,作出修改,封裝報文
ide
raw:關閉nat表上啓用的鏈接追蹤機制
鏈(內置的):
PREROUTING:報文最開始進入主機的位置
INPUT:報文進入主機的用戶空間
FORWARD:在主機的內核空間,
OUTPUT:由內核準備發出的
POSTROUTING:出本機的最後一個位置
鏈還能夠自定義,但報文不會通過自定義鏈,只能在內置鏈上經過規則進行引用後生效
iptables有四表五鏈
各功能的實現:
filter:INPUT, FORWARD, OUTPUT
nat: PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)
mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw:PREROUTING, OUTPUT
添加規則的時候須要注意:
(1) 要實現哪一種功能:判斷添加在哪張表上;
(2) 報文流經的路徑:判斷添加在哪一個鏈上;
鏈:鏈上規則的次序,即爲檢查的次序;所以隱含必定的法則
(1) 同類規則(訪問同一應用),匹配範圍小的放上面;
(2) 不一樣類規則(訪問不一樣應用),匹配到報文頻率較大的放上面;
(3) 將那些可由一條規則描述的多個規則合併爲一個;
(4) 設置默認策略;
規則的組成部分:報文的匹配條件,匹配到以後的動做
iptables的經常使用命令格式:
iptables [-t table] {-A|-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
-t table:
filter, nat, mangle, raw
鏈管理:
-F:flush,清空規則鏈;省略鏈,表示清空指定表上的全部的鏈;
-N:new, 建立新的自定義規則鏈; 例:iptables -t filter -N IN_public
-X:drop, 刪除用戶自定義的空的規則鏈;
-Z:zero,清零,置零規則計數器;
-P:Policy,爲指定鏈設置默認策略;對filter表中的鏈而言,默認策略一般有ACCEPT, DROP, REJECT;
-E: rEname,重命令自定義鏈;引用計數不爲0的自定義鏈,沒法更名,也沒法刪除;
規則管理:
-A:append,將新規則追加於指定鏈的尾部;
-I:insert,將新規則插入至指定鏈的指定位置;
-D:delete,刪除指定鏈上的指定規則;
有兩種指定方式:
(1) 指定匹配條件;
(2) 指定規則編號;
-R:replace,替換指定鏈上的指定規則;
查看:
-L:list,列出指定鏈上的全部規則;
-n: numberic,以數字格式顯示地址和端口號;
-v: verbose,顯示詳細信息;
--line-numbers:顯示規則編號;
-x: exactly, 顯示計數器計數結果的精確值;
匹配條件:
基本匹配:(!是取反的)
[!] -s, --src, --source IP|Netaddr:檢查報文中源IP地址是否符合此處指定的地址範圍;
[!] -d, --dst, --destination IP|Netaddr:檢查報文中目的IP地址是否符合此處指定的地址範圍;
[!] -p, --protocol {tcp|udp|icmp}:檢查報文中的協議,即ip首部中的協議位所標識的協議;
[!] -i, --in-interface IFACE:數據報文的流入接口;僅能用於PREROUTING, INPUT及FORWARD鏈上;
[!] -o, --out-interface IFACE:數據報文的流出
擴展匹配:-m macth_name(模塊名) --spec_options(選項)
例如:-m tcp --dport 22
擴展匹配分爲隱式擴展和顯示擴展
隱式擴展:對-p protocol指明的協議進行的擴展,可省略-m選項;
-p tcp:
--dport PORT[-PORT]:目標端口,能夠是單個端口或連續多個端口;
--sport PORT[-PORT]
--tcp-flags LIST1 LIST2:檢查LIST1所指明的全部標誌位,且這其中,LIST2所表示出的全部標記位必須爲1,而餘下的必須爲0;沒有LIST1中指明的,不做檢查;
通常經常使用的標誌位爲SYN, ACK, FIN, RST, PSH, URG
--tcp-flags SYN,ACK,FIN,RST SYN 這個式子等於--syn,這個式子表明的是TCP創建鏈接的第一個報文
-p udp:--dport;--sport
-p icmp:--icmp-type
可用數字表示其類型:0:echo-reply (ping的響應報文)8: echo-request(ping的請求報文)
顯式擴展: 必須使用-m選項指定使用的擴展;
一、multiport擴展:以離散方式定義多端口匹配;最多指定15個端口;
[!] --source-ports,--sports port[,port|,port:port]...:指明多個源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指明多個離散的目標端口;
[!] --ports port[,port|,port:port]...
二、iprange擴展:指明連續的(但通常是不能擴展爲整個網絡)ip地址範圍時使用;
[!] --src-range from[-to]:指明連續的源IP地址範圍;
[!] --dst-range from[-to]:指明連續的目標IP地址範圍;
三、string擴展:檢查報文中出現的字符串;
四、time擴展:根據報文到達的時間與指定的時間範圍進行匹配;
五、connlimit擴展:根據每客戶端IP(也能夠是地址塊)作併發鏈接數數量匹配;
六、limit擴展:基於收發報文的速率作檢查;
七、state擴展:根據鏈接追蹤機制檢查鏈接的狀態;
可追蹤的鏈接狀態:
NEW:新發出的請求;鏈接追蹤模板中不存此鏈接相關的信息條目,所以,將其識別爲第一次發出的請求;
ESTABLISHED:NEW狀態以後,鏈接追蹤模板中爲其創建的條目失效以前期間內所進行的通訊的狀態;
RELATED:相關的鏈接;如ftp協議的命令鏈接與數據鏈接之間的關係;
INVALIED:沒法識別的鏈接;
目標(動做):
-j TARGET:jump至指定的TARGET
TARGRT經常使用的有如下:
ACCEPT: 接受
DROP: 丟棄
REJECT: 拒絕
RETURN: 返回調用鏈
REDIRECT:端口重定向
LOG: 記錄日誌
MARK:作防火牆標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址假裝
...
自定義鏈:由自定義鏈上的規則進行匹配檢查
保存及重載規則:
保存規則至指定文件:
iptables-save > /PATH/TO/SOMEFILE(路徑)
從指定文件重載規則:
iptables-restore < /PATH/FROM/SOMEFILE(路徑)
下面作幾個實例來演示iptables的命令(是在CentOS6下實現的)
1、主機防火牆
就是在一個主機的內部作iptables
在主機內部放行,ssh(端口22/tcp),telnet(端口23/tcp),web服務(端口80/tcp),dns服務(53/udp,53/tcp)dns直接查詢使用的是53/udp,若是是作區域傳送使用的是53/tcp
首先打開虛擬機,而後查看規則 iptables -L -n
一、而後在這個虛擬機上作好ftp服務,web服務,而後進行測試
從圖中能夠看出,ftp telnet http訪問都沒有問題,遠程鏈接ssh也沒有問題
二、打開防火牆,修改默認規則爲DROP,可是這更改以前先把ssh的規則作好再更改,避免你連不上主機
必定要先加入ssh的規則以後再把默認的規則改成DROP
iptables -A INPUT -p tcp -d 172.16.249.110 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -s 172.16.249.110 --sport 22 -j ACCEPT
在你更改默認規則時,遠程鏈接沒斷開,證實你這兩條規則是正確的
三、如今在測試ftp,telent,http,ping都是不通的
四、寫入讓http能訪問的規則
iptables -A INPUT -p tcp -d 172.16.249.110 --dport 80 -j ACCEPT
iptables -A OUTPUT -ptcp -s 172.16.249.110 --sport 80 -j ACCEPT
寫入讓http能訪問的規則
iptables -A INPUT -p tcp -d 172.16.249.110 --dport 23 -j ACCEPT
iptables -A OUTPUT -ptcp -s 172.16.249.110 --sport 23 -j ACCEPT
能夠把這幾條規則合併到一塊兒
iptables -A INPUT -p tcp -d 172.16.249.110 -m multiport --dports 22,23,80 -j ACCEPT
iptables -A OUTPUT -ptcp -s 172.16.249.110 -m multiport --sports 22,23,80 -j ACCEPT
刪除第一條規則,而後查看規則,測試通不通
寫入規則讓ping能通,規則以下
iptables -A INPUT -p icmp -d 172.16.249.110 -j ACCEPT
iptables-A OUTPUT -p icmp -s 172.16.249.110 -jACCEPT
這樣ping,telnet,ssh,http均可以正常通訊了,
還能夠只讓本身能ping同別的主機,別的主機ping不通你
規則以下:
首先把作的icmp的規則刪掉,而後添加以下規則
iptables -A INPUT -d 172.16.249.110 -p icmp --icmp-type 0 -j ACCEPT 這是隻讓響應的icmp報文進入,
iptables-A OUTPUT -s 172.16.249.110 -p icmp --icmp-type 8 -j ACCEPT 這是隻讓請求的icmp報文出去,
能夠看到本身的主機能夠ping通別的主機,別的主機不能ping通本身
五、下面作ftp的規則
ftp訪問比較麻煩,須要藉助擴展模塊還須要安裝一個內核模塊,由於ftp訪問是兩條鏈接,一條命令鏈接(端口21),一條數據鏈接(端口隨機)
(1) 裝載ftp追蹤時的專用的模塊:
modprobe nf_conntrack_ftp
(2)放行請求報文:
命令鏈接:狀態爲 NEW,ESTABLISHED
數據鏈接:RELATED,ESTABLISHED
iptables -A INPUT -d 172.16.249.110 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.249.110 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(3)放行響應報文:
iptables -A OUTPUT -s 172.16.249.110 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
OUTPUT加入RELATED狀態是爲了,若是本身的主機去訪問別的ftp服務器會不通,只有加上這個狀態你才能訪問別的ftp服務
這樣ftp的iptanble規則就作好了
六、DNS就只作查詢了,
首先作好dns,而後本身測試下
用別的主機進行dns查詢,
而後在作規則,若是想讓本身能查詢到,別的主機也能查到,規則要寫成下面這樣
iptables -A INPUT -p udp -d 172.16.249.124 --sport 53 -j ACCEPT
iptables -A INPUT -p udp -d 172.16.249.124 --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -s 172.16.249.124 --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -s 172.16.249.124 --dport 53 -j ACCEPT
能夠看到本身和別的主機都能查詢了
若是本身主機查詢不行,別的主機能夠查詢,規則只須要寫下面兩條就好了
iptables -A INPUT -p udp -d 172.16.249.124 --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -s 172.16.249.124 --sport 53 -j ACCEPT
查詢結果,能夠看到本身不能查詢,別的主機能夠
若是是區域傳送須要打開tcp的53端口,規則跟上面的相似,這裏再也不演示了
二 網絡防火牆
須要打開三臺虛擬機,一臺模擬外網即互聯網上的web服務,另外一臺作內網主機,剩下的一臺作路由器使用,要打開它的核心轉發功能,並且要有兩塊網卡,一塊鏈接內網網絡,一塊鏈接外網網絡。
外網主機的地址爲172.16.249.110 作路由器的鏈接外網的網卡地址爲172.16.249.123,鏈接內網的網卡地址爲192.168.36.1;內網的主機地址爲192.168.36.2;
ftp,telnet,http,dns能正常訪問,這個跟上面的主機防火牆相似,這是把規則寫在作轉發的那個主機上,規則內容與上面作的主機防火牆同樣,只是寫在FORWARD鏈上;
而後作SNAT和DNAT
NAT:
SNAT: 只修改請求報文的源地址;
DNAT:只修改請求報文的目標地址;
nat表有三條鏈:
PREROUTING:DNAT
OUTPUT
POSTROUTING:SNAT
源地址轉換:iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE(這是自動給分配一個能夠去外網的地址)
目標地址轉換:iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
先給作轉發的這臺主機添加一塊網卡類型選擇VMnet2類型,地址添加爲192.168.36.1;而後把內網的這一臺主機的網卡類型也改成VMnet2類型,而後給內網主機添加地址192.168.36.2,而後網關指向192.168.36.1;或者配一條默認路由指向192.168.36.1
而後從內網主機測試下ping192.168.36.1 是否通
而後給轉發主機開啓核心轉發功能
而後ping172.16.249.123 能通,ping外網主機發現不通,是由於有去的但沒有回來的報文,須要給外網主機配一條默認路由,而後在ping就通了
默認路由 route add -net 192.168.36.0/24 gw 172.16.249.123
這樣外部網絡就作好了,下面開始寫iptables規則,ftp和http,ping都能正常訪問
一、把轉發主機的FORWARD的默認規則改成DROP
iptables -P FORWARD DROP
這個時候再從內網主機ping外網主機就不通了,web也不能訪問
加上規則,放行web服務
iptables -A FORWARD -d 172.16.249.110 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 172.16.249.110 -p tcp --sport 80 -j ACCEPT
測試一下,這個時候能訪問http服務,但仍是ping不通,由於咱們沒有作規則
添加這一條iptables -A FORWARD -p icmp -j ACCEPT或者下面兩條
iptables -A FORWARD -d 172.16.249.110 -p icmp -j ACCEPT
iptables -A FORWARD -s 172.16.249.110 -p icmp -j ACCEPT
能夠ping通了,而後在把tcp的23號端口加入前面寫的規則裏,telnet也就能經過了
iptables -A FORWARD -d 172.16.249.110 -p tcp -m multiport --dports 23,80 -j ACCEPT
iptables -A FORWARD -s 172.16.249.110 -p tcp -m multiport --sports 23,80 -j ACCEPT
可是會自動關閉,由於telent認爲這是不安全的,就強制關閉了,經過抓包能夠看到三次握手創建成功了
以ssh爲例,把22端口加進去,
iptables -R FORWARD 2 -d 172.16.249.110 -p tcp -m multiport --dports 22,23,80 -j ACCEPT
iptables -R FORWARD 3 -s 172.16.249.110 -p tcp -m multiport --sports 22,23,80 -j ACCEPT
能夠經過,
下面作ftp ,
(1) 裝載ftp追蹤時的專用的模塊:
modprobe nf_conntrack_ftp
(2)放行請求報文:
命令鏈接:狀態爲 NEW,ESTABLISHED
數據鏈接:RELATED,ESTABLISHED
iptables -A FORWARD -d 172.16.249.110 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -d 172.16.249.110 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(3)放行響應報文:
iptables -A FORWARD -s 172.16.249.110 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
能夠看到能夠訪問,
咱們--dport在192.168.36.2上作的DNS,
須要在172.16.249.110上能查詢須要寫以下規則
iptables -A FORWARD -p udp -d 192.168.36.2 --dport 53 -j ACCEPT
iptables -A FORWARD -p udp -s 192.168.36.2 --sport 53 -j ACCEPT
能夠看到能訪問
若是是區域傳送須要打開tcp的53端口,規則跟上面的相似,這裏再也不演示了
下面作SNAT和DNAT
首先在外網主機上啓用抓包命令,tcpdump -i eth0 dst host 172.16.249.110,而後在內網主機192.168.36.2上使用curl http://172.16.249.110訪問如下,抓的包以下
能夠清晰看到這個包的源地址是192.168.36.2
而後在外網主機172.16.249.110上把剛纔加的默認路由刪掉,讓內外網主機不能通訊
這個時候內網主機在訪問,抓到的包,能夠看到,請求過來了,可是沒響應成功
下面在作轉發的主機上,寫入SNAT,把來至192.168.36.0這一網段的地址轉換爲172.16.249.123;
轉換規則爲iptables -t nat -A POSTROUTING -s 192.168.36.0/24 ! -d 192.168.36.0/24 -j SNAT --to-source 172.16.249.123
查看下轉發主機上nat表中有沒有規則
而後加入上面的規則
而後讓內網主機訪問外網主機,而後抓包
能夠看到能正常訪問,能夠看到是172.16.249.123這個地址過來訪問的
從日誌中也能夠看到,請求是172.16.249.123而不是192.168.36.2
這樣SNAT就作好了,
下面作DNAT,就是把SNAT的過程反轉過來,內網主機來提供web服務,外網主機來訪問
首先把nat中的規則清掉,而後在內網主機上開啓httpd服務,寫一個測試頁,
內容爲Hello , This is 192.168.36.2;這個時候外網主機是訪問不到的,它們之間是不通的,外網主機能夠訪問到網關地址即172.16.249.123,因此咱們宣稱172.16.249.123這個上有web服務
而後寫入規則
iptables -t nat -A PREROUTING -d 172.16.249.123 -p tcp --dport 80 -j DNAT --to-destination 192.168.36.2:80(這個端口若是相同能夠省略,若是不一樣必須加上)
而後在外網主機上進行訪問,訪問172.16.249.123
這樣就能夠訪問到web服務了,其實172.16.249.123的web服務是沒啓動的
這樣DNAT就作好了,就是把訪問的目標地址改變
在內網主機192.168.36.2上抓包能夠看到,請求是172.16.249.110發過來的,
這樣DNAT就作好了
這樣iptables的經常使用的配置就大體上作完了,若有不對和建議請寫入評論。