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

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

为了澄清我的问题......

我想知道 Linux 内核是如何路由数据包的多归属主持人?

所谓“多宿主”,是指主机有多个 NIC 来发送数据包,例如,我的 Virtualbox 中的 Debian 有两个 NIC。

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

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

主机操作系统我使用ADSL连接到互联网并获取一个随机IP地址,例如118.249.xxx.113。

所以问题那么,Linux 内核如何路由 IP 数据包?我的意思是,如果我运行以下命令,我将无法连接到互联网。

ifup eth0
ifup eth1
ping www.google.com

该 ping 命令不会返回任何响应。

那么,设置完 eth1 后,内核会使用 eth1 作为默认位于仅主机网络中的网卡发送 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


谢谢。jcyang

答案1

我不确定我是否正确理解了这个问题,但请执行“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

答案2

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

首先,如果您想要一个简单的 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

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

route del gw 10.0.2.2 eth0 

应该可以解决最后一种情况。(如果我理解正确的话,但可能我理解错了。)

希望有所帮助。

答案3

您有两个默认路由。我每次只使用一个,但我想两个应该没问题 --- 据我所知,路由表是按特异性(目标子网掩码中的位数,升序)和 MTU(虽然我不认为 Linux 上是这样)排序的。然后会使用排序列表中第一个匹配的默认路由。

尝试删除一条默认路由(其他人提到的route del...或者ip route del...)。

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

如果您遇到路由问题,ping 可能应该显示“没有到主机的路由”或类似内容。没有响应则不同。确保 ping 能够从主机名确定 IP。如果没有,则为 DNS 问题。如果是这样,请查看您的防火墙 - iptables -L -n -v 将为您提供所有规则以及规则被命中的次数。如果规则的增加频率与您的 ping 频率一样,则很可能是问题所在。否则,请使用 wireshark 检查离开和进入机器的数据包。

答案4

那么,让我来解释一下你的例子的一些基本知识。你有 2 个网卡(虚拟的或非虚拟的都无所谓)。它们都在单独的网络中。10.0.2.0 和 192.168.56.0

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

那么路由表中就有错误。默认网关有两个条目。您只能有一个真正的默认网关。通常,IP 数据包会发送到路由表中找到的第一个默认网关。(我猜您的情况下是错误的)

我不知道 NAT 到底是如何工作的(我曾经使用过桥接网络)。所以你有两个选择。将默认网关设置为你真实机器的 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 ------- 机器外部 VBOX 10.0.2.254 ------ 路由器连接到互联网 10.0.2.1

那么你的网关将是 10.0.2.1

相关内容