Iptables 防火墙

一、Iptables防火墙概述

1、什么是防火墙

防火墙主要是用来防火的,那么在Linux当中,防火墙主要用来防止恶意流量。

2、防火墙的分类

软件防火墙:firewalld、 iptables、 netfilter
	firewalld  --->   iptables  --->  netfilter

硬件防火墙:F5

3、应用场景

1.主机安全
2.内部共享上网
3.端口或IP转发

4、iptables注意事项

1.匹配规则是从上往下一次执行的
2.只要匹配上规则,就不会在往下执行
3.如果都没有匹配到规则,就执行默认规则
4.默认规则最后执行,默认允许所有
5.经常使用的规则往前放

5、防火墙的流程

1、流进主机的流量经过的防火墙链

	A网络(START)   -->  PREROUTING  --> INPUT  --> 用户名称空间进程(END)
	------------------------------>----------------------------------->
	
2、流出主机的流量经过的防火墙链

	A网络(END) <--- POSTROUTING  <--- OUTPUT  <--  用户名称空间的进程(START)
	<------------------------------<-----------------------------------
	
3、经过主机的流量经过的防火墙链

	A网络(START)  --->  PREROUTING   --->  FORWARD  --->  POSTROUTING   --->   C网络(END)
								   B 网络
	------------------------------>------------------------------------------>

6、防火墙理论总结

1、什么是防火墙

	防止恶意流量攻击和转发流量

2、表是做什么的

	具备改变流量规则的集合叫做表

3、链是做什么的

	把表的功能放在具体的位置去执行的载体叫做链

4、链的先后位置

    filter:     负责做过滤功功能		  #    INPUT FORWARD OUTPUT
    nat:	 网络地址转换	      	  #    PREROUTING OUTPUT POSTROUTING
    mangle:	 负责修改数据包内容	  #    PREROUTING INPUT FORWARD OUTPUT POSTROUTING
    raw:	 负责数据包跟踪            #    PREROUTING OUTPUT

二、iptables 四表五链

1.四表五链

1、什么叫表

        #一系列链功能的集合叫做表。

2、什么叫链

	#具备某种针对性功能的规则集合叫做链。

3、为什么要用表
	#主要是用表把链管理起来。
	
4、为什么要用链
	#主要用来设置防火墙规则的。

5、四表及功能
       raw :高级功能,如:网址过滤。
       mangle :数据包修改(QOS),用于实现服务质量。
       nat :地址转换,用于网关路由器。
       filter :包过滤,用于防火墙规则。
6、五链及功能 (也被称为五个钩子函数(hook functions)
       INPUT链 :处理输入数据包。
       OUTPUT链 :处理输出数据包。
       FORWARD链 :处理转发数据包。
       PREROUTING链 :用于目标地址转换(DNAT)
       POSTOUTING链 :用于源地址转换(SNAT)  

2.filter表

      #过滤数据包,主要作用就是阻止和允许访问
      1.INPUT链:过滤流入主机的数据包
      2.OUTPUT链:过滤流出主机的数据包
      3.FORWARD链:负责转发流经主机的数据包

3.Nat表

      #用于网络地址转换,主要作用就是端口转发和ip转发
      1.OUTPUT链:过滤流出主机的数据包
      2.PREROUTING链:数据包到达防火墙时进行判断,改写数据包的地址或或端口(进)
      3.POSTROUTING链:数据包到达防火墙时进行判断,改写数据包的地址或或端口(出)

三、iptables安装

1.安装

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

2.启动

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

3.iptables常用参数

      -t                   指定操作的表,默认的是 filter 表。 (raw, nat,filter,mangle)
      
# 通用匹配:源地址目标地址的匹配  ("!" 表示取反)
      -p:                 指定要匹配的数据包协议类型;(如tcp,udp,icmp,all)
      -s,--source          指定源地址(匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。)
      -d,--destination     指定目标地址,按此进行过滤。
      -i, --in-interface   指定数据包的来自来自网络接口,比如最常见的 eth0 。,"!" 表示取反。
      -o, --out-interface  指定数据包出去的网络接口
      --sport              指定源端口
      --dport              指定目标端口
      --to-port            转发到的端口

# 查看管理命令
      -L:list,            列出指定链上的所有规则;
      -n:numberic,       以数字格式显示地址和端口号;
      -v:verbose,        显示详细信息
      -x:exactly,        显示计数器结果的精确值;
      --line-numbers:     显示规则的序号;

# 规则管理命令
      -A:append,追加;
      -I:insert, 插入,要指明位置,省略时表示第一条;
      -D:delete,删除;
          (1) 指明规则序号;
          (2) 指明规则本身;
      -R:replace,替换指定链上的指定规则;

# 链管理命令(这都是立即生效的)
    -A:append,追加;
    -I:insert, 插入,要指明位置,省略时表示第一条;
    -D:delete,删除;
        (1) 指明规则序号;
        (2) 指明规则本身;
    -R:replace,替换指定链上的指定规则;
    -A:append,追加;
    -I:insert, 插入,要指明位置,省略时表示第一条;
    -D:delete,删除;
        (1) 指明规则序号;
        (2) 指明规则本身;
    -R:replace,替换指定链上的指定规则;
    -m:    指定模块 
    -j, --jump  满足某条件时该执行什么样的动作.
        动作包括:
            ACCEPT :      接收数据包。
            DROP :        丢弃数据包。
            REDIRECT :    重定向、映射、透明代理。
            REJECT :       拦阻该数据包,并传送数据包通知对方。
            SNAT :        源地址转换。
            DNAT :        目标地址转换。
            MASQUERADE :  IP伪装(NAT),用于ADSL。
            LOG :         日志记录。
            SEMARK :       添加SEMARK标记以供网域内强制访问控制(MAC)
    -h:显示帮助信息;

    yum install iptables* -y
    systemctl enable --now iptables
    service iptabels save	# 保存iptables规则

#清空防火墙规则
      #删除规则
      [root@lb01 ~]# iptables -F
      #删除自定义的链
      [root@lb01 ~]# iptables -X
      #计数器清零
      [root@lb01 ~]# iptables -Z
    
#注:防火墙执行规则是从上到下的,一旦匹配上则不在往下匹配。

4、命令选项输入顺序

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网>
 --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

四、iptables常用操作

1.查看防火墙策略(filter)

[root@lb01 ~]# 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.查看指定表

-t   指定表
 
[root@lb01 ~]# 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@lb01 ~]# iptables -F
#删除自定义的链
[root@lb01 ~]# iptables -X
#计数器清零
[root@lb01 ~]# iptables -Z

4.添加防火墙规则

[root@lb01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
 
iptables        #命令
-t              #指定表
filter          #指定链
-A              #添加规则
INPUT           #链的名字
-p              #指定协议
tcp             #tcp协议
--dport         #指定端口
22              #端口
-j              #指定动作
DROP            #丢弃
 
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.61
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.61
iptables -t nat -I POSTROUTING -s 172.31.0.0/20 -j SNAT --to-source 47.242.159.82

5.删除防火墙规则

#1.查看防火墙规则序号
[root@lb01 ~]# 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:80
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:111
 
#2.删除防火墙规则
[root@lb01 ~]# iptables -D INPUT 1
 
#3.再次查看
[root@lb01 ~]# 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:443
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:111

五、防火墙配置实例

1.禁止端口访问

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

2.拒绝IP访问

[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.1 -i eth0 -j DROP
-i      指定网卡
-s      指定源地址IP
 
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.1 -i eth0 -j REJECT

3.禁止IP网段访问

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

4.只允许某个IP访问

#正规的使用方法
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.1 -i eth0 -j ACCEPT
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.0/24 -i eth0 -j DROP
 
#取反的使用
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp ! -s 10.0.0.1 -i eth0 -j DROP
 
#添加允许的ip时
[root@lb01 ~]# iptables -t filter -I INPUT -p tcp -s 10.0.0.7 -i eth0 -j ACCEPT
-I      向上添加规则

5.练习题

练习1:仅允许 192.168.230.3 访问  192.168.230.5 的80端口,其他的都拒绝。

	1、允许192.168.230.3 访问 192.168.230.5 
	2、拒绝所有请求
        [root@lb01 ~]# iptables -t filter -I INPUT -p tcp -s 192.168.230.3 -d 192.168.230.5 --dport 80 -j ACCEPT
        [root@lb01 ~]# iptables -t filter -A INPUT -p tcp -j DROP

练习2:凡是由本机发出的TCP协议报文都允许出去,其他的协议不允许(可以访问baidu但是不能ping百度)
	1、允许TCP协议
	2、拒绝所有协议
	[root@lb01 ~]# iptables -t filetr -I OUTPUT -p tcp -j ACCEPT
	[root@lb01 ~]# iptables -t filter -A OUTPUT -j DROP

练习3:在练习2的基础上,放行所有的协议
	[root@lb01 ~]# [root@lb01 ~]# iptables -t filter -R OUTPUT 2  -j ACCEPT

练习4:只允许192.168.230.3通过22号端口链接192.168.230.5
	先允许,后拒绝
	[root@lb01 ~]# iptables -t filter -I INPUT -p tcp -s 192.168.230.3  --dport 22 -j ACCEPT
	[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -J DROP

练习5:只允许192.168.230.3访问192.168.230.5的20到90号端口
	先允许,后拒绝
	[root@lb01 ~]# iptables -t filter -I INPUT -p tcp -s 192.168.230.3  --dport 20:90 -j ACCEPT
	[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -J DROP

六、常用的防火墙扩展模块 (-m 指定模块)

1、multiport模块
	允许匹配多个不连续端口
	
练习5:只允许192.168.230.3访问192.168.230.5的22、80、3306、2379、8080、8090号端口
	[root@lb01 ~]# iptables -t filter -I INPUT -p tcp -s 192.168.230.3 -m multiport --dports 22,80,3306,2379,8080,8090 -j ACCEPT
	[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -J DROP

2、iprange模块
	指定一段连续的ip地址范围
       --src-range from[-to]:	源地址范围
       --dst-range from[-to]	目标地址范围
练习6:192.168.230.3-192.168.230.7 地址段都 不允许ping 192.168.230.5
	[root@lb01 ~]# iptables -t filter -I INPUT -p icmp -m iprange --src-range 192.168.230.3-192.168.230.7 -j DROP

3、string模块
	过滤数据包中包含某个字符串 
        --string pattern	# 指定要匹配的字符串
        --algo {bm|kmp}		# 匹配的查询算法
练习7:过滤访问到自己主机上的hello
        [root@lb01 ~]# iptables -t filter -I INPUT -p tcp -m string --string "hello" --algo bm -j DROP

4、time模块(UTC)
根据时间段来匹配报文
		--timestart hh:mm[:ss]		#  开始时间
       	--timestop hh:mm[:ss]		# 结束时间
		--monthdays day[,day...]	# 指定一个月的某一天
		--weekdays day[,day...]		# 指定周 还是  周天 
		
练习9:在 8:30 到 10 :30 之间不允许访问web03
	[root@lb01 ~]# iptables -t filter -I INPUT -p tcp -m time --timestart 8:30 --timestop 10:30 -j DROP


5、icmp模块
	禁ping, 默认本机无法ping别人 、别人无法ping自己
	iptables -t filter -I INPUT -p icmp -j DROP

	--icmp-type {type[/code]|typename}
		echo-request  (8) 请求 
		echo-reply    (0) 回应

练习10:允许本机ping其他机器,不允许其他机器ping本机
	[root@lb01 ~]# iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j DROP 

6、connlimit模块
	限制链接数,并发连接数

       --connlimit-upto n		#  如果现有连接数小于或等于  n  则 匹配
       --connlimit-above n		#  如果现有连接数大于n 则匹配

练习10:限制每个客户端主机允许两个telnet连接
	[root@lb01 ~]# iptables -t filter -I INPUT -p tcp --dport 23 -m connlimit --connlimit-above 2 -j DROP

7、limit模块
针对 报文速率 进行限制。 秒、分钟、小时、天。
       --limit rate[/second|/minute|/hour|/day] # 单位时间内报文数量
       --limit-burst number  # 报文数量(默认:5)
       
       500k (500 * 1000 = 500000 /1500 = 333 包, 有误差)
练习11:限制传输的带宽不可以超过500k
	[root@lb01 ~]# iptables -t filter -I OUTPUT -p tcp -m limit --limit 350/s  -j ACCEPT
	[root@lb01 ~]# iptables -t filter -A OUTPUT -p tcp -j DROP

练习12:允许10个数据报文快速通过,超过的数据报文  1/m
	[root@lb01 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit-burst 10 --limit 1/m -j ACCEPT
	[root@lb01 ~]# iptables -t filter -A INPUT -p icmp -j DROP

练习13:限制每分钟接收10个icmp的数据报文
	[root@lb01 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/m  -j ACCEPT
	[root@lb01 ~]# iptables -t filter -A INPUT -p icmp -j DROP

练习14 :限制每分钟只允许ping 10次,快速通过1个
    [root@lb01 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/m --limit-burst 1 -j ACCEPT
    [root@lb01 ~]# iptables -t filter -A INPUT -p icmp -j DROP

8、state模块
state模块可以让iptables实现连接追踪机制

	参数:
		--state : 链接的状态(多个用逗号分割)

	四个状态:
		NEW		        新建立一个会话
		ESTABLISHED 	        已建立的连接
		RELATED			表示内存产生的被动连接 (有关联关系的连接)
		INVALID			不明状态的链接 (无法识别的连接)

练习15:禁止所有的新链接,但是原来的ssh链接不拒绝
	[root@lb01 ~]# iptables -t filter -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
	[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -j DROP

七、企业一般配置

1.配置前考虑下

1.考虑防火墙开在哪台机器上
2.这台机器部署了哪些服务
    nginx
    keepalive
3.服务对应的端口和协议
    80
    443
    vrrp
    22
4.配置默认拒绝所有
 
#配置
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
[root@lb01 ~]# iptables -t filter -A INPUT -p vrrp -j ACCEPT
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 172.16.1.7 --dport 22 -j ACCEPT
[root@lb01 ~]# iptables -P INPUT DROP
 
#注意天坑:
配置好以后,不要清空防火墙规则,小心删除规则,因为我们最后一条配置的是默认拒绝所有,而清空防火墙规则不会更改其状态,还是默认拒绝所有,所以完犊子了
[root@lb01 ~]# iptables -P INPUT ACCEPT

2.防火墙规则永久生效

#安装
[root@lb01 ~]# yum install iptables* -y

#加入自启并立刻开启
[root@lb01 ~]# systemctl enable --now iptables

#配置完防火墙,执行以下操作,将自己配置的规则添加到防火墙的配置文件中
[root@lb01 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
 
[root@lb01 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Wed Dec 16 15:39:15 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [1:176]
:POSTROUTING ACCEPT [1:176]
COMMIT
# Completed on Wed Dec 16 15:39:15 2020
# Generated by iptables-save v1.4.21 on Wed Dec 16 15:39:15 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [40:5168]
-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 -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -s 10.0.0.1/32 -i eth0 -p tcp -j ACCEPT
-A INPUT -s 10.0.0.0/24 -i eth0 -p tcp -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Dec 16 15:39:15 2020

2.企业实际案例

1.对所有的地址开放本机的tcp(80、22、8080-9090)端口的访问
2.允许对所有的地址开放本机的基于ICMP协议的数据包访问
3.其他未被允许的端口禁止访问
#安装
[root@lb01 ~]# yum install iptables* -y

#加入开机自启并立刻开启软件
[root@lb01 ~]# systemctl enable --now iptables

#编写规则
[root@lb01 ~]# iptables -t filter -I INPUT -p tcp -m multiport --dports 80,22,8080:9090 -j ACCEPT
[root@lb01 ~]# iptables -t filter -A INPUT -p icmp -j ACCEPT
[root@lb01 ~]# iptables -t filter -A INPUT -j DROP

# 保存iptables规则
[root@lb01 ~]# service iptabels save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
posted @ 2021-08-24 17:01  小丶凡  阅读(35)  评论(0编辑  收藏  举报
1