我正在尝试使用具有 3 个 NIC 的 Ubuntu 12.10 服务器在 3 个子网之间设置路由。我希望能够让所有这些子网相互路由,并能够访问互联网。
10.0.2.0 网络连接到互联网。连接到互联网的 Netgear 路由器盒的地址为 10.0.2.1。
这三个子网分别是 10.0.2.0/16、10.100.0.0/16 和 10.101.0.0/16。
我尝试设置 /etc/network/interfaces 来定义 NIC 和路由,但似乎不起作用。我可以从任何相应子网上的任何计算机 ping ubuntu 服务器上的所有 NIC,但我无法从任何子网 ping 不同子网上的任何系统。我也无法从子网访问互联网。
# /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# eth0
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 10.0.2.154
netmask 255.255.0.0
gateway 10.0.2.1
dns-nameservers 10.0.2.100 8.8.8.8
# eth1
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 10.100.0.4
netmask 255.255.0.0
dns-nameservers 10.0.2.100 8.8.8.8
# eth2
auto eth2
allow-hotplug eth2
iface eth2 inet static
address 10.101.0.1
netmask 255.255.0.0
dns-nameservers 10.0.2.100 8.8.8.8
up route add -net 10.0.0.0 netmask 255.255.0.0 gw 10.0.2.1 dev eth0
up route add -net 10.100.0.0 netmask 255.255.0.0 gw 10.0.2.154 dev eth0
up route add -net 10.101.0.0 netmask 255.255.0.0 gw 10.0.2.154 dev eth0
up route add -net 10.101.0.0 netmask 255.255.0.0 gw 10.100.0.4 dev eth1
up route add -net 10.0.0.0 netmask 255.255.0.0 gw 10.100.0.4 dev eth1
up route add -net 10.100.0.0 netmask 255.255.0.0 gw 10.101.0.1 dev eth2
up route add -net 10.0.0.0 netmask 255.255.0.0 gw 10.101.0.1 dev eth2
我很乐意听取有关如何修复我的 /etc/network/interfaces 文件以便在这些子网之间正确路由的任何建议。
答案1
无需在路由器上添加路由。它们已经作为本地接口直接连接到那里了!您可以通过运行来查看route -n
。例如:
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.25.1 0.0.0.0 UG 0 0 0 wlan0 # def.gw
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlan0 # zeroconf
192.168.0.0 192.168.25.254 255.255.255.0 UG 0 0 0 wlan0 # route
192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 testvpn # interf.
192.168.25.0 0.0.0.0 255.255.255.0 U 2 0 0 wlan0 # interf.
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0 # interf.
我在这里手动添加的实际路线已用 标记# route
。您会注意到,这些线路也用 标记列出G
!没有该标记的线路只是本地线路,可直接使用。
您唯一需要启用的是 IPv4 转发。
sudo sysctl -w net.ipv4.ip_forward=1
并通过将此行放入/etc/sysctl.d/10-routing.conf
(您可以编一个名字)文件中来永久启用它:
net.ipv4.ip_forward=1
从这里,您必须将这些路由告知网络中的主机。因此,10.100.0.0/16
例如,在一台机器上,您需要添加如下路由:
# On a client somewhere in 10.100.0.0
auto eth0
iface eth0 inet static
address 10.100.0.123
netmask 255.255.0.0
# route 10.0.0.0/16 via 10.100.0.4
up route add -net 10.0.0.0 netmask 255.255.0.0 gw 10.100.0.4
# route 10.101.0.0/16 via 10.101.0.1
up route add -net 10.101.0.0 netmask 255.255.0.0 gw 10.101.0.1
公布这些路由的更好方法是使用 DHCP 通知它们,或者使用 使其成为默认网关gateway
。或者,使用“真实”路由协议,例如 OSPF、RIP 等。
顺便说一句,你/etc/network/interfaces
文件中的语法是错误的。up
条目应该是列出的每个单独接口的一部分,用空格缩进,例如address
条目。
答案2
以下是我最终解决路由问题的方案,供大家参考。下面是我最终得到的 /etc/network/interfaces、/etc/iptables.rules 和 /etc/sysctl.d/10-routing.conf 文件。
事实证明我需要从我的 /etc/network/interfaces 文件中删除路由命令,然后设置 ipforwarding。
=========================================
/etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# eth0
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 10.0.2.154
netmask 255.255.0.0
gateway 10.0.2.1
dns-nameservers 10.0.2.100 8.8.8.8
pre-up iptables-restore < /etc/iptables.rules
# eth1
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 10.100.0.4
netmask 255.255.0.0
dns-nameservers 10.0.2.100 8.8.8.8
# eth2
auto eth2
allow-hotplug eth2
iface eth2 inet static
address 10.101.0.1
netmask 255.255.0.0
dns-nameservers 10.0.2.100 8.8.8.8
=================================================
/etc/iptables.rules
# Generated by iptables-save v1.4.12 on Fri Feb 1 20:43:36 2013
*nat
:PREROUTING ACCEPT [204:18924]
:INPUT ACCEPT [35:6098]
:OUTPUT ACCEPT [3:164]
:POSTROUTING ACCEPT [1:40]
-A POSTROUTING -o eth0 -j SNAT --to-source 10.0.2.154
COMMIT
# Completed on Fri Feb 1 20:43:36 2013
=================================================
/etc/sysctl.d/10-routing.conf
net.ipv4.ip_forward=1