我有两台计算机,都运行 ubuntu 12.04 64 位。我需要将一台计算机的流量路由到另一台计算机。
computer A: 192.168.1.3 (eth0)
computer B: 192.168.1.7 (eth0), 192.168.1.5 (eth1), 192.168.1.6 (eth2)
我需要计算机 B 中的这三个接口来运行我的最终实验……
顺便说一下,计算机 B 在单独主机上的虚拟机上运行。
我像这样更改计算机 A 的默认网关:
sudo sudo ip route del
sudo ip route add default via 192.168.1.6
route -n
以下是计算机 A的输出:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.6 0.0.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
我也在计算机 B 上运行这个脚本:
#!/bin/bash
IF="eth2"
ADDR="192.168.1.3"
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_dynaddr'
sudo iptables -P FORWARD DROP
sudo iptables -F FORWARD
sudo iptables -t nat -F
sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT
sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s $ADDR -j MASQUERADE
执行这些指令后,计算机 A 无法访问互联网!!
您对这个问题及其解决方案有什么想法吗?
编辑1
子网默认拓扑结构如下:
|--------------|
| Comp C |
|----------| eth0 |----------| en0| |----------| |
| CompA |--------| switch |---------| | VM B | |
|----------| |-----|----| | |----------| |
| |--------------|
|
( Internet )
( )
更新
计算机A:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.2 0.0.0.0 UG 0 0 0 eth0.100
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0.100
虚拟机B:
eth0
通过 nat 连接。
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.233.2 0.0.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
172.16.233.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
192.168.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth2
答案1
计算机 B 上有三个接口,它们的地址来自同一子网(192.168.1.0/24,对吗?)。
查看你的一些 iptables 规则:
sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT
- 此规则表示您允许在数据包来自时路由eth2
到(没有有关网络掩码的信息)。此规则完全没有意义。eth2
192.168.1.3
sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
- 几乎与上面相同。您正在设置链的默认规则
iptables -F INPUT ACCEPT
,然后删除iptables -F INPUT
。
因此,我的建议是:
在计算机 B 上,所有三个接口都应具有来自不同网络的地址。如果您需要它们位于同一网络中,最好将它们桥接起来(创建一个“多接口”,将三个接口聚合为一个 IP 地址)。
阅读有关 iptables 的更多信息并尝试理解它。它非常简单。例如,当您有连接计算机 A 和 B 的 192.168.1.0/24 网络时,最简单的方法是像这样进行 NAT(计算机 B):
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.1.0/24 -j MASQUERADE iptables -A 转发 -s 192.168.1.0/24 -d 0/0 -j 接受 iptables -A 转发 -s 0/0 -d 192.168.1.0/24 -j 接受
- 或者最简单的方法 - 桥接计算机 B 上的所有接口。这样您就不必使用 NAT。
问题延长后更新
您所拥有的网络架构实际上并非按照您的意愿工作。计算机 A 应该通过单独的网络连接到计算机 C,而不是通过网关(互联网)连接计算机 C 的网络。但您有两种解决方案。
“优雅之道”
要求交换机对带有 VLAN 标签的以太网帧透明(因为我猜想您没有可以标记端口的管理交换机)。如果您的交换机支持 802.1q,它应该可以这样工作。
您必须在计算机 A 和 C 上创建 vlan 接口。例如
sudo vconfig add eth0 100
。此命令将创建带标签的接口 eth0.100。在计算机 C 上执行命令sudo vconfig add en1 100
。您将拥有接口 en1.100。在虚拟机设置中,您需要将虚拟接口 ethX 与 en1.100 桥接。不要为 en1.100(计算机 C)分配任何 IP 地址 - 没有必要。在 eth0.100(计算机 A)和 ethX(虚拟机 B)上设置来自同一网络的地址。假设它将是 192.168.2.1/24(计算机 A)和 192.168.2.2/24(虚拟机 B)。
虚拟机 B 必须再有一个接口,用于桥接至计算机 C 上的 en1(未标记接口)。假设其地址为 192.168.1.3/24。
现在需要在虚拟机C上配置NAT:
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.2.0/24 -j MASQUERADE iptables -A 转发 -s 192.168.2.0/24 -d 0/0 -j 接受 iptables -A 转发 -s 0/0 -d 192.168.2.0/24 -j 接受
- 并在计算机A上添加默认网关:
路由添加默认网关 192.168.2.2
它应该可以工作。
肮脏的方式 您可以尝试最粗暴的方法。这种方法不需要 VLAN,但会在第 3 层造成一点混乱。
计算机 A 具有接口 eth0,地址为 192.168.2.1/24。
虚拟机 B 有两个接口 ethX 和 ethY。在虚拟机设置中,它们均桥接到 en1(在计算机 C 上)。
接口 ethX 的地址为 192.168.2.2/24。接口 ethY 的地址为 192.168.1.3/24。
应用与优雅方式第 4 点和第 5 点相同的命令。
它也应该可以工作。
您的解决方案的问题在于,您试图将流量从同一网络路由到同一网络。您只能在两个逻辑 IP 网络之间路由流量(不能来自同一寻址范围)。如果您需要路由,那么您需要有两个不同的网络 - 在这种情况下为 192.168.1.0/24(现有网络)和 192.168.2.0/24(连接计算机 A 和虚拟机 B 的网络)。
答案2
将机器 B 放入单机实机而非虚拟机中即可解决问题。之后在机器 A 中创建 eth0.1,ip 地址为 192.168.2.2,在机器 B 中创建 eth0.1,ip 地址为 192.168.2.1。
在机器A中设置默认网关:
sudo route del default gw 192.168.1.1
sudo route add default gw 192.168.2.1
并在机器B上运行该指令:
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.2.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.2.0/24 -d 0/0 -j ACCEPT
iptables -A FORWARD -s 0/0 -d 192.168.2.0/24 -j ACCEPT
现在机器 A 的流量已从机器 B 正确路由。非常感谢您的指南@Krzysztof Sawicki :)