杭州雲計算培訓課程之iptables名詞及相關操作介紹

1. 什麼是 iptables

舉個例子,如果把Netfilter看成是某個小區的一棟樓。那麼表(tables)就是樓裡的其中的一套房子。這套房子"表(tables)"屬於這棟樓“Netfilter/iptables”。

杭州雲計算培訓課程之iptables名詞及相關操作介紹

杭州雲計算培訓課程之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 ]


分享到:


相關文章: