为了澄清我的问题...
我想知道 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
谢谢。
江阳
你的问题有点令人困惑,但让我试一试。
首先,如果你想拥有一个简单的 NAT/伪装路由器,有一些简单的、适应性强的教程来介绍如何使用 netfilter (
iptables
) 来实现这一点。启用此行为可能看似简单。谷歌搜索“linux nat”或“linux masquerade”会有所帮助。编辑:将基本命令投入使用。确保你知道哪个接口是哪个!
否则,如果这是您的目标,您应该能够使用 route 命令删除“额外”网关并强制所有流量通过 eth1(如果我理解正确,在这种情况下根本不需要 eth0。)
应该在最后一个场景中解决问题。(如果我理解正确,我可能不会。)
希望有帮助。
您有两个默认路由。我一次只使用过一个,但我想两个不会有问题——据我所知,路由表是按特定性排序的(目标子网掩码中的位数,升序)和也许是 MTU(尽管我在 Linux 上不这么认为)。然后将使用排序列表中的第一个匹配的默认路由。
无论如何都尝试删除默认路由之一(route del ... 正如其他人所提到的,或 ip route del ...)。
否则...为什么您的 ping 得到“无响应”?这听起来像是防火墙问题。可能是 linux 会自动使用两个默认路由进行负载平衡/循环,但我从未听说过 Linux 会这样做,它可能会给某些协议带来问题,所以我对此表示怀疑。
如果您遇到路由问题,ping 可能应该说“没有路由到主机”或类似的内容。没有什么不同的反应。确保 ping 从主机名确定 IP OK。如果不是,那就是DNS问题。如果是这样,请查看您的防火墙—— iptables -L -n -v 会为您提供任何规则,以及规则被命中的次数。如果规则增加的频率与您的 ping 一样频繁,则可能是问题所在。否则,使用wireshark检查进出机器的数据包。
我不确定我是否正确理解了这个问题,但请执行“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 个 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