iptables设置无状态和有状态防火墙学习总结

一、一些概念

1、netfilter

netfilter:在Linux内核中的一个软件框架,用于管理网络数据包。不仅具有网络地址转换(NAT)的功能,也具备数据包内容修改、以及数据包过滤等防火墙功能。利用运作于用户空间的应用软件,如iptable等,来控制Netfilter,系统管理者可以管理通过Linux操作系统的各种网络数据包。
下面是netfilter的五个钩子函数(hook):
在这里插入图片描述

2、iptables

我们可以使用 netfilter 构建一个简单的防火墙(自己编写C语言代码),实际上,Linux 已经内置了防火墙,也是基于 netfilter 的。这个防火墙叫做 iptables。 从技术上讲,防火墙的内核部分实现称为 Xtables,而 iptables 是一个用于配置防火墙的用户空间程序。 但是,iptables 通常用于指代内核部分实现和用户空间程序。

3、表(table),链(chain),规则(rule)

在这里插入图片描述

每个表包含几个链,每个链对应一个 netfilter Hook(上面介绍netfilter给出的图中有对应的执行时机)。基本上,每个链都指定了规则在何处执行。例如,FORWARD 链上的规则在NF_INET_FORWARD 上执行,INPUT 链上的规则在 NF_INET_LOCAL IN 上执行。 每个链都包含一组将被强制执行的防火墙规则。当我们设置防火墙时,我们会向这些链添加规则。
注:
INPUT链处理进入主机的数据
OUTPUT链处理出主机的数据
FORWARD链处理本机转发的数据

关于不同规则的执行顺序参考以下文章:
链接: https://www.jianshu.com/p/15bd803e3bb8

二、使用iptables

1、iptables命令结构

#命令格式:
iptables -t <table>  -<operation> <chain> <rule> -j <target>

添加规则命令:iptables -t 表类型 -A chain名 规则内容,规则又分为三部分:匹配(match)、目标(target)、动作(action)。

#以下面命令举例
#1、-A INPUT 表示向INPUT链的末尾添加新规则
#2、-p icmp --icmp-type echo-request 表示匹配ICMP报文类型为"echo-request"的数据包(即ping请求)
#3、-j ACCEPT表示对匹配到的数据包采取"ACCEPT"动作,即允许其进入系统
#注:1、属于chain 2、属于rule中的match 3、属于目标(target),也可以说是动作(action)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

2、常见命令

# 列出 NAT 表中所有的规则(没有行数) 
iptables -t nat -L -n 
#列出 FILTER 表中所有的规则(有行数)
iptables -t filter -L -n --line-numbers
#删除 NAT 表中所有的规则【在 docker 环境中不能轻易使用这个命令】
Iptables -t nat -F
#删除 FILTER 表中 INPUT 链的第二条规则
iptables -t filter -D INPUT 2 
#在 FILTER 表的 INPUT 链中添加一条规则,匹配 TCP 协议且目标端口为22 的流量,并将匹配的流量丢弃(DROP)
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

3、无状态防火墙

1)、实验拓扑如下:

在这里插入图片描述

2)、设置规则以防止外部机器(10.9.0.0/24)访问路由器机器,ping 除外。

#允许入站 ICMP 回显请求(ping),即允许远程机器 ping 这台机器
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#允许出站 ICMP 回显响应(pong),即允许此机器响应远程机器的 ping 请求
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
#将 OUTPUT 链的默认策略设置为 DROP。这意味着任何不符合 OUTPUT 链中任何规则的数据包都将被丢弃或拒绝。
iptables -P OUTPUT DROP
#将 INPUT 链的默认策略设置为 DROP。这意味着任何不符合 INPUT 链中任何规则的数据包都将被丢弃或拒绝。
iptables -P INPUT DROP

3)、请你修改路由器的 iptables 配置,使得容器 10.9.0.5 不可以 ping192.168.60.0/24 网络内的机器,但是 192.168.60.0/24 网络内的机器可以 ping 容器 10.9.0.5

#-s 10.9.0.5表示源地址
#-d 192.168.60.0/24表示目标地址(这里为一个网段)
#-j DROP表示匹配到的数据包被丢弃
iptables -A FORWARD -s 10.9.0.5 -d 192.168.60.0/24 -p icmp --icmp-type echo-request -j DROP

4、有状态防火墙

1)连接跟踪(connection tracking)

Conntrack是Linux内核中的一个模块,用于跟踪网络连接状态并维护相应的连接信息。它可以在IP层和TCP/UDP层之间提供一个抽象接口,使得上层协议可以不必关注底层的细节,而直接使用连接状态。

#检查路由器容器上的连接跟踪信息可以用以下命令
conntrack -L
#为了实时输出信息,我们用 watch 命令来定期执行上面命令
watch -n1 conntrack -L
#可以使用以下命令清空记录
conntrack -D

2)有状态防火墙的四个状态

  • NEW(新连接):表示这是一个新建立的连接,尚未进行任何数据传输。

  • ESTABLISHED(已建立连接):表示连接已经建立成功,并且数据可以正常传输。

  • RELATED(相关连接):表示这个连接与另一个连接有关联,例如FTP数据传输时建立的控制连接。

  • INVALID(无效连接):表示这个连接状态不合法,很可能是由于防火墙或其他安全设备的干扰导致的。

3)任务

  • 外 网 (10.9.0.0/24) 只 能 telnet 192.168.60.5 , 不 能 telnet 其 他 内 网(192.168.60/24)机子
  • 内部主机可以访问所有内部服务器和外网的服务器。
#所有已连接和相关连接数据包都允许通行
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
#-s 10.9.0.0/24 -d 192.168.60.5的新连接数据包通行
iptables -A FORWARD -s 10.9.0.0/24 -d 192.168.60.5 -p tcp --dport 23 -m conntrack --ctstate NEW -j ACCEPT
#不允许外网通过telnet访问192.168.60.0/24网段主机(由于上一条规则192.168.60.5除外)
iptables -A FORWARD -s 10.9.0.0/24 -d 192.168.60.0/24 -p tcp --dport 23 -m conntrack --ctstate NEW -j DROP

#所有已建立连接和已建立连接的关联连接允许通行,这个命令上面已经有了,可以不写,但是我将两点要求分开分析了,所以这里又写一遍
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
#以下应该不用再解释了
iptables -A FORWARD -s 192.168.60.0/24 -d 10.9.0.0/24 -j ACCEPT
#这句代表所有的地址,不管内网外网均可连接
iptables -A FORWARD -s 192.168.60.0/24 -d 0.0.0.0/0 -j ACCEPT
#这句代表外网不能访问内网
iptables -A FORWARD -s 0.0.0.0/0 -d 192.168.60.0/24 -m conntrack --ctstate NEW -j DROP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值