惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
F
Fox-IT International blog
C
Cisco Blogs
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
Malwarebytes
Malwarebytes
Latest news
Latest news
D
Darknet – Hacking Tools, Hacker News & Cyber Security
SecWiki News
SecWiki News
N
News and Events Feed by Topic
T
True Tiger Recordings
www.infosecurity-magazine.com
www.infosecurity-magazine.com
美团技术团队
P
Palo Alto Networks Blog
V
V2EX - 技术
AWS News Blog
AWS News Blog
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
量子位
博客园 - 【当耐特】
P
Proofpoint News Feed
N
News and Events Feed by Topic
博客园 - 司徒正美
U
Unit 42
G
Google Developers Blog
阮一峰的网络日志
阮一峰的网络日志
Schneier on Security
Schneier on Security
G
GRAHAM CLULEY
O
OpenAI News
T
The Blog of Author Tim Ferriss
F
Future of Privacy Forum
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News | PayPal Newsroom
V
Visual Studio Blog
V
V2EX
Simon Willison's Weblog
Simon Willison's Weblog
Microsoft Security Blog
Microsoft Security Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threat Research - Cisco Blogs
Spread Privacy
Spread Privacy
N
Netflix TechBlog - Medium
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Docker
小众软件
小众软件
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
Intezer

郑文峰的博客

使用dify对接飞书多维表格 使用n8n对接飞书多维表格 服务启动时出现 OOM Bug 通缉令 一次服务升级时pg表DDL执行超时失败 Go语言高性能编程 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言空结构体:零内存消耗的高效编程 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解VXLAN网络 理解Linux TunTap设备 kafka中listener和advertised.listeners的作用 django rest_framework 分页 django后端服务、logstash和flink接入VictoriaMetrics指标监控 python中import原理 docker容器单机网络 手动实现docker容器bridge网络模型 mysql之MVCC原理 mysql之日志 使用java开发logstash的filter插件 使用python实现单例模式的三种方式 redis之缓存 redis之分片集群 redis之哨兵机制 redis之主从库同步 redis之持久化 redis之五种基本数据类型 go中如何处理error pod中将代码与运行环境分离 友链 ddt源码分析 python装饰器的使用方法 读书笔记:如何阅读一本书 使用ddt实现unittest的参数化测试 分布式锁 使用kubeadm安装k8s 优化gin表单的错误提示信息 gin中validator模块的源码分析 go简单使用grpc python简单使用grpc k8s之PV、PVC和StorageClass k8s之StatefulSet k8s之DaemonSet k8s之Job和CronJob k8s之ConfigMap和Secret k8s之Service k8s之Pod k8s之Deployment 容器的本质 docker容器 python迭代器与生成器 python元编程 python垃圾回收机制 python上下文管理器 django rest_framework使用jwt django rest_framework异常处理 django rest_framework 自定义文档 django压缩文件下载 django rest_framework使用pytest单元测试 django restframework choice 自定义输出数据 django Filtering 使用 django viewset 和 Router 配合使用时报的错 django model的序列化 django中使用AbStractUser django.core.exceptions.ImproperlyConfigured Application labels aren't unique, duplicates users django 中 media配置 django 外键引用自身和on_delete参数 django 警告 while time zone support is active Flask使用flask_socketio实现websocket flask结合mongo tornado 文件上传 tornado 使用jwt完成用户异步认证 tornado 用户密码 bcrypt加密 tornado 结合wtforms使用表单操作 tornado finish和write区别 tornado 使用peewee-async 完成异步orm数据库操作 pyspark streaming简介 和 消费 kafka示例 使用hue创建ozzie的pyspark action workflow
快速了解iptables
2023-05-15 · via 郑文峰的博客

# 初识

# iptables是什么?

iptables是一个在Linux操作系统上使用的防火墙工具,它可以用于配置和管理网络数据包的过滤、转发和修改等操作。

  1. 过滤数据包:iptables可以根据不同的规则过滤网络数据包,例如根据源IP地址、目标IP地址、端口号等进行过滤。

  2. 转发数据包:iptables可以将网络数据包从一个接口转发到另一个接口,实现网络数据的转发功能。

  3. 修改数据包:iptables可以修改网络数据包的源IP地址、目标IP地址、端口号等信息,实现网络数据的伪装和欺骗。

# Netfilter是什么?

Netfilter是Linux内核中的一个网络数据包过滤框架,它可以在数据包进入和离开网络接口时进行拦截和处理。iptables就是基于Netfilter框架实现的一个用户空间工具,它可以通过调用Netfilter提供的API来实现网络数据包的过滤、转发和修改等操作。

netfilter的架构就是在整个网络流程的若干位置放置一些钩子,并在每个钩子上挂载一些处理函数进行处理。

IP层的5个钩子点的位置,分别是PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD。原理图如下:

当网卡上收到一个包送达协议栈时,最先经过的netfilter钩子是PREROUTING,如果确实有用户埋了这个钩子函数,那么内核将在这里对数据包进行目的地址转换(DNAT)。不管在PREROUTING有没有做过DNAT,内核都会通过查本地路由表决定这个数据包是发送给本地进程还是发送给其他机器。如果是发送给其他机器(或其他network namespace),就相当于把本地当作路由器,就会经过netfilter的FORWARD钩子,用户可以在此处设置包过滤钩子函数,例如iptables的reject函数。所有马上要发到协议栈外的包都会经过POSTROUTING钩子,用户可以在这里埋下源地址转换(SNAT)或源地址伪装(Masquerade,简称Masq)的钩子函数。如果经过上面的路由决策,内核决定把包发给本地进程,就会经过INPUT钩子。本地进程收到数据包后,回程报文会先经过OUTPUT钩子,然后经过一次路由决策(例如,决定从机器的哪块网卡出去,下一跳地址是多少等),最后出协议栈的网络包同样会经过POSTROUTING钩子。

# iptables实现

iptables的底层实现是通过Linux内核中的Netfilter框架来实现的。iptables是用户空间的一个程序,通过netlink和内核的netfilter框架打交道,负责往钩子上配置回调函数。

# iptables三板斧:table、chain和rule

# chain

iptables有5条内置链分别对应着netfilter的5个钩子:

  • INPUT链:一般用于处理输入本地进程的数据包。
  • OUTPUT链:一般用于处理本地进程的输出数据包。
  • FORWARD链:一般用于处理转发到其他机器/network namespace的数
    据包。
  • PREROUTING链:可以在此处进行DNAT。
  • POSTROUTING链:可以在此处进行SNAT。

# table

除了5条内置链之外,还可以在表中定义自己的链:

  • filter 表:用于过滤数据包,是默认的表。它包含 INPUT、OUTPUT 和 FORWARD 三个链,分别用于处理进入本机的数据包、从本机发出的数据包和转发的数据包。

  • nat 表:用于网络地址转换(NAT)。它包含 PREROUTING、POSTROUTING 和 OUTPUT 三个链,分别用于处理进入本机前的数据包、从本机发出的数据包和本机生成的数据包。

  • mangle 表:用于修改数据包的特定字段。如 TTL、TOS 等。它包含 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING 五个链,分别用于处理进入本机前的数据包、进入本机的数据包、转发的数据包、从本机发出的数据包和本机生成的数据包。

  • raw 表:用于配置连接追踪系统。它包含 PREROUTING 和 OUTPUT 两个链,分别用于处理进入本机前的数据包和从本机发出的数据包。

这5张表的优先级从高到低是:raw、mangle、nat、filter、security。

iptables表与链的对应关系图如下:

不同的表挂不同的链,这是为了分类管理iptables规则(rule)的,系统所有的iptables规则都被划分到不同的表集合中。

# rule

iptables的规则就是挂载netfilter钩子上的函数,用来修改数据包的内容或者过滤数据包等操作,iptables的表就是所有规则的5个逻辑集合。

iptables规则如何编写?

一条iptables规则包含两部分信息:匹配条件和动作。

匹配条件即为匹配数据包被这条iptables规则“捕获”的条件,例如协议类型、源IP、目的IP、源端口、目的端口、连接状态等。每条iptables规则允许多个匹配条件任意组合,从而实现多条件的匹配,多条件之间是逻辑与(&&)关系。

常见动作如下:

  • ACCEPT:允许数据包通过。

  • DROP:丢弃数据包,不给出任何响应。

  • REJECT:拒绝数据包,给出响应告知发送方被拒绝。

  • SNAT:源地址转换,用于网络地址转换(NAT)。

  • DNAT:目标地址转换,用于网络地址转换(NAT)。

  • REDIRECT:重定向数据包到指定端口或 IP 地址。

# iptables命令使用

# 参数

  • -A:添加规则到指定链的末尾。
    例如:iptables -A INPUT -s 192.168.1.0/24 -j DROP

  • -D:删除指定链中的规则。
    例如:iptables -D INPUT -s 192.168.1.0/24 -j DROP

  • -I:插入规则到指定链的开头或指定位置。
    例如:iptables -I INPUT 2 -s 192.168.1.0/24 -j DROP

  • -R:替换指定链中的规则。
    例如:iptables -R INPUT 2 -s 192.168.1.0/24 -j DROP

  • -L:列出指定链中的规则。
    例如:iptables -L INPUT

  • -F:清空指定链中的规则。
    例如:iptables -F INPUT

  • -N:创建新的自定义链。
    例如:iptables -N MYCHAIN

  • -X:删除指定的自定义链。
    例如:iptables -X MYCHAIN

  • -P:设置指定链的默认策略。
    例如:iptables -P INPUT DROP

  • -s:指定源 IP 地址或地址段。
    例如:iptables -A INPUT -s 192.168.1.0/24 -j DROP

  • -d:指定目标 IP 地址或地址段。
    例如:iptables -A OUTPUT -d 192.168.1.0/24 -j DROP

  • -p:指定协议类型。
    例如:iptables -A INPUT -p tcp -j DROP

  • -m:指定匹配模块。
    例如:iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

  • -j:指定动作。
    例如:iptables -A INPUT -s 192.168.1.0/24 -j DROP

  • -i:指定进入接口。
    例如:iptables -A INPUT -i eth0 -j DROP

  • -o:指定输出接口。
    例如:iptables -A OUTPUT -o eth0 -j DROP

# 常规武器

  1. 查看所有iptables规则
iptables -L -n

1

  1. 配置防火墙规则策略
  • 配置允许SSH连接
iptables -A INPUT -s 10.20.30.40/24 -p tcp --dport 22 -j ACCECT

1

-A INPUT​是以追加的方式增加该规则在INPUT链上,-s 10.20.30.40/24 -p tcp --dport 22​是匹配上源地址为10.20.30.40/24网段,tcp协议和目的端口22的数据包,-j ACCET​表示允许该数据包进行连接。这里没有指定表默认是filter表。

  • 阻止来自某个IP/网段的所有连接
iptables -A INPUT -s 10.10.10.10 -j DROP

1

-j DROP​会发送给源地址为10.10.10.10一个连接拒绝的回程报文。

  • 封锁端口
iptables -A OUTPUT -p tcp --dport 1234 -j DROP

1

禁止本地进程访问外部1234端口。因为是在挂载OUTPUT链上该条规则,所以是屏蔽本地进程对外的连接。如果想要禁止外部连接访问本地1234端口,则需要在INPUT链上新增规则。

iptables -A INPUT -p tcp --dport 1234 -j DROP

1

  • 端口转发
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

1

该条规则添加到PREROUTING链下的nat表中,匹配上eth0网卡上所有目的端口为80的tcp数据包,匹配上则将转发到8080端口上。因为将目的端口改变了,则需要写到nat表中。

  • 禁ping
iptables -A INPUT -p icmp -j DROP

1

在INPUT链filter表中新增禁止icmp协议数据包的规则。

  1. DNAT
iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 10.20.30.40:8080

1

和端口转发原理差不多,区别在于,端口转发不修改IP地址,而这里修改了目的IP地址。在nat表PREROUTING中新增目的地址为1.2.3.4,目的端口80的tcp数据包的DNAT动作,将目的地址改为了10.20.30.40:8080。

DNAT仅发生在nat表的PREROUTING链中,并且该操作需要确保开启ipforward功能。

  1. SNAT
iptables -t nat -A POSTROUTING -s 192.168.1.2 -j SNAT --to-source 10.172.16.1

1

在nat表POSTROUTING链中新增将源地址192.168.1.2的数据包进行SNAT操作,改为源地址10.172.16.1.

SNAT操作仅可发生在nat表的POSTROUTING链中。

  1. 保存与恢复

iptables规则修改仅是临时的,重启则丢失,执行以下命令永久保存。

iptables-save

1

也可将规则保存在文件中

iptables-save > iptables.bak

1

后续可以通过以下命令进行恢复

iptables-restore < iptables.bak

1

# 巨人的肩膀

  • 《kubernetes网络权威指南》