Linux 的高级网络设置
由 Jean-Jacques Sarton 贡献, 2007/03/21
如果稍作配置,虚拟机可以完全集成到网络中,并且您可以在所有虚拟机和主机之间进行访问。
一个网桥只能包含一个物理/虚拟设备。因此,您可以按如下方式创建网桥
#!/bin/sh # set PATH for the case we are called via sudo or su root PATH=/sbin:/usr/bin:/bin:/usr/bin # create a tap tunctl -t tap1 -u <user> ip link set up dev tap1 f # create the bridge brctl addbr br0 brctl addif br0 tap1 # set the IP address and routing ip link set up dev br0 ip addr add 10.1.1.1/24 dev br0 ip route add 10.1.1.0/24 dev br0
使用此代码,您将能够从主机联系连接到主机接口 tap1 的虚拟机,以及从虚拟机联系主机。IP 地址不应与您的 PC 的主 IP 地址冲突,后者可能在 192.168.0.0/16 范围内。
通过这些设置,我们无法从虚拟机访问外部世界。具体操作方法将在稍后解释。
如果我们计划使用多个虚拟机,可以将更多的 tap 设备添加到网桥。脚本可以按如下方式修改
#!/bin/sh # set PATH for the case we are called via sudo or su root PATH=/sbin:/usr/bin:/bin:/usr/bin USER=<name of the vm user> NUMBER_OF_VM # create the bridge brctl addbr br0 # create the taps and insert them into the bridge NB=1 while [ $NB -lt $NUMBER_OF_VM do tunctl -t tap$NB -u $USER ip link set up dev tap$NB brctl addif br0 tap$NB let NB=$NB+1 done # set the IP address and routing ip link set up dev br0 ip addr add 10.1.1.1/24 dev br0 ip route add 10.1.1.0/24 dev br0
现在我们将能够启动 1 到 n 的虚拟机,这些虚拟机将连接到 tap1、tap2、...tapn。
虚拟机内的设置。您可以使用访客系统提供的工具来配置用于网络连接的设备,或者手动或通过脚本设置 IP 地址。在 Linux 上,需要手动调用的命令是
ip link set up dev eth0 ip addr add 10.1.1.2/24 dev eth0 ip route add default via 10.1.1.1 dev eth0
您还必须编辑 /etc/resolv.conf 文件,以便能够解析 www.virtualbox.org 等网络名称或本地名称。此文件的内容可以与您计算机上的 resolv.conf 文件相同。
您也可以通过 DHCP 分配地址,在这种情况下,dhcpd 守护程序必须在主机上运行。一个简单的配置应如下所示
ddns-update-style interim; ignore client-updates; subnet 10.1.1.0 netmask 255.255.255.0 { # --- default gateway option routers 10.1.1.1; option subnet-mask 255.255.255.0; option domain-name "domain.org"; option domain-name-servers 10.1.1.1; # option ntp-servers 10.1.1.1; range dynamic-bootp 10.1.1.2 10.1.1.254; default-lease-time 21600; max-lease-time 43200; }
如果您想使用 ZeroConf rendez-vous/Bonjour 自动设置访客的 IP 地址,您应该为主机使用 169.254.0.0/16 范围内的地址,例如 169.254.0.1。
将内部网络连接到外部世界。
在上述情况下,我们无法访问外部世界,也无法更新访客系统或下载任何东西。为了使其正常工作,我们必须配置主系统以进行 NAT。
最简单的方法是插入用于连接互联网的接口,并使用路由器提供的 DHCP 服务器(如果您通过 DSL 路由器连接到互联网)。如果我们这样做,所有系统都可以访问网络,您可以在虚拟机内浏览或下载文件。
如果您不希望虚拟机通常连接到外部世界,您可以设置您的主机(并取消设置)以进行临时连接。
可以使用以下代码进行 NAT 设置
INTIF="br0" EXTIF="eth0" echo 1 > /proc/sys/net/ipv4/ip_forward # clear existing iptable rules, set a default policy iptables -P INPUT ACCEPT iptables -F INPUT iptables -P OUTPUT ACCEPT iptables -F OUTPUT iptables -P FORWARD DROP iptables -F FORWARD iptables -t nat -F # set forwarding and nat rules iptables -A FORWARD -i $EXTIF -o $INTIF -j ACCEPT iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE Setting will be do with # clear existing iptable rules, set a default policy iptables -P INPUT ACCEPT iptables -F INPUT iptables -P OUTPUT ACCEPT iptables -F OUTPUT iptables -P FORWARD DROP iptables -F FORWARD iptables -t nat -F # disable forwarding echo 0 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/ip_dynaddr
如果已安装防火墙,您还可以通过调用以下命令启用/禁用互联网访问
# insert NAT rule iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # enable forwarding echo 1 > /proc/sys/net/ipv4/ip_forward
并使用以下命令禁用互联网访问
# remove NAT rule iptables -t nat -F # disable forwarding echo 0 > /proc/sys/net/ipv4/ip_forward
通过 IPv6 连接
由于 IPv6 地址范围限制在约 3.59 个地址,且大部分已被使用,因此开发了下一代互联网协议。IPv6 的一个主要优点是,它有足够的空间为所有系统提供全球唯一且有效的地址,而无需 NAT 或 STUN 等特殊考量。随着技术的发展以及基于 IP 的计算机服务、基于 IP 的电话等的应用,对扩展 IP 地址范围的需求显著增加。
通过 IPv6,完全的网络连接将成为现实,不同系统之间的通信将更加便捷。
所有主要的操作系统(BSD、Linux、Mac OS X 和其他类 UNIX 系统)都实际支持 IPv6。Windows Vista 和 Windows XP 也是如此(在 XP 上您可能需要 Microsoft 提供的一些补充)。
如果您通过 SIXXS.NET 等提供商连接到 IPv6 世界或使用 6to4(协议 41),您将获得一个 IPv6 主地址,并且可以使用自己的分段用于本地网络。每个系统都将连接到 IPv6 网络,无需 NAT 等。
在这种情况下,我们假设您将在虚拟机上尝试 IPv6 并获得您基于 IPv6 网络的首次体验。
进一步的假设是您从 sixxs.net 或其他供应商那里获得了固定的 IPv6 地址,并且能够配置自己的分段。
您将获得的地址可能看起来像 2001:XXXX:YYYY:ZZZZ::2(XXXX、YYYY 和 ZZZZ 是十六进制编码值)。这将是通过隧道连接到 IPv6 的主地址。如果您的供应商为您提供了使用分段的能力,您将获得可以使用的 IPv6 地址的主要部分(前缀),这应该是 2001:XXXX:SSSS::/48 XXXX。您可以利用它在您的 IPv6 网络中使用从 2001:XXXX:SSSS:0000::/64 到 2001:XXXX:SSSS:ffff::/64 的前缀。
对于网桥,您需要一个独立的接口或 tap 设备,它不应连接到您的主接口端口。
设置网桥的脚本与上面示例类似,只有少数差异。
#!/bin/sh # set PATH for the case we are called via sudo or su root PATH=/sbin:/usr/bin:/bin:/usr/bin # create a tap tunctl -t tap1 -u <user> ip link set up dev tap1 # create the bridge brctl addbr br0 brctl addif br0 tap1 # set the IP address and routing ip link set up dev br0 ip -6 addr add 2001:XXXX:SSSS:1::1/64 dev br0 ip -6 route add 2001:XXXX:SSSS:1:/64 dev br0
在虚拟机上,您可以使用 IPv6 提供的自动路由器和 IP 设置功能。在这种情况下,您应该安装 radvd(大多数 Linux 发行版都提供)并修改 /etc/radvd.conf 文件
interface br0 { AdvSendAdvert on; MinRtrAdvInterval 30; MaxRtrAdvInterval 100; prefix 2001:XXXX:SSSS:1::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr on; }; };
接口 (br0) 和 IPv6 前缀必须修改,其他值通常正常。
在虚拟主机上,您不需要做任何事情,IPv6 地址和路由将自动设置。唯一的问题是 DNS 将无法工作。如果您直接使用 IPv6 地址,则可以访问 IPv6 网络中的其他主机。在 Linux 和类 UNIX 系统上,如果您将名称服务器的 IPv6 地址放入 /etc/resolv.conf 文件中,就可以解决 DNS 问题。您的 DNS 服务器可能没有 IPv6 地址,并且您的虚拟主机将无法处理 IPv4 地址。为了解决这个问题,您可以下载 ptrtd 和 totd。在编译、配置并启动它们之后,您只需编辑 /etc/resolv.conf 文件并将 nameserver 2001:XXXX:SSSS:1::1 行添加到此文件中,您将完全连接到 IPv4 和 IPv6 世界。Totd (Trick or Treat Daemon) ftp://ftp.pasta.cs.uit.no/pub/Vermicelli 是一个缓存名称服务器,它首先查找 IPv6 地址,如果没有此类地址,则查找 IPv4 地址并构建一个具有配置前缀的 IPv6 地址。Ptrtd (Portable Transport Relay Translator Daemon) 识别此类地址并将 IPv6 以太网帧转换为 IPv4 帧,并将从外部返回的帧转换为 IPv6。
编译 Totd 可能会失败,但如果您编辑 Makefile 文件并删除 -Werror 选项,则可以修复此问题。Totd 通常安装在 /usr/local/sbin 下,并期望配置文件 totd.conf 位于 /usr/local/etc 目录下。此文件应包含以下内容
forwarder YOUR_IPv4_ADDRESS prefix 2001:XXX:SSS:N:: pidfile /var/run/totd.pid
YOUR_IPv4_ADDRESS 和 2001:XXX:SSS:N:: 应替换为适当的值,N 是转换后的 IPv4 地址的分段号,例如可以是 4。
ptrtd 没有配置文件,因此您必须按如下方式启动它
ptrtd -p 2001:XXX:SSS:N::
您的 IPv6 网络的名称解析
最简单的方法是在主机上运行 avahi,并在访客系统上运行相应的服务。Avahi 是 Linux 上的 Zeroconf 实现,在大多数最新发行版中都可用。ZeroConf 最初由 Apple 开发,可在 Mac OS X 上使用。在 Linux 下,您应该编辑 /etc/nsswitch.conf 文件并按如下方式修改 hosts 行:hosts: files dns mdns6 这应为主机系统和 Linux 虚拟机完成。另请参阅 avahi 文档。