iptables基本功能

防⽕墙概述

iptables 是 Linux 操作系统中用于设置、维护和检查 IP 数据包过滤规则的工具。它为网络流量提供了过滤和转发的能力,能够控制哪些数据包可以通过计算机的网络接口。

功能

● 包过滤:允许或拒绝特定的数据包。
● 网络地址转换(NAT):修改数据包的源地址或目标地址,常用于实现内网与外网的互联。
● 状态跟踪:跟踪网络连接的状态,以便实施基于连接状态的过滤规则。

结构

iptables 规则分为多个表(table),每个表包含链(chains)和规则(policy):
● 表:存放链的容器,防⽕墙最⼤概念
○ filter:默认表,处理数据包的过滤。
○ nat:用于网络地址转换。
○ mangle:用于修改数据包的特定字段。
○ raw:用于配置原始数据包处理。
● 链:存放规则的容器
○ INPUT: 处理发送到本机的数据包。
■ 过滤入站流量,决定哪些数据包可以被本机接受。
■ 通常用于保护服务器,防止未授权的访问。
○ OUTPUT: 处理从本机发出的数据包。
■ 过滤出站流量,决定哪些数据包可以被发送到网络。
■ 用于限制本机应用程序的网络访问,控制数据流出。
○ FORWARD: 处理通过本机转发的数据包。
■ 在本机不作为终端(例如路由器)的情况下,控制经过本机的流量。
■ 通常用于实现网络路由器的流量管理,过滤通过本机的转发数据包。
○ PREROUTING: 在数据包到达路由决策之前处理它们。
■ 用于修改即将到达本机或被转发到其他主机的数据包。
■ 可以用于 NAT(如源地址转换和目标地址转换),例如将来自外部的请求转发到内部的特定服务器。
○ POSTROUTNG: 在数据包离开路由器后进行处理。
■ 用于修改即将离开本机的数据包,主要用于源地址转换。
■ 通常用于 NAT,特别是在出站流量的处理上,以便隐藏内部网络的结构。
● 规则 准许或拒绝规则 ,未来书写的防⽕墙条件就是各种防⽕墙规则

iptables 执⾏过程

  1. 防⽕墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进⾏过滤的。
  2. 如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数据包就不再向下匹配新的规则。
  3. 如果规则中没有明确表明是阻⽌还是通过的,也就是没有匹配规则,向下进⾏匹配,直到匹配默认规则得到明 确的阻⽌还是通过。
  4. 防⽕墙的默认规则是所有规则都匹配完才会匹配的。
    在这里插入图片描述

每个表说明

优先级

规则表之间的优先顺序
Raw>>>>mangle>>>>nat>>>>filter
规则链之间的优先顺序(分三种情况):
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

表介绍

  1. filter表
    主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:
    链名 目的
    INPUT 处理目的地是本地的包,即所有目的地址为本机的网络数据包。
    FORWARD 过滤非本地产生的且目的地也不是本地的包,这些包需要本机进行转发至其他目标地址。
    OUTPUT 负责过滤所有由本机生成并意图发送到外部网络的数据包。
  2. nat表
    主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。
    如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链:
    链名 功能描述
    PREROUTING 在数据包刚到达防火墙时,改变其目的地址
    OUTPUT 改变本地产生的数据包的目的地址
    POSTROUTING 在数据包即将离开防火墙之前,改变其源地址

实验测试

环境准备

机器网卡ip网关
宿主机vmnet8192.168.10.1192.168.10.2
vm1ens33192.168.10.101192.168.10.2
vm2ens33192.168.10.102192.168.10.2
在vm1、vm2上进行如下操作
# 1.安装iptables-services
yum install iptables-services -y 

#防⽕墙相关模块 加载到内核中
#写⼊到开机⾃启动.
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state 
#永久
cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state 
EOF

# 2. 停止其他防火墙,禁止开机自启动
systemctl stop firewalld 
systemctl disable firewalld 

# 3. 启动iptables,开启开机自启动
 systemctl start iptables.service
 systemctl enable iptables.service

# 4. 查看filter表中的规则 ,默认查看的是filter表
iptables -nL

# 5. 查看指定表中的规则
iptables -t nat -nL

iptables命令参数

在这里插入图片描述
在这里插入图片描述

配置filter表规则

正式配置之前先备份, 清空规则

iptables -F  # 清除所有规则,不会处理默认的规则
iptables -X  # 删除⽤户⾃定义的链
iptables -Z  # 链的计数器清零(数据包计数器与数据包字节计数器)
iptables -nL # 查看当前规则

禁止访问22端口

注意:测试这个会断开ssh

#拒绝⽤户访问22端⼝
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
#查看规则并加上序号
iptables -t filter -nL --line-number
#删除规则
iptables -t filter -D INPUT 1 #根据序号删除

封ip 屏蔽某个ip

# 在192.168.10.101 上执行,屏蔽 192.168.10.102,此时 192.168.10.102 ping不通 101
iptables -I INPUT -s 192.168.10.102 -j DROP 

# 删除当前规则
iptables -D INPUT -s 192.168.10.102 -j DROP 

禁止网段连入

# 禁止192.168.10.0/24网段访问 8888端口
iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 8888 -j DROP

# 测试
# 在192.168.10.101上
nc -lk 8888

# 在192.168.10.102上
telnet 192.168.10.101 8888

# ------ 连接失败 ------

# 产出该规则
iptables -D INPUT -s 192.168.10.0/24 -p tcp --dport 8888 -j DROP

# 再次执行,连接成功
telnet 192.168.10.101 8888

只允许指定网段连入

#⽅法1: 利⽤ ! 进⾏排除,即:除了 192.168.10.0/24 都拒绝
iptables -I INPUT ! -s 192.168.10.0/24 -j DROP

#⽅法2: 修改链默认规则 修改为拒绝 添加准许
# 先配置好规则 准许规则
iptables -A INPUT -s 192.168.10.0/24 -j ACCEPT

# 修改默认规则, 将INPUT链设置为DROP
iptables -P INPUT DROP 

#测试完成后 修改回去
iptables -P INPUT ACCEPT

指定多个端口

iptables -I INPUT -p tcp --dport 8888 -j DROP
iptables -I INPUT -p tcp --dport 9999 -j DROP

#指定多个端⼝
#    -m multiport -p tcp --dport 80,443
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
iptables -nL

# 如果是 连续的端⼝ 可以不加上-m multiport 1:1024
iptables -A INPUT -p tcp --dport 1:1024 -j ACCEPT # 指定端口范围

防火墙规则的保存与恢复

● iptables-save 默认输出到屏幕
● iptables-restore 加上⽂件
● 写⼊到/etc/sysconfig/iptables

iptables-save >/etc/sysconfig/iptables # 保存至为文件

iptables-restore </etc/sysconfig/iptables  # 从文件中恢复

nat

snat

实现 SNAT(源网络地址转换)时,通常是在 POSTROUTING 链上添加规则。SNAT 主要用于改变离开网络的数据包的源地址,使得数据包可以被正确路由到目标并返回。
● POSTROUTING:处理所有离开的数据包。通过在此链上添加 SNAT 规则,可以更改数据包的源地址。

环境准备

在这里插入图片描述

目标

vm2通过vm1上网。

# 验证 在 vm1 192.168.2.1 执行
ping 192.168.2.2  # 成功

# 验证 在 vm2 192.168.2.2 执行
ping 192.168.2.1  # 成功

ping www.baidu.com # 不成功

# 在 vm1 192.168.2.1 执行  :设置nat
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf  # 开启路由转发功能
sysctl -p # 实时更改:用于重新 加载和应用 系统内核参数 
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.10.101  

# 此时 在 vm2 192.168.2.2 执行
ping www.baidu.com # 成功

# 删除 规则
# iptables -t nat -D POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.10.101  

DNAT 实现端口映射

在实现端口映射(也称为端口转发)时,通常是在 PREROUTING 链上添加规则。这是因为 PREROUTING 链用于处理进入的数据包,允许我们在数据包被路由之前修改其目的地址或端口。
端口映射的基本概念:
● PREROUTING:用于处理所有进入的数据包。在这里,可以根据目的端口或地址对数据包进行修改,例如将一个端口的流量转发到另一个端口或地址。

目标1:在宿主机上 通过 192.168.10.101 访问到 192.168.2.2:80 端口。
# 1. 在192.168.2.2 上安装httpd
yum install httpd -y
systemctl start httpd  # 默认 80 端口

# 2. 在192.168.10.101 上安装 elinks
yum install elinks -y
elinks 192.168.2.2 # 访问成功

# 3. 此时在宿主机上访问 192.168.10.101
# 访问不成功

# 4. 在 vm1  192.168.10.101 上执行 DNAT,将192.168.2.2 的 80 映射到 192.168.10.101:80上
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.2:80

# 5. 此时在 宿主机方位192.168.10.101
# 访问成功
目标2:通过 192.168.10.101:7777端口访问 192.168.2.2的22端口,即:在宿主机通过ssh root@192.168.10.101 7777 连接到192.168.2.2
# 1. 在vm1 上执行 
iptables -t nat -A PREROUTING -d 192.168.10.101 -p tcp --dport 7777 -j DNAT --to-destination 192.168.2.2:22

# 2. 在宿主机上执行
ssh root@192.168.10.101 -p 7777 # 此时可以成功连接到 vm2 192.168.2.2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

埃及法老

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值