我正在尝试创建一个静态 NAT,但是当我运行命令时ip route add nat 172.31.19.02 via 10.0.2.2
,它给了我错误Error: Invalid scope.
,并且在指定全局范围时它给出了同样的错误。我正在尝试使用 iproute2页面复制无状态 NAT 上描述的内容。
我的网络设置由同一子网上的两个物理接口(ens5、ens6)和一个用于我的 tinc vpn (vpn) 的虚拟接口组成。可以从 tinc 接口访问地址 10.0.2.2。目标是将流量从 转发172.31.19.02
到10.0.2.2
。
据我从文档的IP 地址页面了解,global
应该是“在任何地方都有效”。这是不正确的吗?
的相关部分ip a
:
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether [...]
inet 172.31.19.01/20 brd 172.31.31.255 scope global ens5
valid_lft forever preferred_lft forever
[...]
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether [...]
inet 172.31.19.02/20 brd 172.31.31.255 scope global ens6
valid_lft forever preferred_lft forever
[...]
4: vpn: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 10.0.2.1/24 scope global homeforward
valid_lft forever preferred_lft forever
[...]
我的路由表:
$ ip r
default via 172.31.16.1 dev ens5 proto static
10.0.2.0/24 dev homeforward proto kernel scope link src 10.0.2.1
172.31.16.0/20 dev ens6 proto kernel scope link src 172.31.19.02
172.31.16.0/20 dev ens5 proto kernel scope link src 172.31.19.01
$ ip r ls table 1000
default via 172.31.16.1 dev ens5 proto static
172.31.19.01 dev ens5 proto static scope link
$ ip r ls table 1001
default via 172.31.16.1 dev ens6 proto static
172.31.19.02 dev ens6 proto static scope link
Linux 的路由无状态 NAT 又名“IP NAT 哑”不再起作用(不再),原因很简单:手册页告诉:
所以像这样的例子:
不会再工作了。
此功能已在内核2.1.15 (1996) 中添加并在内核 2.6.9 (2004) 中删除(但之前可能有几个内核):
在内核 2.6.24 中添加的备用无状态 NAT 中给出了解释:
tc nat
tc
这是我制作的一个基本DNAT 示例。执行无状态 NAT 的接口是
ens5
(我不会在同一个 LAN 中将您的设置与两个 NIC 一起使用:如果没有其他设置,则会出现与ARP 通量和反向路径过滤相关的其他问题。看来您已经意识到这一点,因为你有额外的路由表,但让我们保持这个例子简单),它的本地地址是 172.31.19.1 和 172.31.19.2。任何到 172.31.19.2 的入口流量都被 DNATed 到目标 10.0.2.2,任何来自 10.0.2.2 的出口流量都被 SNAT 到源 172.31.19.2。正如通常所做的那样,使用prio qdisc是因为它的简单性,而不是它的优先特性。与 netfilter 的有状态连接跟踪可能存在无法预料的交互。
表格
也可以使用 nftables的 wiki中描述的 nftables 来做同样的事情。
同样,可能与 netfilter 的 conntrack 有交互。
notrack
如果在当前命名空间中没有加载或至少激活 netfilter NAT 内核模块,我删除了任何可能使它仍然工作的东西(同时notrack
将所有回复数据包视为NEW
流而不是ESTABLISHED
)。随意尝试。添加路由时,内核会检查它是否可以通过较低范围访问新范围,因为路由网关必须在同一 L2(数据链路层)连接上可直接访问。
这个答案(https://superuser.com/a/1389304)很好地快速澄清了这个范围概念以及为什么/何时需要设置它:
编辑:
但这还不够:到目前为止,我一直试图让它在测试环境中工作,但没有成功。
Error: Invalid scope.
也在不断发生。