1. 什麼是 iptables
舉個例子,如果把Netfilter看成是某個小區的一棟樓。那麼表(tables)就是樓裡的其中的一套房子。這套房子"表(tables)"屬於這棟樓“Netfilter/iptables”。
2. 什麼是表(tables)
表(tables)是鏈的容器,即所有的鏈(chains)都屬於其對應的表(tables).如上,如果把Netfilter看成是某個小區的一棟樓.那麼表(tables)就是樓裡的其中的一套房子。
3 什麼是鏈(chains)
鏈(chains)是規則(Policys)的容器。如果把表(tables)當作有一套房子,那麼鏈(chains)就可以說是房子裡的傢俱(櫃子等)。
4 什麼是規則(Policy)
規則(Policy)就比較容易理解了,就是iptables系列過濾信息的規範和具體方法條款了.可以理解為櫃子如何增加並擺放櫃子東西等。
基本術語如下表格所示:
Netfilter/iptables 表(tables**)** 鏈(chains**)** 規則(Policy**)**
一棟樓 樓裡的房子 房子裡的櫃子 櫃子裡衣服,擺放規則
三、iptables表和鏈
默認情況下,iptables根據功能和表的定義劃分包含三個表,filter,nat,mangle,其每個表又包含不同的操作鏈(chains )。 實際iptables包含4張表和五個鏈,主要記住filter即可。
1、四個表:
必須是小寫
raw ------------追蹤數據包, ----此表用處較少,可以忽略不計
mangle -------- 給數據包打標記,做標記
nat ---------網絡地址轉換即來源與目的的IP地址和port的轉換。
filter --------做過濾的,防火牆裡面用的最多的表。
#表的應用順序:raw-》mangle-》nat-》filter
2、五個鏈
五鏈:(必須是大寫)鏈裡面寫的是規則。
PREROUTING ---------------------進路由之前數據包
INPUT -----------------就是過濾進來的數據包(輸入)
FORWARD -----------------轉發
OUTPUT ---------------發出去的數據包
POSTROUTING --------------路由之後數據包
#所有的訪問都是按順序:
入站:比如訪問自身的web服務流量。先PREROUTING(是否改地址),再INPUT(是否允許)到達程序。
轉發:經過linux網關的流量.先PREROUTING(是否改地址),然後路由。轉發給FORWARD(轉發或者丟棄),最後經過POSTROUTING(看看改不改地址。)
出站:源自linux自身的流量.先OUTPUT,然後路由。再給POSTROUTING(是否改IP)。
#規則順序:逐條匹配,匹配即停止。
3、四表五鏈
raw表裡面:
PREROUTING
OUTPUT
總結:數據包跟蹤 內核模塊iptables_raw
mangel表裡面有5個鏈:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
路由標記用的表。內核模塊iptables_mangle
nat表裡面的鏈:
PREROUTING
INPUT
OUTPUT
POSTROUTING
轉換地址的表(改IP,改端口。當網關使用的linux。保護內外網流量。內核模塊叫iptable_nat)
filter表有三個鏈:重點
INPUT #負責過濾所有目標是本機地址的數據包通俗來說:就是過濾進入主機的數據包
FORWARD #負責轉發經過主機的數據包。起到轉發的作用
OUTPUT #處理所有源地址是本機地址的數據包通俗的講:就是處理從主機發出的數據包
總結:根據規則來處理數據包,如轉或者丟。就是實現主機型防火牆的主要表。
內核模塊 iptable_filter
四 iptables操作
1、安裝
centos(5/6)
啟動防火牆:#/etc/init.d/iptables start
centos7
啟動防火牆 -----192.168.246.200服務器實驗。
# yum install -y iptables iptables-services
# systemctl stop firewalld
# systemctl disable firewalld
# systemctl start iptables
查看版本:
[root@iptables-server ~]# iptables -V
iptables v1.4.21
配置文件:
/etc/sysconfig/iptables-config
/etc/sysconfig/iptables #記錄規則文件
2、參數解釋
-L:列出一個鏈或所有鏈中的規則信息
-n:以數字形式顯示地址、端口等信息
-v:以更詳細的方式顯示規則信息
--line-numbers:查看規則時,顯示規則的序號(方便之處,通過需要刪除規則-D INPUT 1
-F:清空所有的規則(-X是清理自定義的鏈,用的少;-Z清零規則序號)
-D:刪除鏈內指定序號(或內容)的一條規則
-P:為指定的鏈設置默認規則
-A:在鏈的末尾追加一條規則
-I:在鏈的開頭(或指定序號)插入一條規則
-t: 指定表名
.... 更多參數可通過--help查看
3、參數使用
1.如果不寫-t 默認使用filter表
指定表名查看規則
[root@iptables-server ~]# iptables -t nat -L
默認查看規則:
# iptables -L
以數字的形式顯示ip和端口與協議
# iptables -nL
顯示規則行號
# iptables -nL --line
清空規則:
#iptables -F
清空單獨的某一個鏈裡面的規則
#iptables -F 鏈名
清空單獨的某一個表裡的,某一個鏈裡面的規則
# iptables -t nat -F INPUT
保存規則:
# service iptables save
# iptables-save > /etc/sysconfig/iptables
4、iptables語法
iptables -t 表名 動作 [鏈名] [-p 匹配條件] [-j 控制類型]
-j:控制類型, 通過前面匹配到之後是丟棄還是保留數據包的處理方式:
ACCEPT允許,
REJECT拒絕,
DROP丟棄。 不會給用戶返回任何的拒絕消息,不推薦使用。
LOG寫日誌(log不適用匹配,只是記錄一下)
動作:添規則還是刪除規則
-p:匹配條件:數據包特徵ip,端口等
如果不寫-t 默認使用filter表
動作
修改默認規則: -P (大p)
刪除規則:-D
修改規則:-R
追加規則: -A 默認追加到鏈的末尾
插入規則:-I (大i),在鏈的開頭(或指定序號)插入一條規則
5、查看添加刪除規則
觀察iptable規則添加的方法,刪除和查詢的方法。
iptables -t filter -A INPUT -p tcp -j ACCEPT #最後一行
iptables -I INPUT -p udp -j ACCEPT #第一行
iptables -I INPUT 4 -p icmp -j ACCEPT #(插入到第4行)#第4行
iptables -L #看一看
iptables -D INPUT 3 # 刪除第三行
iptables -F #全清空
service iptables save #保存
systemctl restart iptables #重啟
注意:如果不保存重啟之後規則就不在了。
2、規則匹配條件
1、通用匹配(協議),可以獨立使用
協議:-p (小p)
tcp ---用的最多
udp
icmp ---ping的時候用的協議
#使用協議的時候可以不指定端口,使用端口的時候必須指定協議。
案例:
禁止自己被ping,在filter表的INPUT鏈插入一個丟棄icmp的規則。
# iptables -F
# iptables -A INPUT -p icmp -j REJECT ----拒絕
驗證:
[root@iptables-test ~]# ping 192.168.246.200
PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data.
From 192.168.246.200 icmp_seq=1 Destination Port Unreachable
2、通過端口規則匹配:
端口:
--sport ---源端口
--dport --目標端口
案例:
拒絕192.168.246.201這臺機器通過ssh連接到這臺服務器
# iptables -I INPUT -s 192.168.246.201 -p tcp --dport 22 -j REJECT
例子:端口的範圍: 拒絕192.168.246.201這臺機器通過22端口到80端口的訪問,包括22和80端口在內
# iptables -I INPUT -s 192.168.246.201 -p tcp --dport 22:80 -j REJECT
驗證:
# curl -I http://192.168.246.200
curl: (7) Failed connect to 192.168.246.200:80; Connection refused
# ssh [email protected]
ssh: connect to host 192.168.246.200 port 22: Connection refused
拒絕所有機器通過ssh連接到這臺服務器
# iptables -I INPUT -p tcp --dport 22 -j REJECT
例子:端口的範圍: 拒絕所有機器通過22端口到80端口的訪問,包括22和80端口在內
# iptables -I INPUT -p tcp --dport 22:80 -j REJECT
3、通過ip地址
1.#禁止源246.201主機進來。(換個主機ping一下,就可以通信)
[root@iptables-server ~]# iptables -I INPUT -s 192.168.246.201 -p icmp -j REJECT
-s: 源ip地址
在源ip機器驗證:
[root@iptables-test ~]# ping 192.168.246.200
PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data.
From 192.168.246.200 icmp_seq=1 Destination Port Unreachable
2.拒絕多個ip地址:後面跟ip地址可以更多個ip地址用逗號隔開
# iptables -t filter -I INPUT -s 192.168.246.201,192.168.246.133 -p icmp -j REJECT
# iptables -t filter -I INPUT -s 192.168.246.201,192.168.246.133 -p tcp --dport 22:80 -j REJECT
驗證:在源ip地址通過curl訪問。在246.133和246.201機器分別驗證
# curl -I http://192.168.246.200
curl: (7) Failed connect to 192.168.246.200:80; Connection refused
# ssh [email protected]
ssh: connect to host 192.168.246.200 port 22: Connection refused
3.舉例::#限制源10網段的數據包。
# iptables -I INPUT -s 192.168.10.0/24 -j REJECT
4、修改規則:
# iptables -L
target prot opt source destination
REJECT tcp -- 192.168.246.133 anywhere tcp dpts:ssh:http reject-wi
REJECT tcp -- 192.168.246.201 anywhere tcp dpts:ssh:http reject-wi
REJECT icmp -- 192.168.246.201 anywhere reject-with icmp-port-unreachable
將修改第二條規則訪問80端口:
# iptables -R INPUT 2 -p tcp --dport 80 -s 192.168.246.201 -j ACCEPT
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 192.168.246.133 anywhere tcp dpts:ssh:http reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.246.201 anywhere tcp dpt:http
REJECT icmp -- 192.168.246.201 anywhere reject-with icmp-port-unreachable
驗證在修改為允許訪問的源ip機器上:
# curl -I http://192.168.246.200
HTTP/1.1 200 OK
# iptables -R INPUT 1 -p tcp -s 192.168.62.185 --dport 22 -j ACCEPT
驗證在修改為允許訪問的源ip機器上:
# ssh 192.168.62.135
The authenticity of host '192.168.62.135 (192.168.62.135)' can't be established.
ECDSA key fingerprint is SHA256:cUexa/Lv/EtkmiiTrsHUJ1zOWsjT9cihPqLxi23w5ws.
ECDSA key fingerprint is MD5:8c:9c:65:99:b7:6e:df:93:86:c1:7f:38:d9:73:4c:3d.
Are you sure you want to continue connecting (yes/no)?
5、icmp類型匹配
禁止ping策略原則
iptables服務器是ping命令發起者或是接受者
-i --in-interface:在INPUT鏈配置規則中,指定從哪一個網卡接口進入的流量(只能配置在INPUT鏈上)
-o --out-interface:在OUTPUT鏈配置規則中,指定從哪一個網接口出去的流量(只能配置在OUTPUT鏈上)
icmp的類型:
0: Echo Reply——回顯應答(Ping應答)ping的結果返回。
8: Echo request——回顯請求(Ping請求),發出去的請求。
iptables服務器-----發起者:ping 別的機器
1.自己不能ping別人,但是別人可以ping自己:
[root@iptables-server ~]# iptables -I OUTPUT -o ens33 -p icmp --icmp-type 8 -j REJECT #ping發出的請求禁止掉了
驗證:
[root@iptables-server ~]# ping 192.168.246.133 #將ping請求給禁止掉了。
PING 192.168.246.133 (192.168.246.133) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
[root@jenkins-server ~]# ping 192.168.246.200 #可以ping通
PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data.
64 bytes from 192.168.246.200: icmp_seq=1 ttl=64 time=0.280 ms
iptables服務器作為接受者。也就是別人ping自己:
本機可以ping其他機器。其他機器不能ping通本機:
[root@iptables-server ~]# iptables -I OUTPUT -o ens33 -p icmp --icmp-type 8 -j ACCEPT #允許自己ping別人
[root@iptables-server ~]# iptables -A INPUT -i ens33 -p icmp --icmp-type 8 -j DROP #將進來的ping請求給丟棄了。
換一種方法:
[root@iptables-server ~]# iptables -I OUTPUT -o ens33 -p icmp --icmp-type 0 -j REJECT #不給回應icmp包
驗證:
[root@iptables-server ~]# ping 192.168.246.201 #ping其他機器通
PING 192.168.246.201 (192.168.246.201) 56(84) bytes of data.
64 bytes from 192.168.246.201: icmp_seq=1 ttl=64 time=0.491 ms
[root@iptables-test ~]# ping 192.168.246.200 #其他機器ping不同
PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data.
拒絕任何ping的協議:
[root@iptables-server ~]# iptables -A INPUT -p icmp -j DROP
3、擴展匹配
顯示匹配:如端口匹配,IP範圍,MAC地址,等特殊匹配
#iptables -m iprange --help
1.指定ip範圍:
語法: -m iprange --src-range
# iptables -I INPUT -p tcp --dport 80 -m iprange --src-range 192.168.246.199-192.168.246.206 -j REJECT
2.指定多端口範圍:一次拒絕多個指定端口
語法:
-m multiport --sports #源端口
-m multiport --dports #目的端口
# iptables -A INPUT -p tcp -m multiport --dports 22,80 -s 192.168.246.133 -j REJECT
驗證:在246.133機器上
# ssh [email protected] #不通
ssh: connect to host 192.168.246.200 port 22: Connection refused
3.MAC地址匹配
拒絕MAC地址的匹配:只能匹配源MAC地址
語法: -m mac --mac-source
# iptables -I INPUT -p icmp -m mac --mac-source 0:0c:29:cd:26:77 -j REJECT #拒絕指定的MAC地址服務通過icmp協議請求到本地
# iptables -I INPUT -m mac --mac-source 00:0C:29:64:E3:8D -j REJECT #將指定的MAC地址服務請求全部禁止了
通過網卡接口:
# iptables -I INPUT -i ens33 -j DROP #誰也連不上了.
保存和刪除規則
刪除:
# iptables -D INPUT 3 #通過查看行號,指定行號刪除;
# iptables -D INPUT -p icmp -j REJECT #方式二
保存:
[root@iptables-server ~]# iptables-save > /etc/sysconfig/iptables #保存到文件裡面,方式一
[root@iptables-server ~]# service iptables save #第二種方式,推薦
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
閱讀更多 杭州千鋒 的文章