Iptables

概要

iptables、ip6tables等都使用Xtables框架。存在“表（tables）”、“链（chain）”和“规则（rules）”三个层面。
每个“表”指的是不同类型的数据包处理流程，如filter表表示进行数据包过滤，而nat表针对连接进行地址转换操作。每个表中又可以存在多个“链”，系统按照预订的规则将数据包通过某个内建链，例如将从本机发出的数据通过OUTPUT链。在“链”中可以存在若干“规则”，这些规则会被逐一进行匹配，如果匹配，可以执行相应的动作，如修改数据包，或者跳转。跳转可以直接接受该数据包或拒绝该数据包，也可以跳转到其他链继续进行匹配，或者从当前链返回调用者链。当链中所有规则都执行完仍然没有跳转时，将根据该链的默认策略（“policy”）执行对应动作；如果也没有默认动作，则是返回调用者链。

端口重定向示例

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链中允许，并且打开系统的转发功能。

前端控制接口及命令

有很多第三方软件可以帮助设定iptables规则。前端接口像是Ncurses或图型接口可以让用户用点击的方式产生许多简单的规则。命令稿通常是引用Unix shell产生出来的（不过当然也有可能会使用其它种类型的命令稿），它们有的会用一些预先定义好的规则或简单的范本来调用iptables或 iptables-restore 执行。一些Linux发行版公司会在它们的发行版里面包含这些方式，当然像这样的方式能产生的变化就相当有限，不过也因为产生规则的方式很简单，所以甚至可以利用php网页撰写的方式来产生这些规则。
此类前端设备如生成器（generator）或脚本（script）往往会被其模板限制，模板仅仅能使用用户定义规则并替换指定的部分，如只能替换端口或IP地址，同时，生成的规则往往难以达到最佳状态，需要进行进一步优化，如此会增加开发和运维的成本。如果用户想要了解iptables并且优化自己的规则，则需要自己创建规则。