为了澄清我的问题......
我想知道 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