Skip to content

[Feature Request] iptables / nftables forwarding #51

@MikeWang000000

Description

@MikeWang000000

Natter 在 v2.0 版本中新增了 iptables / nftables 转发功能,通过 -m 选项可指定转发的方法。

可以考虑在 NATMap 添加同样的功能。

考虑设计此功能的原因是:

  • 省去手动设置防火墙端口转发的步骤。虽然不同发行版的防火墙各不相同,但都以 iptables / nftables 作为后端。由 NATMap 设置可一步到位;
  • BT 类程序打洞需要保持内外部端口号一致,需要 NATMap 动态调整端口转发规则;
  • 虽然通过通知脚本能达到类似目的,但是在 NATMap 退出时会有规则残留。

对于 NATMap :
- 可以考虑使用 libiptc (iptables (legacy))、libnftl (nftables) 提供的 API,这样比直接调用命令行再解析文本更科学;
- 可以考虑使用宏隔离,不编译不支持的平台,如 FreeBSD / macOS

放弃了使用 libiptc 的想法,首先是 NATMap 使用静态编译,加入依赖会使得体积膨胀;其次是 libiptc 也没有提供静态链接的方法;最后是根据 netfilter FAQ §4.5,官方不推荐。

实现方式与 Natter 相同,直接调用 iptables 二进制。


Natter 参考:

https://github.com/MikeWang000000/Natter/blob/6e1c66db06e1bb746e55288da1b9fb012bf701b5/natter.py#L479-L637

一些经验:

几乎所有 Linux 发行版包括 OpenWRT、CentOS、Debian、Alpine Linux 还有一些 NAS 专用系统例如威联通的 QTS、QuTS 都可以顺利自动设置转发。这些都通过了测试。

部分系统会存在一些问题,例如群晖 DSM,还有跑在光猫里的嵌入式定制Linux。它们的 iptables 内核模块是修剪过的,不认识规则的 --comment 备注。但是去除后也能正常转发。

所以考虑仅设置最简单的 NAT 转发规则即可。因为经过裁剪的系统也会保留最基本的 NAT 功能,系统本身会用到。


这个坑有点大,先提出来看看可行性。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions