iptables 是运行在用户空间的应用软件, 通过控制 Linux 内核的 netfilter 模块,, 在内核模块 Xtables 的支持下, 来管理 IPv4 网络数据包的处理和转发. 对于 IPv6 数据包, 应使用 ip6tales. 当前, iptables 支持内核 2.4 以上版本, Linux 3.13 开始使用 nftables 取而代之, 但仍然提供 iptables 命令做为兼容接口.
iptables,ip6tables 等都使用 Xtables 框架. 存在 "表(tables)","链(chain)" 和 "规则(rules)" 三个层面.
每个 "表" 指的是不同类型的数据包处理流程, 每个表中又可以存在多个 "链", 系统按照预订的规则将数据包通过某个内建链. 在 "链" 中可以存在若干 "规则", 这些规则会被逐一进行匹配, 如果匹配, 可以执行相应的动作, 如修改数据包, 或者跳转. 跳转可以直接接受该数据包或拒绝该数据包, 也可以跳转到其他链继续进行匹配, 或者从当前链返回调用者链. 当链中所有规则都执行完仍然没有跳转时, 将根据该链的默认策略 ("policy") 执行对应动作; 如果也没有默认动作, 则是返回调用者链. filter 表是默认的表, 如果不指明表则使用此表, 它通常用于过滤数据包, 其内建链包括:
INPUT, 输入链, 发往本机的数据包通过此链.
OUTPUT, 输出链, 从本机发出的数据包通过此链.
FORWARD,FORWARD, 转发链, 本机转发的数据包通过此链.
nat 表用于地址转换操作, 其内建链包括:
PREROUTING, 路由前链, 在处理路由规则前通过此链, 通常用于目的地址转换(DNAT).
POSTROUTING, 路由后链, 完成路由规则后通过此链, 通常用于源地址转换(SNAT).
OUTPUT, 输出链, 类似 PREROUTING, 但是处理本机发出的数据包.
mangle 表用于处理数据包. 其和 nat 表的主要区别在于, nat 表侧重连接而 mangle 表侧重每一个数据包. 其中内建链包括: PREROUTING,OUTPUT,FORWARD,INPUT,POSTROUTING.raw 表用于处理异常, 有如下两个内建链: PREROUTING,OUTPUT.
超级用户 (root) 可以用 "iptables -L" 指令显示防火墙上的配置. 完整的配置可以添加 - v 或 - vv 参数来显示更详细信息, 或者使用 iptables-save -c 导出生成当前表的命令. iptables 的重要功能之一是用于端口和 / 或地址的转换. 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 链中允许, 并且打开系统的转发功能.
参考文献:
- https://www.linux.com/learn/intro-to-linux/2017/8/iptables-rules-ipv6
- https://netfilter.org/projects/nftables/
- https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html
- https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Security_Guide/s1-firewall-ipt-fwd.html
来源: http://www.bubuko.com/infodetail-3306801.html