iptables服务详解

bash 复制代码
# 1. 关闭selinux,不关闭selinux,iptables不读取配置文件   
sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config
setenforce 0

# 2. 关闭firewalld并关闭开机自启
centos7中默认的防火墙是firewalld,使用iptables需要先关闭firewalld防火墙
systemctl stop firewalld
systemctl disable firewalld

# 3. 安装iptables
yum install iptables-services   iptables  -y

# 4. 启动和查看iptables状态
systemctl start iptables
systemctl enable iptables

# 5. 检查内核模块
lsmod |egrep "nat|filter|ip"
ip_tables              27126  1 iptable_filter   ###真正处理规则的。

# 6. 加载如下模块到linux内核
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

# 7. 添加开机自动加载
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
chmod +x /etc/rc.d/rc.local

# 8. 开启ipv4转发
echo "net.ipv4.ip_forward = 1"  >> /etc/sysctl.conf
sysctl -p
net.ipv4.ip_forward = 1

iptables工作流程

iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。

  1. 防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
  2. 如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。
  3. 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则(最后一条)得到明确的阻止还是通过。
  4. 防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。

iptables的表与链介绍

  1. Filter表(常用):

    • INPUT链: 处理来自外部的数据。
    • OUTPUT链: 处理向外发送的数据。
    • FORWARD链: 处理转发到本机的其他网卡设备上的数据。
  2. NAT表(常用):

    • PREROUTING: 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
    • POSTROUTING链: 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
    • OUTPUT链: 处理本机产生的数据包。
  3. Mangle表(基本不用): 用于指定如何处理数据包。它能改变TCP头中的QoS位

  4. Raw表(基本不用): 用于处理异常

iptables默认规则解析

**

perl 复制代码
cat /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]
# 放行所有 已建立的连接(ESTABLISHED) 和 关联的连接(RELATED),确保正常的双向通信,避免影响现有会话。
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 允许所有 ICMP 协议流量
-A INPUT -p icmp -j ACCEPT
# 允许本地回环流量
-A INPUT -i lo -j ACCEPT
# 允许 SSH 连接 ,放行新的 SSH 连接请求,当ssh连接已经建立时,再发起请求时第一条规则发挥作用(放行)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
# 拒绝所有转发流量,并且以ICMP协议回应,生产环境中建议直接把(REJECT --reject-with icmp-host-prohibited)改为(DROP),因为默认的规则会有回应操作,如果遭受大量攻击访问,也是不小的请求负载,而DROP直接拒绝,不回应任何信息。
-A INPUT -j https://www.hefeilaws.com/ REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

iptables的rules解释

Rules包括一个条件和一个目标(target),如果满足条件,就执行目标(target)中的规则或者特定值。如果不满足条件,就判断下一条Rules。

目标值

ACCEPT: 允许防火墙接收数据包

DROP: 防火墙丢弃包

QUEUE: 防火墙将数据包移交到用户空间

RETURN: 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。

描述规则的参数

以下这些规则参数用于描述数据包的协议、源地址、目的地址、允许经过的网络接口,以及如何处理这些数据包。这些描述是对规则的基本描述。

**

diff 复制代码
-p 协议: 指定规则的协议,如tcp, udp, icmp等,可以使用all来指定所有协议。如果不指定-p参数,则默认是all值。
-s 源地址: 指定数据包的源地址,如果不指定-s参数,就代表所有地址
-d 目的地址: 指定目的地址
-j 执行目标: 指定了当与规则(Rule)匹配时如何处理数据包,可能的值是ACCEPT, DROP, QUEUE, RETURN
-i 输入接口: 指定了要处理来自哪个接口的数据包,如果不指定-i参数,那么将处理进入所有接口的数据包
-o 输出接口: 指定了数据包由哪个接口输出,如果不指定-o选项,那么系统上的所有接口都可以作为输出接口
-sport 源端口: 针对 -p tcp 或者 -p udp, 缺省情况下,将匹配所有端口
--dport 目的端口: 针对-p tcp 或者 -p udp
--icmp-type ICMP类型: 针对-p icmp

iptables常用命令

查看现有规则

**

bash 复制代码
# 查看所有表中的规则:
sudo iptables -L -v -n
# -L:列出规则
# -v:显示详细信息,包括数据包计数和字节数
# -n: 以数字形式显示 IP 地址和端口号,而不是解析主机名

# 查看特定表中的规则:
sudo iptables -t nat -L -v -n

# 查看对应规则的序号:
iptables -L -n --line-numbers

添加规则

**

