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
    • 最新
    • 标签
主页 / server / 问题 / 1055614
Accepted
Nibs Niven
Nibs Niven
Asked: 2021-03-03 00:17:38 +0800 CST2021-03-03 00:17:38 +0800 CST 2021-03-03 00:17:38 +0800 CST

在一个 IP 上使用双 IP Ping 主机,从其他 IP 返回回显

  • 772

我在设置为路由器的主机(i5 cpu、8Gb RAM、SSD 和硬盘)上运行 Fedora 33;它有 5 个 NIC。我已经设法使用 nftables 让双互联网网关和双 LAN 工作得相当好。

一个网关是带 pppoe 的 DSL,另一个是电缆调制解调器。两者都可以连接并且可以看到互联网。两个局域网都可以看到互联网并提供互联网可以看到的服务。IOW、NAT 和转发运行良好。

问题是:我不知道如何设置路由表。问题出在哪个网关具有最低度量标准与 NAT 一起使用并转发到其 LAN,但它关闭了 NAT 并转发到其他网关和 LAN。从 LAN 机器的角度来看,我一次只在一个网关上工作。

root@gata[~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         67.193.x.x      0.0.0.0         UG    100    0        0 coglink
0.0.0.0         206.248.x.x     0.0.0.0         UG    104    0        0 ppp0
10.0.0.0        0.0.0.0         255.0.0.0       U     103    0        0 tekgw
67.193.56.0     0.0.0.0         255.255.248.0   U     100    0        0 coglink
192.168.1.0     0.0.0.0         255.255.255.0   U     102    0        0 coggw
206.248.155.132 0.0.0.0         255.255.255.255 UH    105    0        0 ppp0

我知道可以设置路由,以便 10.0.0.0 上的机器始终使用 ppp0,而 192.168.1.0 上的机器始终使用 coglink,但是关于如何做到这一点的网络搜索一直没有结果。与面向互联网的接口相同。如果有人可以向我指出有关多个接口的 IP 路由的清晰相关教程,我将不胜感激。

router fedora gateway route nftables
  • 1 1 个回答
  • 107 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2021-08-29T18:31:37+08:002021-08-29T18:31:37+08:00

    此答案将使用策略路由,其中​​数据包的命运不仅取决于其目的地,而且(首先)取决于其他因素(此处为源 IP 地址和/或传入接口)。策略路由不适用于 Linux-obsoleteroute命令,而仅适用于使用ip ruleand ip route(以及ip link和ip address)的较新 API。目标是将所有路由的单个视图拆分为多个路由表,其中每个路由表都将提供打算使用的路由的特定视图,就好像其他不感兴趣的部分不存在一样。除此之外,这允许定义同时使用的多个默认路由:每个路由表一个。

    默认情况下只有这个存在,(最后一条规则的默认表为空):

    # ip rule show
    0:  from all lookup local
    32766:  from all lookup main
    32767:  from all lookup default
    

    这里 OP 的情况可以用这种策略路由来表达,当处理一个数据包时:

    • 来自coglink或cogw接口的数据包使用 Cogeco 专用路由表的路由
    • 来自ppp0或tekgw接口的数据包使用 Teksavvy 专用路由表的路由

    虽然可以只添加规则来处理ppp0并保留主路由表句柄coglink,但为了对称起见,我仍然会为两者添加规则。


    完成一些空白点并选择任意值(以提供没有语法错误的命令):

    • coglink的本地地址任意选择为 67.193.56.92/21
    • coglink的网关被任意选择为 67.193.56.1 而不是 67.193.xx
    • Cogeco 的路由表具有任意选择的值 7992
    • ppp0的本地地址任意选择为 206.248.155.133
    • 假设ppp0是第 3 层接口(即使通过以太网,它仍然是点对点的),因此正确路由不需要网关(否则在适当的地方添加via 206.248.155.132)。
    • Teksavvy 的路由表具有任意选择的值 5645

    每个路由表将仅包括要使用的 WAN,而不是两者,但还必须包括到将使用它的网络的路由。如果启用了 SRPF,这些 LAN 路由的复制是强制性的,否则这些 LAN 路由通常可以省略(只要它们在主路由表中)。

    ip route add 67.193.56.0/21 dev coglink table 7992
    ip route add default via 67.193.56.1 dev coglink table 7992
    ip route add 192.168.1.0/24 dev coggw table 7992
    ip rule add iif coglink lookup 7992
    ip rule add iif coggw lookup 7992
    
    ip route add default dev ppp0 table 5645
    ip route add 10.0.0.0/8 dev tekgw table 5645
    ip rule add iif ppp0 lookup 5645
    ip rule add iif tekgw lookup 5645
    

    这不会影响将路由器作为端节点本身的流量,它将继续仅使用主表(它是具有较低度量的默认路由:coglink的),因为:

    • (总是这样)传入路由器自己的 IP 地址的流量在本地路由表中处理,该路由表首先由优先级为 0 的策略规则查找。不再查找其他表。
    • 任何添加的策略规则都不会选择传出流量

    因此,某些极端情况仅适用于 Fedora 路由器(实际上不是路由时),例如选择ppp0的 IP 地址作为源,目标位于 Internet 上,仍然会通过coglink选择路由,并且无法正常工作。这就是路由器在其 ppp0 IP 地址上应答 ping 时发生的情况。

    因此,为了解决问题的标题,为了让路由器在与一个接口上的 IP 地址绑定并通过另一个接口路由时选择正确的路由,可以添加额外的规则,从源地址选择路由表:

    ip rule add from 67.193.56.92 lookup 7992
    ip rule add from 206.248.155.133 lookup 5645
    

    通过使用来自本地系统(而不是来自lo接口)的具有特殊含义的附加选择器,即使只知道可能的地址范围(例如:使用whois命令检索)也足够了。前面的两条规则可以替换为:iif lo

    ip rule add from 67.193.48.0/20 iif lo lookup 7992
    ip rule add from 206.248.128.0/18 iif lo lookup 5645
    

    对于其他情况(当最初未绑定套接字时),主路由表的默认路由具有最低度量将选择接口(当前为 coglink),默认情况下将其 IP 地址作为源。


    注意事项和警告:

    • iptables或nftables提供的 NAT 规则仍然需要

      使用iptables,由于始终正确选择了传出接口,这可能看起来像这样:

      iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o coglink -j MASQUERADE
      iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o ppp0 -j MASQUERADE
      

      或使用nftables和内核 >= 5.5入口接口可用于后路由:

      mynat.nft(与 一起使用nft -f mynat.nft):

      table ip mynat
      delete table ip mynat
      
      table ip mynat {
              chain mypost {
                      type nat hook postrouting priority srcnat; policy accept;
                      iif "coggw" oif "coglink" masquerade
                      iif "tekgw" oifname "ppp0" masquerade
              }
      }
      

      当然,选择更简单的 NAT 规则会起作用。

    • 如果接口消失并重新出现,或者只是上下移动,则必须相应地重新应用以前所做的许多设置:路由将消失并且必须重新应用,并且在某些情况下引用接口的路由规则可能会变得陈旧。

      • 因此,必须在启动时和之后与处理网络的工具进行一些集成,以保持这些路由表和路由规则正常工作。

      • 如果工具有限制,可以更改一些策略路由规则以适应。例如,对于当前拓扑,iif tekgw(几乎但不完全)等价于from 10.0.0.0/8.

    • 即使coglink的地址和默认路由的网关发生变化,这两条信息仍然可用……在coglink接口和路由上(如果使用 DHCP,也可能在 DHCP 客户端的租约文件中)。这只是重用现有数据进行集成的一个案例。这是一个使用 JSON 输出的示例,并且jq:

      地址:

      ip -json -4 address show dev coglink primary | jq -r '.[].addr_info[] | "\(.local)/\(.prefixlen)"'
      

      网关:

      ip -json -4 route show default dev coglink  | jq -r '.[].gateway'
      

      它们甚至可以由处理系统网络的工具中的钩子直接提供,例如NetworkManager。

    • 1

相关问题

  • 用 D-LINK DFL-CPG310 防火墙替换 Cisco Pix 防火墙

  • 为 Cisco ASA 5510 上的端口 443/80 创建 NAT 规则和安全策略

  • Mac笔记本电脑无线路由器崩溃

  • 远程连接到局域网内的 Sql 服务器

  • 远程连接到 LAN 内的 SQL 服务器

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve