编辑1

编辑1

我有两台计算机,都运行 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 规则:

  1. sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT- 此规则表示您允许在数据包来自时路由eth2到(没有有关网络掩码的信息)。此规则完全没有意义。eth2192.168.1.3

  2. sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT- 几乎与上面相同。

  3. 您正在设置链的默认规则iptables -F INPUT ACCEPT,然后删除iptables -F INPUT

因此,我的建议是:

  1. 在计算机 B 上,所有三个接口都应具有来自不同网络的地址。如果您需要它们位于同一网络中,最好将它们桥接起来(创建一个“多接口”,将三个接口聚合为一个 IP 地址)。

  2. 阅读有关 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 接受
  1. 或者最简单的方法 - 桥接计算机 B 上的所有接口。这样您就不必使用 NAT。

问题延长后更新

您所拥有的网络架构实际上并非按照您的意愿工作。计算机 A 应该通过单独的网络连接到计算机 C,而不是通过网关(互联网)连接计算机 C 的网络。但您有两种解决方案。

“优雅之道”

要求交换机对带有 VLAN 标签的以太网帧透明(因为我猜想您没有可以标记端口的管理交换机)。如果您的交换机支持 802.1q,它应该可以这样工作。

  1. 您必须在计算机 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 地址 - 没有必要。

  2. 在 eth0.100(计算机 A)和 ethX(虚拟机 B)上设置来自同一网络的地址。假设它将是 192.168.2.1/24(计算机 A)和 192.168.2.2/24(虚拟机 B)。

  3. 虚拟机 B 必须再有一个接口,用于桥接至计算机 C 上的 en1(未标记接口)。假设其地址为 192.168.1.3/24。

  4. 现在需要在虚拟机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 接受
  1. 并在计算机A上添加默认网关:
路由添加默认网关 192.168.2.2

它应该可以工作。

肮脏的方式 您可以尝试最粗暴的方法。这种方法不需要 VLAN,但会在第 3 层造成一点混乱。

  1. 计算机 A 具有接口 eth0,地址为 192.168.2.1/24。

  2. 虚拟机 B 有两个接口 ethX 和 ethY。在虚拟机设置中,它们均桥接到 en1(在计算机 C 上)。

  3. 接口 ethX 的地址为 192.168.2.2/24。接口 ethY 的地址为 192.168.1.3/24。

  4. 应用与优雅方式第 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 :)

相关内容