郑文峰的博客 郑文峰的博客
首页
  • Go语言高性能编程
分类
标签
归档
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
GitHub (opens new window)

zhengwenfeng

穷则变,变则通,通则久
首页
  • Go语言高性能编程
分类
标签
归档
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
GitHub (opens new window)
  • python

  • go语言

  • linux

    • 快速了解iptables
      • 初识
        • iptables是什么?
        • Netfilter是什么?
        • iptables实现
      • iptables三板斧:table、chain和rule
        • chain
        • table
        • rule
      • iptables命令使用
        • 参数
        • 常规武器
      • 巨人的肩膀
    • 理解Linux TunTap设备
    • 理解VXLAN网络
    • 理解Linux IPIP隧道
  • 其他

  • 编程
  • linux
zhengwenfeng
2023-05-15
目录

快速了解iptables

# 初识

# 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网络权威指南》

‍

#linux#计算机网络#Linux网络虚拟化
上次更新: 2025/05/07, 05:17:56
Go语言高效IO缓冲技术详解
理解Linux TunTap设备

← Go语言高效IO缓冲技术详解 理解Linux TunTap设备→

最近更新
01
Go语言高效IO缓冲技术详解
06-14
02
Go语言延迟初始化(Lazy Initialization)最佳实践
06-14
03
Go语言字符串拼接性能对比与优化指南
06-14
更多文章>
Theme by Vdoing | Copyright © 2022-2025 zhengwenfeng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式