iptables
iptables是运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的处理和转发。在大部分Linux发行版中,可以通过 手册页 (页面存档备份,存于互联网档案馆) 或 man iptables
获取用户手册。通常iptables需要内核模块支持才能运行,此处相应的内核模块通常是Xtables。因此,iptables操作需要超级用户权限,其可执行文件通常位于 /sbin/iptables
或 /usr/sbin/iptables
。同时,需要说明的是,以上命令通常只用于处理 IPv4 数据包;而对于 IPv6 数据包,则使用类似的 ip6tables 命令。[1]
原作者 | 罗斯迪·鲁塞尔(Rusty Russell) |
---|---|
开发者 | Netfilter核心团队 |
首次发布 | 1998年 |
当前版本 | 1.8.8(2022年5月13日 | )
源代码库 | https://git.netfilter.org/iptables/ |
编程语言 | C |
操作系统 | Linux |
类型 | 数据包过滤 |
许可协议 | GNU通用公共许可证 |
网站 | www |
目前,iptables 支持内核2.4以上版本,旧版内核环境下则使用ipchains(于2.2版内核)或 ipwadm(于2.0版内核)完成类似的功能。2014年1月19日起发行的Linux内核3.13版则使用nftables取而代之,但仍然提供 iptables 命令做为兼容接口。[2]
概要
编辑iptables、ip6tables等都使用Xtables框架。存在“表(tables)”、“链(chain)”和“规则(rules)”三个层面。
每个“表”指的是不同类型的数据包处理流程,如filter表
表示进行数据包过滤,而nat表
针对连接进行地址转换操作。每个表中又可以存在多个“链”,系统按照预订的规则将数据包通过某个内置链,例如将从本机发出的数据通过OUTPUT链
。在“链”中可以存在若干“规则”,这些规则会被逐一进行匹配,如果匹配,可以执行相应的动作,如修改数据包,或者跳转。跳转可以直接接受该数据包或拒绝该数据包,也可以跳转到其他链继续进行匹配,或者从当前链返回调用者链。当链中所有规则都执行完仍然没有跳转时,将根据该链的默认策略(“policy”)执行对应动作;如果也没有默认动作,则是返回调用者链。[3]
filter表
编辑filter表是默认的表,如果不指明表则使用此表。其通常用于过滤数据包。其中的内置链包括:
- INPUT,输入链。发往本机的数据包通过此链。
- OUTPUT,输出链。从本机发出的数据包通过此链。
- FORWARD,转发链。本机转发的数据包通过此链。
nat表
编辑nat表如其名,用于地址转换操作。其中的内置链包括:
- PREROUTING,路由前链,在处理路由规则前通过此链,通常用于目的地址转换(DNAT)。
- POSTROUTING,路由后链,完成路由规则后通过此链,通常用于源地址转换(SNAT)。
- OUTPUT,输出链,类似PREROUTING,但是处理本机发出的数据包。
mangle表
编辑mangle表用于处理数据包。其和nat表的主要区别在于,nat表侧重连接而mangle表侧重每一个数据包。[4]其中内置链列表如下。
- PREROUTING
- OUTPUT
- FORWARD
- INPUT
- POSTROUTING
raw表
编辑raw表用于处理异常,有如下两个内置链:
- PREROUTING
- OUTPUT
命令示例
编辑防火墙示例
编辑一个典型的工作站的防火墙配置实例。超级用户(root)可以用" iptables -L
"指令显示防火墙上的配置。完整的配置可以添加-v
或-vv
参数来显示更详细信息,或者使用 iptables-save -c
导出生成当前表的命令。由于没有指明“表”,因此默认使用filter表
。
# iptables -L Chain INPUT(policy DROP) target prot opt source destination ACCEPT all—localhost.localdomain localhost.localdomain ACCEPT all—anywhere anywhere state RELATED,ESTABLISHED REJECT all—anywhere anywhere Chain FORWARD(policy DROP) target prot opt source destination Chain OUTPUT(policy ACCEPT) target prot opt source destination
以上配置允许本机连接所有外部的系统,拒绝(REJECT)或丢弃(DROP)任何发往本机的数据包,但是有以下例外(和INPUT链
逐一对应):
此时,来自外部的ping将没有回应:
$ ping -c 1 10.0.0.1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. --- 10.0.0.1 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms
外部尝试连接本机的HTTP端口(即TCP 80端口)将被拒绝连接:
$ telnet 10.0.0.1 80 Trying 10.0.0.1... telnet: connect to address 10.0.0.1: Connection refused
但本机访问外部(OUTPUT)均正常,因为其链为空且默认策略为接受(ACCEPT);且本机不转发(FORWARD)数据包,因为其默认策略为丢弃(DROP)。需要额外注意的是,这里仅展示了IPv4的情况,若同时使用IPv6则需要另行配置ip6tables。
端口重定向示例
编辑iptables的重要功能之一是用于端口和/或地址的转换。如下示例展示了将默认HTTP端口的数据包由80转向8080端口。这样,HTTP的daemon可以允许由一般用户权限启动,而不需要对一般用户无法将端口号绑在1024端口以下的限制的问题多加考虑。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
注意:如果你在你的电脑上面运行了这个指令,它只会对连到你的机器上的外部的IP发生效果。从本地端发起的连线不会遵循nat表上PREROUTING链的设置。如果你想让本地端也遵循规则,你可以另外键入下面的指令:
iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080
这条规则会将lo接口上的数据包输出由80端口转向到8080端口上面。
典型设置如办公室用小型局域网,由一台Linux主机作为路由器共享地址接入Internet。
假设局域网接口为eth0,地址使用192.168.0.0/24;而Internet接口为eth1,使用的地址为198.51.100.3。
在局域网用户访问Internet时,源地址需要被转换为198.51.100.3,则使用规则:
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to 198.51.100.3
若需要在局域网192.168.0.2上开启HTTP服务,则可以设置相应的DNAT服务,将访问外部TCP 80端口的数据包重定向:
iptables -t nat -I PREROUTING -p tcp -d 198.51.100.3 --dport 80 -j DNAT --to 192.168.0.2
需要注意的是,转发操作需要在filter表
中FORWARD链
中允许,并且打开系统的转发功能。[6]
其他控制界面
编辑前端控制接口及命令
编辑有很多第三方软件可以帮助设定iptables规则。前端接口像是Ncurses或图型接口可以让用户用点击的方式产生许多简单的规则。命令稿通常是引用Unix shell产生出来的(不过当然也有可能会使用其它种类型的命令稿),它们有的会用一些预先定义好的规则或简单的范本来调用iptables或 iptables-restore
执行。一些Linux发行版公司会在它们的发行版里面包含这些方式,当然像这样的方式能产生的变化就相当有限,不过也因为产生规则的方式很简单,所以甚至可以利用php网页撰写的方式来产生这些规则。
此类前端设备如生成器(generator)或脚本(script)往往会被其模板限制,模板仅仅能使用用户定义规则并替换指定的部分,如只能替换端口或IP地址,同时,生成的规则往往难以达到最佳状态,需要进行进一步优化,如此会增加开发和运维的成本。如果用户想要了解iptables并且优化自己的规则,则需要自己创建规则。
前端的设置
编辑- Firewall Builder —图形前端配合规则/字集产生器、及自动规则集(automated ruleset)加载。
- Shorewall,以本文为基础的规则产生器。
其它的工具
编辑- Fwsnort - iptables侵入测试以字符串比对法及是诺特规则(Snort Rule)来进行FWSnort (页面存档备份,存于互联网档案馆),Translates a Snort IDS ruleset into an IPTables ruleset.
Iptables/Netfilter图表
编辑为了较好地了解一个数据包穿越内核层的X表(Xtables)之表/链(table/chain),你可以参考下列图表的使用:
引用
编辑- ipchains为iptables的前一代
- Netlink为Netfilter使用之API
- NuFW延伸到Netfilter之认证防火墙
- nftables为iptables的后继者
- firewalld
其它防火墙的解决方案
编辑外部链接
编辑- The netfilter/iptables project Web page(页面存档备份,存于互联网档案馆) (英文)
- Freshmeat project page for the iptables package (页面存档备份,存于互联网档案馆) (英文)
- The netfilter/iptables documentation page (页面存档备份,存于互联网档案馆) (outdated) (英文)
参考文献
编辑- ^ Carla Schroder. How to Write iptables Rules for IPv6. www.linux.com. 2017-08-03 [2022-01-22]. (原始内容存档于2019-06-12).
- ^ The netfilter.org "nftables" project. netfilter.org. [2022-01-22]. (原始内容存档于2020-11-12).
- ^ iptables详细教程:基础、架构、清空规则、追加规则、应用实例. lesca.me. 2012-03-23 [2022-01-22]. (原始内容存档于2020-11-27).
- ^ Linux 2.4 NAT HOWTO: Saying How To Mangle The Packets. netfilter.org. [2022-01-22]. (原始内容存档于2021-01-10).
- ^ Major Hayden. Active FTP connections through iptables. major.io. 2007-07-01 [2022-01-22]. (原始内容存档于2018-12-11).
- ^ 7.4. FORWARD and NAT Rules Red Hat Enterprise Linux 4. access.redhat.com. [2022-01-22]. (原始内容存档于2019-07-19).