Natter 提供多种途径,将 Natter 端口流量转发至目标端口。
下表列出了不同转发方法之间的差异。
总的来说:
- iptables 是最推荐的转发方法。
- 如果您不是 Linux 用户,您可以选择 socat, gost 或者 socket 方法。
- socket 方法,是 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
- 使用此方法时,Natter 应当具有 root 权限,例如:
sudo python natter.py -m iptables
; - 此方法可保留源 IP 地址;
- 此方法的目标 IP 具有限制,应当为 本机 或其 下级主机 的 IP 地址。
注:
下级主机,指网关为 Natter 所在 IP 的主机。
例如:Natter 运行于路由器,其 LAN 口的机器均为下级;或者 Natter 运行于服务器,这台服务器上的虚拟机均为下级。 - 使用此方法时,Natter 应当具有 root 权限,例如:
-
-m iptables-snat
- 使用此方法时,Natter 应当具有 root 权限,例如:
sudo python natter.py -m iptables-snat
; - 此方法不保留源 IP 地址;
- 使用此方法时,Natter 应当具有 root 权限,例如:
-
-m sudo-iptables
- 使用此方法时,Natter 所在用户对于
iptables
具有sudo
免密权限,这样 Natter 可不以 root 方式运行。 - 除此之外,其他与
-m iptables
相同。
- 使用此方法时,Natter 所在用户对于
-
-m sudo-iptables-snat
- 使用此方法时,Natter 所在用户对于
iptables
具有sudo
免密权限,这样 Natter 可不以 root 方式运行。 - 除此之外,其他与
-m iptables-snat
相同。
- 使用此方法时,Natter 所在用户对于
使用 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
使用多进程的方式维护连接,连接数不宜过多;- 此转发方法不保留源 IP 地址。
gost 是一个开源的,由 Go 语言实现的安全隧道。
使用 gost 转发,命令行为:
-m gost -t <目标 IP> -p <目标端口>
gost
程序所在目录应当在PATH
环境变量内,以便 Natter 调用;- 此转发方法不保留源 IP 地址。
socket 转发,是 Natter 基于 Python 内置 socket 库的一个简单的端口转发实现。
使用 socket 转发,命令行为:
-m socket -t <目标 IP> -p <目标端口>
- 此转发方法使用多线程的方式维护连接,连接数不宜过多;
- 此转发方法不保留源 IP 地址。