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 / 问题 / 78006
Accepted
Jichao
Jichao
Asked: 2009-10-25 16:53:08 +0800 CST2009-10-25 16:53:08 +0800 CST 2009-10-25 16:53:08 +0800 CST

如果主机获得两个 IP 地址,它如何路由 IP 数据包?

  • 772

为了澄清我的问题...

我想知道 Linux 内核如何在多宿主主机上路由数据包?

使用“multi-home”,我的意思是主机有多个 NIC 来发送数据包,例如我在 Virtualbox 中的 Debian 有两个 NIC。

eth0提供 NAT 支持。我不知道 Virtualbox 是如何做到这一点的。我的意思是我的 Windows 主机中没有任何 IP 为 10.0.2.x 的虚拟网卡。

eth1提供仅主机支持。我用这个小网络学习TCP/IP协议,做了一些小实验。我手动配置为IP地址192.168.56.2,网关192.168.56.1,后面的IP地址是Virtualbox虚拟网卡IP地址。

主机操作系统我用ADSL上网,得到一个随机的IP地址,例如118.249.xxx.113。

那么问题来了,linux内核是如何路由IP包的呢?我的意思是,如果我运行了以下命令,我将无法连接到 Internet。

ifup eth0
ifup eth1
ping www.google.com

该 ping 不会返回任何响应。

那么是不是在设置了eth1之后,内核会使用eth1作为默认的网卡,在host-only网络中发送IP包?结果,在Debian中,我无法连接到外部互联网?

另一个简单的问题是,由于 eth1 现在是默认网卡,如果 eth0 找不到可用的路由条目,Linux 内核会尝试使用 eth1 网卡发送数据包吗?
如果会,那么如何配置呢?

这是我在 Virtualbox 中的 Debian Linux 网络配置。

eth0  Link encap:Ethernet  HWaddr 08:00:27:ec:d9:bb  
              inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
              inet6 addr: fe80::a00:27ff:feec:d9bb/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:1690 errors:2 dropped:0 overruns:0 frame:0
              TX packets:1129 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:2276172 (2.1 MiB)  TX bytes:62647 (61.1 KiB)
              Interrupt:11 Base address:0xd020 


eth1      Link encap:Ethernet  HWaddr 08:00:27:ae:e1:69  
          inet addr:192.168.56.2  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:feae:e169/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:48 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:5985 (5.8 KiB)  TX bytes:1334 (1.3 KiB)
          Interrupt:10 Base address:0xd240 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:560 (560.0 B)  TX bytes:560 (560.0 B)

路由表如下:

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.56.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1
0.0.0.0         192.168.56.1    0.0.0.0         UG        0 0          0 eth1
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0


谢谢。
江阳

ip
  • 4 4 个回答
  • 5752 Views

