iptables 是 Linux 内核集成的防火墙系统, 几乎所有 Linux 发行版都会内置 iptables。

iptables 对进出的 IP 数据报进行处理和过滤, 过滤规则(rule)存储在4个表(table)中, 表中的规则又组成了数条完整的规则链(chain)。

iptables 可以追踪数据包所属的连接(TCP/UCP/ICMP协议)及其状态,允许根据连接状态进行处理和过滤。

表与规则链

iptables 中有四张表, 优先级从高到低是:

  • raw: 某个链上一旦使用了raw表将会跳过 NAT 和连接跟踪处理。
  • mangle: 用于修改数据包的内容
  • nat: 用于网络地址转换,可以修改数据包的源地址或目标地址
  • filter: iptables 的默认表, 可以抛弃或接受数据包

表中的规则构成了链:

  • PREROUTING: 来自网络接口(网卡)的数据包首先会经过 PREROUTING 链,经过 raw, mangle, nat 表中规则的处理然后进行路由判断。

    • 若数据包的目的地址为本机则会进入INPUT链
    • 若数据包的目的地址为其它地址则进入FORWARD链进行转发
  • INPUT: 处理目标为本机的数据包, 经过 mangle,filter 表中规则的处理然后发给 nginx、mysql等上层进程处理 (此处存疑: nat 表中似乎也包括INPUT链, 望大佬指正)
  • FORWARD: 处理转发的数据包,经过 mangle, filter 表中规则处理后进入POSTROUTING链
  • OUTPUT: 处理本地进程发出的数据包, 经过 raw, mangle, nat, filter 表中规则的处理然后进入POSTROUTING链
  • POSTROUTING: 处理来自 FORWARD 和 OUTPUT 链的数据包并发送给网络接口发出,可在 raw, mangle, nat 表中配置规则

在运行中 iptables 可能处理三种场景:

  • 入站数据流: 网络接口 -> PREROUTING -> INPUT -> 本地
  • 转发数据流: 网络接口 -> PREROUTING -> FORWARD -> POSTROUTING -> 网络接口
  • 出站数据流: 本地 -> OUTPUT -> POSTROUTING -> 网络接口

虽然我们通常将 iptables 视为单个实体, 但实际上它由两部分组成: 执行数据包过滤处理的内核模块 netfilter 和运行于用户空间的过滤规则配置工具 iptables。

连接跟踪

iptables 是有状态的防火墙,使用 ip_conntrack 模块进行连接跟踪。ip_conntrack 可以实时追踪本机的 ICMP/TCP/UDP 流并保存在内存中。

根据数据包在连接中的角色,将数据包分为四种状态:

  • NEW: 连接的第一个包比如TCP的SYN包
  • ESTABLISHED: 只要连接被回复那么连接的状态就是 ESTABLISHED, 比如TCP中第一个回答 ACK/SYN 包
  • RELATED: 当包和某个 ESTABLISHED 状态有关系时即处于 RELATED 状态。 比如 FTP-Data 会被标记为与 FTP-control 有关。
  • INVALID: 无法识别包所属的连接或没有任何状态,通常会丢弃这些包

连接追踪允许我们根据包的连接状态进行过滤。比如我们只允许本地 80 端口的 HTTP 服务器进行响应而不允许通过 80 端口主动向外请求,那么在本地 80 端口的出方向上只允许 ESTABLISHED 状态的包不允许 NEW 状态数据包即可。(通常情况下 HTTP 服务器进程是可以主动向外请求的,但是本地地址不会是 80 端口)

入站数据流和转发数据流是在 PREROUTING 链中进行连接追踪的(即标记所属连接和状态), 出站数据流在 OUTPUT 链中进行状态追踪。使用 RAW 表可以配置数据流绕过状态追踪。

配置规则

iptables -h 可以查看 iptables 自带的帮助手册。

我们将 iptables 命令分解为几部分:

iptables -t <table> <cmd> <pattern> <action>

-t <table>--table <table> 选项用来指定要查看或修改的表(raw, mangle, nat, filter)。

常用的 iptables 命令选项(上文中的<cmd>部分)包括:

  • -L <chain> / --list <chain>: 列出某条规则链中所有规则, 不指定 chain 参数则列出指定表中所有链上的规则。iptables 会按照列出的顺序依次尝试匹配规则并执行匹配的动作。规则可用链上的序号来描述,第一条规则的序号为1(不是编程语言常见的0)。

    • -L -V / -L --verbose 会显示更详细的内容
  • -A <chain> / --append <chain>: 在规则链的末尾添加规则, 规则的内容由后面的匹配选项<pattern>和动作<action>两部分来描述
  • -I <chain> <index> / --insert <chain> <index>: 在规则链的指定位置插入规则。-i INPUT 2会在INPUT链第2个位置插入一条规则,原第2条及以后的规则均后移一位
  • - R <chain> <index> / / --replace <chain> <index>: 替换规则链指定位置上的规则
  • -D <chain> / --delete <chain>: 删除链上某条规则,可以使用序号指定某条规则或者使用匹配和动作完整描述规则进行删除
  • -F <chain> / --flush <chain>: 删除链上的全部规则
  • -P <chain> <action> / --policy <chain> <action>: 修改某条链的默认策略, 示例iptables -P filter ACCEPT

iptables 的规则(<pattern>)包含匹配条件和动作两部分。可以根据网络接口、地址、协议等进行匹配:

  • -i / --in-interface: 进入的网络接口,如以太网eth, 本地回环lo。
  • -o / --out-interface: 输出的网络接口
  • -s / --source: 输入IP地址, 格式为 address[/mask], 如192.168.1.1, 192.168.1.0/24
  • -d / --destination: 目标IP地址
  • -p/ ---proto: 协议类型, 包括TCP/UCP/ICMP等
  • --sport: 源端口号
  • --dport: 目标端口号
  • –-state: 连接跟踪状态, 需要-m state启动连接跟踪模块。示例: --state NEW,ESTABLISHED

ifconfig 命令可以查看本机可用的网络接口

iptables 常用规则的动作(<action>)包括:

  • ACCEPT: 允许数据包通过,进入下一条规则
  • REJECT: 拦截数据包并发送回执数据包通知发送方,可用的回执有: ICMP port-unreachable, ICMP echo-reply, tcp-reset

    示例: iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with tcp-reset 拒绝22端口的tcp连接
  • DROP: 丢弃数据包不返回回执,不继续执行过滤
  • SNAT: 源地址转换(Source Network Address Translation), 将包的源地址改写为指定地址。完成此动作后将直接跳往下一条规则链(如POSTROUTING)

    示例: iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.1-192.168.1.100:2000-3000

    连接跟踪功能会使连接后续的应答数据包送达发送者
  • MASQUERADE: 将数据包的源地址改写为防火墙的地址但可以指定端口号, 与SNAT相比更适合防火墙工作在 DHCP 等动态地址网络环境中的情况。完成此动作后将直接跳往下一条规则链(如POSTROUTING)

    示例: iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE --to-ports 2000-3000
  • DNAT: 目的地址转换, 将包目的地址改写到指定地址,完成此动作后将直接跳往下一条规则链。此功能可以为其它服务进行反向代理

    示例: iptables -t nat -A PREROUTING -s 192.168.1.10 --sport 80 -j DNAT --to-destination 192.168.1.11:80
  • REDIRECT: 重定向到另一个端口,可以为本地服务提供反向代理

    示例: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 将对本地80端口的数据包重定向到8080
  • MIRROR: 回声, 将源地址与目的地址对换位置后发送给原发送者

保存规则

iptables 命令修改后规则只存在于内存中, 使用service iptables save保存规则到配置文件。

默认配置文件地址一般为/etc/sysconfig/iptables

修改/etc/sysconfig/iptables-config中的配置项:

IPTABLES_SAVE_ON_STOP=yes在 iptables 服务停止时存储规则。

iptables-save

iptables -L 只能逐表查看规则,iptables-save 命令将 netfilter 内核模块中的规则导出到标准输出。

我们可以使用 iptables-save 查看所有规则, 或将其备份到文件中。

iptables-save 命令执行读取操作,不会更改 iptables 配置请放心使用。

iptables-save -t <table> 仅导出指定表的内容。

iptables-save -c 将会导出字节计数器和包计数器的值。

示例

查看规则:

  • iptables -L 列出默认表 filter 所有链上的规则。
  • iptables -t nat -L 列出 nat 表中所有链上的规则
  • iptables -t nat -L PREROUTING 列出 nat 表中 PREROUTING 链上的规则

拦截特定流量:

  • iptables -t filter -A INPUT -s 11.11.11.11 -j DROP 拦截来自特定 IP 地址(11.11.11.11)对本地服务全部流量
  • iptables -t filter -D INPUT -s 11.11.11.11 -j DROP 删除上一条拦截规则
  • iptables -t filter -A INPUT -p tcp -sport 445 -j DROP 封锁特定端口(TCP 445)
  • iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j REJECT ---reject-with icmp-host-prohibited 禁止 ICMP (ping)
  • iptables -t filter -A OUTPUT -p tcp --dport 80 -m state --state NEW -j DROP 禁止从80端口发起新的TCP连接但允许80端口响应TCP连接

作为网关提供NAT服务:

  • iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.1 将来自192.168.2.0/24子网数据包源地址改写为192.168.1.1
  • iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE 将来自192.168.2.0/24子网数据包源地址改写为防火墙地址
  • iptables -t nat -A PREROUTING -d 192.168.1.1/24 --dport 80 -j DNAT --to-destination 192.168.1.11:80 将对192.168.1.1:80的数据包发送到192.168.1.11:80
  • iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080将对本地80端口的数据包重定向到8080

iptables 指南的更多相关文章

  1. Iptables 指南 1.1.19

    Iptables 指南 1.1.19 Oskar Andreasson oan@frozentux.net Copyright © 2001-2003 by Oskar Andreasson 本文在符 ...

  2. Iptables指南教程收集

    iptables对于任何Linux基本都适用,虽然在最新版的CentOS 7和Ubuntu上已经有代替的工具来简化iptables,但是最终还是会把规则写入iptables中. 读教程前先阅读ipta ...

  3. iptables指南

    在了解iptables之前我们先了解一下 防火墙 的概念防火墙是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网,防火墙也是一种位于内部网络与外部网络之间的网络安全系统 ...

  4. iptables rule

    和H3C中的acl很像,或者就是一会事,这就是不知道底层的缺陷,形式一变,所有的积累都浮云了 参考准确的说copy from http://www.ibm.com/developerworks/cn/ ...

  5. linux之iptables总结

    netfilter/iptables概述:     netfilter/iptables是Linux内核防火墙架构,由netfilter实现功能,由iptables提供接口.     iptables ...

  6. iptables及其在路由器上的应用 (待完善)

    1. iptables基本定义 Table (表名) Explanation (注释) nat nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT ...

  7. Linux iptables 备忘

    iptables主要通过存储在linux内核中的一个个表来控制IP包的.可以想象成excel表格.你可以自定义所需的iptables表.不过已经内置了三张队列表. filter 这是默认的表,包含了内 ...

  8. iptables关键学习总结

    iptables技术推荐参考这位仁兄的博客:http://www.zsythink.net/archives/category/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3 ...

  9. centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课

    centos  Linux系统日常管理2  tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...

随机推荐

  1. The SQL Server instance returned an invalid or unsupported protocol version during login negotiatio

    在使用.net core 连接sqlserver的时候遇到了这个问题 从字面意思理解大致是个什么版本不支持, 谷歌一下吧,ok,看到这个2000我就知道什么问题了 我的数据库还是2000的,总算把20 ...

  2. R语言S3类的理解与构建

    R语言类 R语言的类有S3类和S4类,S3类用的比较广,创建简单粗糙但是灵活,而S4类比较精细,具有跟C++一样严格的结构.这里我们主要讲S3类. S3类的结构 S3类内部是一个list,append ...

  3. JAVA---MYSQL 基本知识点 第二部分

    增删改查 (CRUD):   数据库  , 表  , 记录  ;   约束 ; 主键约束 :primary key  如果是int类型 可以使用 自动增长型  auto_increment; 唯一约束 ...

  4. Linux下如何查看定位当前正在运行的Nginx的配置文件

    1. 查看nginx的PID,以常用的80端口为例: [root@xiaoyuer scripts]# netstat -lntup|grep 80 tcp 0 0 0.0.0.0:80 0.0.0. ...

  5. unittest中常用的几个断言

    a.相等 (a==b)内容一样,类型一致 from init import * import unittest class Baidu_Title(Info): def test_baidu_titl ...

  6. 初识CUDA

    如果问题规模较小,逻辑控制较为复杂,并行性很小优先使用CPU处理该问题,如果包含较大规模的数据处理,则考虑使用GPU进行处理. CPU上线程是重量级实体,可以开启1~32个线程,且上下文切换较为缓慢, ...

  7. 使用abcpdf分页设置的问题

    如果需要在分页时不对模块进行截断,请为相应模块添加打印样式“page-break-inside: avoid” 如果需要在指定位置进行强制分页,请添加:“<div style="pag ...

  8. victory-native的使用

    Victory用于构建交互数据可视化的可组合React组件的生态系统 想写又不想写,真尴尬...

  9. 轻量级C#网络通信组件StriveEngine —— C/S通信开源demo(附源码)

    前段时间,有几个研究ESFramework网络通讯框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好 ...

  10. 感恩节活动中奖名单 i春秋喊你领礼物啦!

    上周我们组织的感恩节活动,得到了小伙伴们积极踊跃的回复,看到你们这么真诚的留言,我们也是满满的感动,在众多留言中,我们选出了八位幸运用户,让我们一起恭喜获奖的小伙伴们吧. 恭喜以上8位幸运的小伙伴,我 ...