Natter 提供多种途径,将 Natter 端口流量转发至目标端口。
下表列出了不同转发方法之间的差异。
总的来说:
| iptables | nftables | socat | gost | socket | |
|---|---|---|---|---|---|
| 操作系统限制 | 仅 Linux | 仅 Linux | 跨平台 | 跨平台 | 跨平台 |
| 保留源 IP | 可 | 可 | 不可 | 不可 | 不可 |
| 转发效率 | 高 | 高 | 中 | 中 | 中 |
| 转发类型 | 内核 | 内核 | 多进程 | 协程 | 多线程 |
| root 权限 | 需要 | 需要 | 无需 | 无需 | 无需 |
| 第三方依赖 | 是 | 是 | 是 | 是 | 否 |
| 依赖最低版本 | 1.4.1 | 0.9.0 | 1.7.2 | 2.3 | - |
| 依赖最佳版本 | ≥ 1.4.20 | ≥ 1.0.6 | ≥ 1.7.2 | ≥ 2.3 | - |
注:
保留源 IP,转发目标所属的应用程序可以获得来访者的真实 IP 和端口;
不保留源 IP,应用程序获得的 IP 地址则为 Natter 所在的 IP 地址。
iptables 是一个用于控制 Linux 内核 netfilter 模块的命令行工具。
使用 iptables 转发,有以下四种命令行可选:
-m iptables -t <目标 IP> -p <目标端口>
-m iptables-snat -t <目标 IP> -p <目标端口>
-m sudo-iptables -t <目标 IP> -p <目标端口>
-m sudo-iptables-snat -t <目标 IP> -p <目标端口>
-m iptables
sudo python natter.py -m iptables;注:
下级主机,指网关为 Natter 所在 IP 的主机。
例如:Natter 运行于路由器,其 LAN 口的机器均为下级;或者 Natter 运行于服务器,这台服务器上的虚拟机均为下级。
-m iptables-snat
sudo python natter.py -m iptables-snat;-m sudo-iptables
iptables 具有 sudo 免密权限,这样 Natter 可不以 root 方式运行。-m iptables 相同。-m sudo-iptables-snat
iptables 具有 sudo 免密权限,这样 Natter 可不以 root 方式运行。-m iptables-snat 相同。使用 iptables 转发时,Natter 会在 iptables 中 nat 表内创建 NATTER 和 NATTER_SNAT 两个链:
-N NATTER
-N NATTER_SNAT
-A PREROUTING -j NATTER
-A INPUT -j NATTER_SNAT
-A OUTPUT -j NATTER
-A POSTROUTING -j NATTER_SNAT
所有规则均会创建在这两个链内。您可以通过以下命令查看具体规则:
iptables -t nat -S NATTER
iptables -t nat -S NATTER_SNAT
除了强制退出,例如 SIGKILL,Natter 在正常退出时均会清理相关规则。否则需要手动清理,或者重启机器让系统自动重置。
nftables 是 iptables 的最新替代,同样适用于数据包分类等工作。
如果您不确定是否应使用
-m nftables,请使用-m iptables。
使用 nftables 转发,有以下四种命令行可选:
-m nftables -t <目标 IP> -p <目标端口>
-m nftables-snat -t <目标 IP> -p <目标端口>
-m sudo-nftables -t <目标 IP> -p <目标端口>
-m sudo-nftables-snat -t <目标 IP> -p <目标端口>
相关作用请参照上文 iptables 转发部分。
socat 是一个开源的,由 C 语言实现的多功能中继工具。
使用 socat 转发,命令行为:
-m socat -t <目标 IP> -p <目标端口>
socat 程序所在目录应当在 PATH 环境变量内,以便 Natter 调用;socat 使用多进程的方式维护连接,连接数不宜过多;gost 是一个开源的,由 Go 语言实现的安全隧道。
使用 gost 转发,命令行为:
-m gost -t <目标 IP> -p <目标端口>
gost 程序所在目录应当在 PATH 环境变量内,以便 Natter 调用;socket 转发,是 Natter 基于 Python 内置 socket 库的一个简单的端口转发实现。
使用 socket 转发,命令行为:
-m socket -t <目标 IP> -p <目标端口>