4 个回答

  • Voted
  1. Sam Halicke
    2009-10-25T17:33:51+08:002009-10-25T17:33:51+08:00

    你的问题有点令人困惑,但让我试一试。

    首先,如果你想拥有一个简单的 NAT/伪装路由器,有一些简单的、适应性强的教程来介绍如何使用 netfilter ( iptables) 来实现这一点。启用此行为可能看似简单。谷歌搜索“linux nat”或“linux masquerade”会有所帮助。

    编辑:将基本命令投入使用。确保你知道哪个接口是哪个!

    /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    /sbin/iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
    /sbin/iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
    

    否则,如果这是您的目标,您应该能够使用 route 命令删除“额外”网关并强制所有流量通过 eth1(如果我理解正确,在这种情况下根本不需要 eth0。)

    route del gw 10.0.2.2 eth0 
    

    应该在最后一个场景中解决问题。(如果我理解正确,我可能不会。)

    希望有帮助。

    • 1
  2. Lee B
    2009-10-26T00:38:04+08:002009-10-26T00:38:04+08:00

    您有两个默认路由。我一次只使用过一个,但我想两个不会有问题——据我所知,路由表是按特定性排序的(目标子网掩码中的位数,升序)和也许是 MTU(尽管我在 Linux 上不这么认为)。然后将使用排序列表中的第一个匹配的默认路由。

    无论如何都尝试删除默认路由之一(route del ... 正如其他人所提到的,或 ip route del ...)。

    否则...为什么您的 ping 得到“无响应”?这听起来像是防火墙问题。可能是 linux 会自动使用两个默认路由进行负载平衡/循环,但我从未听说过 Linux 会这样做,它可能会给某些协议带来问题,所以我对此表示怀疑。

    如果您遇到路由问题,ping 可能应该说“没有路由到主机”或类似的内容。没有什么不同的反应。确保 ping 从主机名确定 IP OK。如果不是,那就是DNS问题。如果是这样,请查看您的防火墙—​​— iptables -L -n -v 会为您提供任何规则,以及规则被命中的次数。如果规则增加的频率与您的 ping 一样频繁,则可能是问题所在。否则,使用wireshark检查进出机器的数据包。

    • 1
  3. Best Answer
    user23312
    2009-10-25T17:31:56+08:002009-10-25T17:31:56+08:00

    我不确定我是否正确理解了这个问题,但请执行“echo 1 > /proc/sys/net/ipv4/ip_forward”来启用路由。通过编辑 /etc/sysctl.conf 使其永久化。当它设置为 1(启用)时,Linux 将从一个以太网接口接收到的数据包转发到另一个 - 它将充当路由器。
    如果您有一台双宿主机——两种上网方式——你不能同时使用两个上行链路,只安装了两个默认网关......你可以做的是选择主要的默认网关,比如说 192.168.56.1然后选择一些您想通过辅助链接获取的网络:
    ip route add default via 192.168.56.1
    ip route add 221.x.x.x/24 via 10.10.10.2
    ip route add 99.99.99.99/32 via 10.10.10.2

    • 0
  4. evildead
    2009-10-25T17:32:24+08:002009-10-25T17:32:24+08:00

    所以,让我向您解释一下您的示例的一些基础知识。您有 2 个 Nics(虚拟与否无关紧要)。两者都在不同的网络中。10.0.2.0 和 192.168.56.0

    路由表中的前两个条目显示它们没有特殊的网关 (0.0.0.0),最后一列显示它们连接的 NIC。

    然后路由表有错误。默认网关有两个条目。您只能拥有一个真正的默认网关。通常,IP 数据包被发送到在路由表中找到的第一个默认 gw。(我猜你的情况是错误的)

    我不知道 NAT 究竟是如何工作的(我曾经使用过桥接网络)。所以你有两个选择。将默认网关设置为您的 REAL 机器 IP 地址的 IP 地址。例如,如果您在虚拟盒子之外的机器的 IP 为 10.0.2.254,请将您的默认网关设置为 10.0.2.254。(在 NAT 环境中,您必须在虚拟框之外设置您的机器以支持它,必须正确设置 ipfilter 并且必须启用接口之间的路由数据包echo 1 > /proc/sys/net/ipv4/ip_forward)。

    如果您使用桥接设置,您的机器将直接连接到连接到互联网的路由器。比你只需要设置一个IP地址是这个网络并将你的默认网关设置为你的路由器的IP。例如 VBOX 10.0.2.2 ------- MACHINE OUTSIDE VBOX 10.0.2.254 ------ 路由器连接到 Internet 10.0.2.1

    比您的网关是 10.0.2.1

    • 0

相关问题

  • 共享服务器IP

  • Windows 中执行反向 DNS 查找的命令行实用程序是什么?

  • 如何找到 ubuntu 盒子的默认网关

  • 我怎样才能得到一个网站的IP地址?

  • 如何让我的计算机将自己称为 192.168.1.* 上的任何 ip?

Sidebar

Stats

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

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

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

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +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