bash 复制代码
iptables -A INPUT -p tcp -s 192.168.1.10 --dport 80 -j ACCEPT
# -A:将规则添加到INPUT链
# -p:指定协议
# -s:指定源ip
# --dport:目标端口
# -j ACCEPT:表示接受流量

# FORWARD链中添加一条规则,丢弃来自特定 IP 的所有流量:
sudo iptables -A FORWARD -s 10.0.0.5 -j DROP
# -s:源ip地址
# -j DROP:匹配后丢弃流量

# 根据序号添加规则:
iptables -I  INPUT 2 -s 172.0.0.0/8  -p tcp --dport 10255 -j ACCEPT
# 上述命令会在 INPUT 链的第 2 条规则之前插入一条新规则

删除规则

**

bash 复制代码
# 删除特定链中的一条规则,假设规则编号为 2:
iptables -D INPUT 2

# 删除特定表特定链中的一条规则
iptables -t nat -D  PREROUTING 1
# -D: 表示删除
# 1: 规则编号
# -t 表示选择哪个表

# 根据规则内容删除规则:
iptables -D INPUT -p tcp -s 192.168.1.10 --dport 80 -j ACCEPT
# 与添加规则时相同的选项,但使用-D来删除规则

修改规则

不支持直接修改规则,只能先删除原有规则,再添加修改后的规则。

**

css 复制代码
# 先删除旧规则:
iptables -D  INPUT -p tcp -s 192.168.1.10 --dport 80 -j ACCEPT

# 然后添加修改后的规则:
iptables -A  INPUT -p tcp -s 192.168.1.10 --dport 8080 -j ACCEPT

清空规则

**

r 复制代码
# 清空所有链中的规则,默认为filter表
sudo iptables -F 

# 清空特定链中的规则
sudo iptables -F INPUT

# 清空特定表中的规则
sudo iptables -t nat -F  

# 清空特定表特定链中的规则
sudo iptables -t nat -F PREROUTING

设置链的默认策略

**

css 复制代码
# 设置INPUT链的默认策略为丢弃流量
iptables -P INPUT DROP

# 设置默认策略为接受
iptables -P INPUT ACCEPT

设置端口转发

  1. 192.168.171.139:5555转发到192.168.171.1:9999端口

**

css 复制代码
iptables -t nat -A PREROUTING --dst 192.168.171.139 -p tcp --dport 5555 -j DNAT --to-destination 192.168.171.1:9999
iptables -t nat -A POSTROUTING --dst 192.168.171.1 -p tcp --dport 9999 -j SNAT --to-source 192.168.171.139

# -t:指定表
# -A:添加
# -j DNAT --to-destination:目标地址转换
  1. 实现内网机器访问外网

A机器:公网100.100.137.20 内网192.168.1.10

B机器:内网:192.168.1.11

**

css 复制代码
1. 将B机器的默认路由网关改为A机器的内网IP
2. iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -j SNAT --to-source 100.100.137.20

iptables备份和恢复

备份iptables规则

**

bash 复制代码
# 备份所有表的规则:
iptables-save > /opt/iprules_all.txt

# 默认将所有规则保存到"/etc/sysconfig/iptables"文件中
service iptables save

恢复iptables规则

**

bash 复制代码
# 将上面所备份的规则恢复到iptables中:
iptables-restore < /opt/iprules_all.txt

# 默认将/etc/sysconfig/iptables文件中的内容加载到iptables中,也就是说,如果备份使用的是service iptables save那么恢复的时候就应该使用service iptables start
service iptables start
相关推荐
面向星辰4 小时前
扣子开始节点和结束节点
java·服务器·前端
一匹电信狗5 小时前
【C++】封装红黑树实现map和set容器(详解)
服务器·c++·算法·leetcode·小程序·stl·visual studio
大锦终5 小时前
【Linux】网络层与数据链路层中重点介绍
linux·运维·服务器·网络
lht6319356126 小时前
从Windows通过XRDP远程访问和控制银河麒麟 v10服务器
linux·运维·服务器·windows
qiudaorendao6 小时前
作业11.9
linux·服务器·apache
岚天start7 小时前
解决方案—K8S集群的日志按天并按照命名空间分类定时同步到日志服务器
服务器·docker·kubernetes·shell·日志备份
顾安r8 小时前
11.10 脚本算法 五子棋 「重要」
服务器·前端·javascript·游戏·flask
gpfyyds6669 小时前
配置dns主从服务。要求从服务器能够定时从主服务器同步数据。
运维·服务器
倔强的石头1069 小时前
【Linux指南】操作系统的理解:从“内核”到“广义系统”的完整认知
linux·运维·服务器
我根本不会啊9 小时前
2025 11 09 作业
java·linux·服务器