AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 559877
Accepted
Tavi
Tavi
Asked: 2020-01-02 19:44:56 +0800 CST2020-01-02 19:44:56 +0800 CST 2020-01-02 19:44:56 +0800 CST

使用“ip”命令创建路由时,全局范围如何无效?

  • 772

我正在尝试创建一个静态 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
networking iproute
  • 2 2 个回答
  • 914 Views

2 个回答

  • Voted
  1. Best Answer
    A.B
    2020-01-15T15:53:04+08:002020-01-15T15:53:04+08:00

    Linux 的路由无状态 NAT 又名“IP NAT 哑”不再起作用(不再),原因很简单:手册页告诉:

    警告:Linux 2.6 不再支持路由 NAT。

    所以像这样的例子:

    [root@masq-gw]# ip route add nat 205.254.211.17 via 192.168.100.17
    [root@masq-gw]# ip rule add nat 205.254.211.17 from 192.168.100.17
    [root@masq-gw]# ip route flush cache
    [root@masq-gw]# ip route show table all | grep ^nat
    nat 205.254.211.17 via 192.168.100.17  table local  scope host
    [root@masq-gw]# ip rule show
    0:      from all lookup local 
    32765:  from 192.168.100.17 lookup main map-to 205.254.211.17 
    32766:  from all lookup main 
    32767:  from all lookup 253
    

    不会再工作了。

    此功能已在内核2.1.15 (1996) 中添加并在内核 2.6.9 (2004) 中删除(但之前可能有几个内核):

    <[email protected]>
      [IPV4]: Kill remnant of ip_nat_dumb
    
      This line in net/ipv4/Makefile was left behind when the rest of the
      dumb NAT option was taken out.
    
      Signed-off-by: Herbert Xu <[email protected]>
      Signed-off-by: David S. Miller <[email protected]>
    

    在内核 2.6.24 中添加的备用无状态 NAT 中给出了解释:tc nat

    以前我们有集成到 IPv4 路由子系统中的无状态 NAT 功能。这是一个很好的解决方案,只要 NAT 在子网到子网的基础上工作,这样 NAT 规则的数量就相对较少。原因是对于 SNAT,基于路由的系统必须通过规则执行线性扫描。

    如果规则的数量很大,那么路由子系统将进行重大改造以使其实用。


    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是因为它的简单性,而不是它的优先特性。

    tc qdisc add dev ens5 ingress
    tc filter add dev ens5 ingress protocol ip matchall \
       action nat ingress 172.31.19.2/32 10.0.2.2/32
    
    tc qdisc add dev ens5 root handle 1: prio
    tc filter add dev ens5 parent 1: protocol ip matchall \
       action nat egress 10.0.2.2/32 172.31.19.2/32
    

    与 netfilter 的有状态连接跟踪可能存在无法预料的交互。


    表格

    也可以使用 nftables的 wiki中描述的 nftables 来做同样的事情。

    nft add table ip natdumb
    
    nft add chain ip natdumb prerouting '{ type filter hook prerouting priority -350; policy accept; }'
    nft add rule ip natdumb prerouting ip daddr 172.31.19.2 ip daddr set 10.0.2.2
    
    nft add chain ip natdumb postrouting '{ type filter hook postrouting priority 350; policy accept; }'
    nft add rule ip natdumb postrouting ip saddr 10.0.2.2 ip saddr set 172.31.19.2
    

    同样,可能与 netfilter 的 conntrack 有交互。notrack如果在当前命名空间中没有加载或至少激活 netfilter NAT 内核模块,我删除了任何可能使它仍然工作的东西(同时notrack将所有回复数据包视为NEW流而不是ESTABLISHED)。随意尝试。

    • 3
  2. Ictus
    2020-01-02T20:57:30+08:002020-01-02T20:57:30+08:00

    添加路由时,内核会检查它是否可以通过较低范围访问新范围,因为路由网关必须在同一 L2(数据链路层)连接上可直接访问。

    这个答案(https://superuser.com/a/1389304)很好地快速澄清了这个范围概念以及为什么/何时需要设置它:

    这些路由是您告诉 Linux 内核您所在的子网的方式。

    添加 IP 地址时,此信息不会存储在隐藏的“我当前的子网”字段中;相反,它总是转换为没有指定网关的“范围链接”路由(也称为“设备路由”或“接口路由”),并且每当内核需要确定某个地址是否可以直接到达时,它只执行路由表检查.

    通常,一旦您配置了 IP 地址,这些路由就会自动添加 - 例如,运行 ip addr add 192.168.1.5/24 会分配 IP 地址 192.168.1.5 并为 192.168.1.0/24 创建子网路由。所以在正常使用中不需要添加这些路由。

    但是当你盲目地“删除所有路由”时,最终也会删除这些自动创建的路由,并且内核的“这个地址是否在我的子网中”检查不再起作用。这就是为什么您最终不得不手动重新添加路线。

    (内核需要在 ip route add 期间执行此检查,因为路由网关(nexthops)必须在同一个 L2 连接上直接可达——它们不能位于另一个网关之后。也就是说,网关必须在您的子网中。

    路由范围是表达这种限制的通用机制:新路由的下一跳需要通过具有较低范围的现有路由到达。换句话说,您必须通过本地主机(链接范围)才能到达远程主机(全局范围)。)

    编辑:

    但这还不够:到目前为止,我一直试图让它在测试环境中工作,但没有成功。Error: Invalid scope.也在不断发生。

    • 0

相关问题

  • 查找与端口关联的线程/脚本?

  • 关于网络挂载文件的问题

  • IP地址可以以255结尾而不是广播IP地址吗?

  • 无法识别arp命令或ip命令哪个MAC地址输出正确

  • 奇怪的路由器与centos 6一起工作[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve