iptables

时间关系,仅整理要点

实际生产建议学习 nftables 与 firewalld

参考资料: 鸟哥 Debian Wiki:iptables

iptables 的规则是有顺序的! 数据包会按规则的排列顺序依次判断通过。

iptables 默认分 3 张 table ( 表 ) 而规则作为 chain 存储在对应的表中。

默认的表为:

  • filter 影响进入本机的数据包

  • nat 进行 NAT 时用到的表

  • mangle 与打标记的包有关,本例不讲述

iptables 语法

预设规则

预设规则指:当数据包不满足设定的规则时,则执行的默认操作。

如:设定 INPUT 的默认规则为 DROP

$ iptables -P INPUT DROP

添加规则

仅针对网卡 ( 源与目标 IP 地址 )

  • keychain: 键名

  • interfaces: 网卡名

  • ip/cidr 源 IP 地址 ( 支持使用 IP/CIDR 格式 )

  • ACCEPT/REJECT/DROP 数据包动作:接受/拒绝/丢弃

例:放行来自本机回环地址的所有网络数据包:

针对端口 ( TCP 与 UDP 协议 )

按状态放行数据包:

NAT

一切的一切不要忘了打开 IP Forwarding!

修改 /etc/sysctl.conf

net.ipv4.ip_forward 改为 1 并重启。

结果应为:

iptable NAT 路径

  • 先经过 NAT Table 的 PREROUTING Key

  • 如果包不进入本机,则继续处理

  • 再经过 Filter Table 的 FORWARD Key

  • 最后经过 NAT Table 的 POSTROUTING Key,再发送出去

要将内网流量通过 NAT 转发至 WAN,即将内网的 RFC1918 私有地址转换为公网地址,需要使用 Source NAT

Source NAT 使用 POSTROUTING Key

其中 $INNET 为 NAT 后的内部 IP 地址,$EXTIF 为 NAT 后的出口 IP 地址或网卡名。

将内网的服务映射到 WAN,即做端口映射,需要配置 Destination NAT。

DNAT 使用 PREROUTING Key

例如,将 Web 服务的 80 端口转发到内网的 192.168.100.10 的 80 端口上:

查看防火墙规则使用 iptables -L

清除防火墙规则使用 iptables -F

不要忘记适当时候放行 ICMP 协议数据包!

如果想禁 ping 的话,最好不要禁掉所有 ICMP 数据包,而仅 DROP 掉 ICMP type 8.

例如:

由于 iptables 需要按顺序写入,为减小重复调试的工作量,强烈建议写一个 Shell 脚本,在脚本中修改 iptables 规则。

虽然完全可以插入规则,但是删掉重写比较。。。少记一点点东西。

保存 iptables 配置

方法一

导出配置使用 iptables-save,直接运行即可将配置输出至标准输出

将文件导出并保存后,编辑 /etc/network/if-pre-up.d/iptables

加入以下内容

给这个脚本加上运行权限:

方法二

安装 iptables-persistent,后运行:

这个也可以稍微看下:

(iptables防火墙的应用和SNAT/DNAT策略)[https://zhuanlan.zhihu.com/p/26325389]

最后更新于

这有帮助吗?