iptables指南(代码片段)

finley finley     2023-03-09     254

关键词:

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指南(代码片段)

iptables是Linux内核集成的防火墙系统,几乎所有Linux发行版都会内置iptables。iptables对进出的IP数据报进行处理和过滤,过滤规则(rule)存储在4个表(table)中,表中的规则又组成了数条完整的规则链(chain)。iptables可以追踪数据包所属的连接(... 查看详情

openldap安装指南(代码片段)

...pserver#安装openldapsetenforce0&&systemctlstopfirewalld&&iptables-Fyuminstall-yepel-releaseyuminstall-yopenldapopenldap-clientsopenldap-serverssystemctlstartslapdsystemctlenableslapdsystemctlstatusslapd#ldapServerroot密码adminpd=\'Huawei@123\'DomainName="huawei"DomainSuffix="com"... 查看详情

centos7个性化配置指南(代码片段)

...化配置指南-WindSpirit0x00前言该教程主要安装了如下软件包iptablesMySQLPHPPHP相关模块Nginx主要配置实现了以下功能修改软件源修改PS1,更改配色SSH每隔30秒发送一个心跳包修改iptables规则,开放端口修改MySQL密码修改PHP-FPM的工作模式... 查看详情

iptables端口转发(代码片段)

清除相关规则/sbin/iptables-F/sbin/iptables-F-tnat/sbin/iptables-X/sbin/iptables-Ziptables-F-tmangleiptables-tmangle-Xiptables-tnat-X预设规则/sbin/iptables-PINPUTACCEPT/sbin/iptables-PFORWARDDROP/sbin/iptables-P 查看详情

iptables--iptables(代码片段)

A网:https://12.102.246.15:8080B网:https://12.100.246.15:8080 A网DNAT转换:iptables-tnat-APREROUTING-d12.102.246.15-ptcp-mtcp--dport8080-jDNAT--to-destination10.12.3.3:8080B网DNAT转换:iptables-tnat-APREROU 查看详情

iptables包过滤入门指南

1.IntroductionWelcome,gentlereader.ItisassumedyouknowwhatanIPaddress,anetworkaddress,anetmask,routingandDNSare.Ifnot,IrecommendthatyoureadtheNetworkConceptsHOWTO.ThisHOWTOflipsbetweenagentleintroduction(whichwillleaveyoufeelingwarmandfuzzynow,butunprotectedintheRealWorld)andrawfull-disclosure(whichw... 查看详情

iptables笔记(代码片段)

查看iptables表iptables-tfilter-Liptables-tnat-Liptables-tmangle-L介绍iptables命令iptables-ttable命令chainrules-jtargettable可以是filter、nat、mangle,默认是filter-p或--policy定义默认策略-A或--addend在规则列表的最后增加一条规则-I或--insert在指定 查看详情

iptables规则(代码片段)

iptables命令:~]#iptables-L-n查看规则centOS7~]#systemctldisablefirewalld.service~]#systemctlstopfirewalld.service永久清除规则CentOS6~]#serviceiptablestop~]#chkconfigiptablesoff命令选项:-F:清除规则,只对当前有效。 查看详情

iptables操作(代码片段)

iptables--list查看列表iptables删除规则iptables-nL--line-numberChainINPUT(policyACCEPT)numtargetprotoptsourcedestination1ACCEPTall--0.0.0.0/00.0.0.0/0stateRELATED,ESTABLISHED2ACCEPTicmp--0.0.0.0/00.0.0.0/03ACC 查看详情

iptables(代码片段)

iptables基本配置实例拒绝特定IP到本机的所有访问#iptables-AINPUT-s192.168.7.203-jREJECT#iptables-AINPUT-s192.168.7.0/24-jREJECT#iptables-IINPUT-s192.168.7.201,192.168.7.203-jACCEPT>注意,使用-I的话,添加的第2个IP会使用第1个规则编号。拒绝所有IP访 查看详情

iptables详解(代码片段)

 一. iptables概念详解参考:  iptables概念   https://www.cnblogs.com/metoy/p/4320813.html   https://blog.csdn.net/fuzhongfaya/article/details/820221811.组成  linux的防火墙由netfilter和iptables组成 查看详情

iptables设置用法(代码片段)

1.安装iptables防火墙怎么知道系统是否安装了iptables?执行一下iptables-V,如果现实版本信息那说明已经安装了。反之则需要安装,执行命令:yuminstalliptables在linux中设置防火墙,以CentOS为例,打开iptables的配置文件:vim/etc/sysconfig/i... 查看详情

iptables杂记(代码片段)

iptables扩展使用扩展参数放通80,和22端口[[email protected]~]#iptables-IINPUT-s10.201.106.0/24-d10.201.106.130-ptcp-mmultiport--dports22,80-jACCEPT[[email protected]~]#iptables-IOUTPUT-s10.201.106.130-d10. 查看详情

shcmd:iptables的(代码片段)

查看详情

iptables系列教程|iptables语法规则(代码片段)

iptables命令基本语法iptables[-ttable]command[链名][条件匹配][-j目标动作]以下是对iptables命令的拆分讲解:-ttable用来指明使用的表,有三种选项:filter,nat,mangle。若未指定,则默认使用filter表。command参数指定iptables对我们提交的规则... 查看详情

iptables系列教程|iptables入门篇(代码片段)

前言在早期的Linux系统中,默认使用的是iptables配置防火墙。尽管新型的firewalld防火墙已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用iptables。考虑到iptables在当前生产环境中还具有顽强的生命力... 查看详情

iptables简介(代码片段)

iptables防火墙工作原理简介:iptables防火墙工作在网络层,针对TCP/IP数据包实施过滤和限制,iptables防火墙基于内核编码实现,具有非常稳定的性能和高效率;   iptables属于“用户态”的防火墙管理体系。   规则表&... 查看详情

iptables教程(代码片段)

iptables是一个配置Linux内核防火墙的命令行工具。初学者刚看到iptables,会感到很复杂,原因是iptables功能实在是太强大了。本文会从基本概念、使用上做介绍,读者看完后再去看iptables命令就能理解其含义了。本文环境:PC:Ubuntu18... 查看详情