1. 程式人生 > 實用技巧 >Iptables防火牆

Iptables防火牆

一、iptables防火牆

1.應用場景

1.主機安全
2.內部共享上網
3.埠或IP對映

2.iptables工作機制

1.匹配規則是從上往下依次匹配
2.只要匹配到規則,就不再往下匹配
3.如果沒有匹配的規則,走預設規則
4.預設規則是允許所有

#注意:經常匹配的規則往上配置

二、iptables四表五鏈

#四表:
1.filter表
2.NAT表
3.mangle表
4.raw表

#五鏈:
1.PREROUTING
2.INPUT
3.FORWARD
4.OUTPUT
5.POSTROUTIONG

1.filter表

#重要作用阻止和允許訪問伺服器

#包含的鏈:
1.INPUT:過濾進入主機的資料包
2.FORWARD:轉發資料包
3.OUTPUT:過濾從主機出去的資料包

2.NAT表

#主要做埠或IP轉發

#包含的鏈
1.PREROUTING:在資料包到達防火牆時,改寫資料包目的地址和埠(埠轉發)
2.OUTPUT:過濾從主機出去的資料包
3.POSTROUTIONG:在資料包到達防火牆時,改寫資料包目的地址和埠(內部共享上網)

三、安裝iptables防火牆

1.停止firewalld防火牆

[root@web01 ~]# systemctl stop firewalld.service

2.安裝iptables

[root@web01 ~]# yum install -y iptables-services

3.安裝核心模組

[root@web01 ~]# modprobe ip_tables
[root@web01 ~]# modprobe iptable_filter
[root@web01 ~]# modprobe iptable_nat
[root@web01 ~]# modprobe ip_conntrack
[root@web01 ~]# modprobe ip_conntrack_ftp
[root@web01 ~]# modprobe ip_nat_ftp
[root@web01 ~]# modprobe ipt_state

#檢查載入的核心模組
[root@web01 ~]# lsmod |egrep 'filter|nat'

4.啟動iptables

[root@web01 ~]# systemctl start iptables.service

四、iptables常用引數

(a)鏈管理:
    -N:new, 自定義一條新的規則鏈;
    -X: delete,刪除自定義的規則鏈;
            注意:僅能刪除 使用者自定義的 引用計數為0的 空的 鏈;
    -P:Policy,設定預設策略;對filter表中的鏈而言,其預設策略有:
           ACCEPT:接受
           DROP:丟棄
           REJECT:拒絕
    -E:重新命名自定義鏈;引用計數不為0的自定義鏈不能夠被重新命名,也不能被刪除;
    
(b)規則管理:
    -A:append,追加;
    -I:insert, 插入,要指明位置,省略時表示第一條;
    -D:delete,刪除;
        (1) 指明規則序號;
        (2) 指明規則本身;
    -R:replace,替換指定鏈上的指定規則;

    -F:flush,清空指定的規則鏈;
    -Z:zero,置零;
        iptables的每條規則都有兩個計數器:
            (1) 匹配到的報文的個數;
            (2) 匹配到的所有報文的大小之和;        
(c)檢視:
-L:list, 列出指定鏈上的所有規則;
    -n:numberic,以數字格式顯示地址和埠號;
    -v:verbose,詳細資訊;
        -vv, -vvv
    -x:exactly,顯示計數器結果的精確值;
    --line-numbers:顯示規則的序號;

1.檢視防火牆(預設filter表)

[root@web01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

2.檢視指定表規則

[root@web01 ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

3.清空防火牆規則

[root@web01 ~]# iptables -F
[root@web01 ~]# iptables -X
[root@web01 ~]# iptables -Z

4.配置防火牆規則

[root@web01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

iptables 			#命令
-t 					#指定表
filter 				#表
-A 					#追加
INPUT 				#鏈
-p 					#指定協議
tcp 				#tcp協議
--dport 			#指定埠
22 					#埠
-j 					#指定動作
DROP				#丟棄

5.刪除防火牆規則

-D:delete,刪除;
	(1) 指明規則序號;
	(2) 指明規則本身;
	
#檢視防火牆規則
[root@web01 ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3306
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:6379
3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:111
4    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:10050
5    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:873
6    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
7    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

#刪除指定序號的規則
[root@web01 ~]# iptables -D INPUT 7
[root@web01 ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3306
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:6379
3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:111
4    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:10050
5    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:873
6    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

#刪除規則本身
[root@web01 ~]# iptables -D INPUT -p tcp --dport 443 -j DROP

五、防火牆配置例項

1.禁止埠訪問

[root@web01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

2.拒絕IP訪問

[root@web01 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.61 -i eth0 -j DROP

-s			#指定來源地址
-i			#指定網絡卡

[root@web01 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.61 -i eth0 -j REJECT

3.禁止IP網段訪問

[root@web01 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.0/24 -i eth0 -j DROP

4.只允許某個IP訪問

[root@web01 ~]# iptables -t filter -A INPUT -p tcp ! -s 10.0.0.61 -i eth0 -j DROP

!			#取反

5.只允許某個埠範圍訪問

[root@web01 ~]# iptables -t filter -A INPUT -m multiport -p tcp --dport 22,23,24 -j ACCEPT

-m			#指定擴充套件項
multiport	#多埠匹配

[root@web01 ~]# iptables -t filter -A INPUT -m multiport -p tcp --dport 80:100 -j ACCEPT

六、企業中一般如何配置

1.配置前先思考

1.架構中哪一臺機器要開防火牆
2.配置防火牆的機器都部署了哪些
	Nginx
	keepalived
3.服務需要開啟的埠有哪些
	80
	443
	22
4.預設其他都拒絕

2.配置安全規則

#允許訪問80和443
[root@web01 ~]# iptables -t filter -I INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT

#只允許61訪問web的22埠
[root@web01 ~]# iptables -t filter -A INPUT -p tcp -s 172.16.1.61 --dport=22 -j ACCEPT

#所有都拒絕,修改預設規則全部拒絕
[root@web01 ~]# iptables -P INPUT DROP
-P		#修改預設規則

3.企業中一般的配置

iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -nL

天坑:

#以上配置好之後,跳板機連線之後,千萬不要清除規則,否則就連不上了;
因為清空規則操作,不會修改`iptables -P INPUT DROP`,預設所有全部拒絕

#解決方法: 到物理機操作
1.iptables -P INPUT ACCEPT
2.systemctl restart iptables
3.重啟伺服器

#避免方法:
1.配置定時任務
* * * * * /usr/sbin/iptables -P INPUT ACCEPT
2.準備一臺機器先配置測試沒問題,再到生產環境配置

七、防火牆規則永久生效

1.預設配置檔案

[root@web01 ~]# vim /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

2.自己配置防火牆規則永久生效

[root@web01 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

八、iptables配置內部共享上網

1.在防火牆機器上操作

#配置核心轉發
[root@m01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

#在CentOS6中開啟之後生效命令
[root@m01 ~]# sysctl -p

#檢視核心轉發是否開啟
[root@m01 ~]# sysctl -a|grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1

#配置內部共享上網
[root@web02 ~]# iptables -A FORWARD -i eth0 -s 172.16.1.0/24 -j ACCEPT
[root@web02 ~]# iptables -A FORWARD -i eth1 -s 10.0.0.0/24 -j ACCEPT
[root@web02 ~]# iptables -A FORWARD -o eth1 -s 10.0.0.0/24 -j ACCEPT
[root@web02 ~]# iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
[root@web01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.7

2.在沒有外網的機器上配置

[root@web02 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
#新增配置
GATEWAY=172.16.1.7    #防火牆內網地址
DNS1=223.5.5.5

#重啟網絡卡
[root@web02 ~]# ifdown eth1
[root@web02 ~]# ifup eth1