![通过指定接口将数据路由到互联网](https://linux22.com/image/610400/%E9%80%9A%E8%BF%87%E6%8C%87%E5%AE%9A%E6%8E%A5%E5%8F%A3%E5%B0%86%E6%95%B0%E6%8D%AE%E8%B7%AF%E7%94%B1%E5%88%B0%E4%BA%92%E8%81%94%E7%BD%91.png)
我有一台主服务器 (Centos 6.2),用作路由器/防火墙,并有虚拟机。虚拟机位于网络 10.0.0.0/8 中,其他所有服务器(有 DHCP 服务器)位于 192.168.0.0/16 中。
我有两个面向互联网的接口,ppp0 具有可变 IP,ppp1 具有静态 IP。我需要做的是让来自 10.0.0.0/8 的所有传出流量都通过 ppp1,这样虚拟机将被视为静态 IP。192.168.0.0/16 中的机器必须能够直接与 10.0.0.0/8 中的机器通信。
...基本上,如果所有流量来自 10.0.0.0/8,则让它们通过 ppp1 进入互联网。保留不同网络之间相互通信的能力。
我尝试了几个基于源的路由示例,但都没有成功,最终无法从主服务器访问虚拟机。使用 iptables 似乎也不起作用。
我的整个架构如下所示:
Server:
ppp0: facing internet variable ip
ppp1: facing internet static ip
vnet0: bridge with ips: 192.168.0.1, 10.0.0.1
eth1: facing the local network
vnet1: interface to the first virtual server
vnet2: interface to the second virtual server
Virtual server 1:
eth0: interface connected to main server, with ip: 10.0.0.10.
Virtual server 2:
eth0: interface connected to main server, with ip: 10.0.0.11.
Local Machine *: (All the computers of people working in the office)
eth*: interface connected to main server, with ip: 192.168.0.*.
ip route show
服务器中的输出是:
10.9.100.1 dev ppp1 proto kernel scope link src 190.196.26.245
10.52.173.3 dev ppp0 proto kernel scope link src 190.21.97.109
192.168.0.0/24 dev vnet0 proto kernel scope link src 192.168.0.1
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth2 scope link metric 1004
169.254.0.0/16 dev vnet0 scope link metric 1005
10.0.0.0/8 dev vnet0 proto kernel scope link src 10.0.0.1
default dev ppp0 scope link
的输出ip link show
为:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:21:5e:c2:af:20 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:14:78:7c:47:87 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether ac:f1:df:69:5c:70 brd ff:ff:ff:ff:ff:ff
5: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 00:14:78:7c:47:87 brd ff:ff:ff:ff:ff:ff
7: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc pfifo_fast state UNKNOWN qlen 3
link/ppp
8: ppp1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc pfifo_fast state UNKNOWN qlen 3
link/ppp
9: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
link/ether fe:54:00:54:f8:48 brd ff:ff:ff:ff:ff:ff
10: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
link/ether fe:54:00:d0:14:24 brd ff:ff:ff:ff:ff:ff
答案1
您应该iproute
安装该软件包来执行策略路由。
# create a new ip routing table entry
echo "66 static-ip" >> /etc/iproute2/rt_tables
# add the rule entry to have packets with source 10.0.0.0/8 routed through the
# alternate "static-ip" routing table
ip rule add from 10.0.0.0/8 lookup static-ip
# add the routes to the "static-ip" table
ip route add default dev ppp1 table static-ip
ip route add 192.168.0.0/16 dev vnet0 table static-ip
ip route add 10.0.0.0/8 dev vnet0 table static-ip
基本上就是这样,但你需要弄清楚如何让条目重新启动后仍然有效(这通常是通过将它们放入启动脚本并对其进行一些参数化以满足你的需要来实现的)。看看此邮件列表帖子例如如何以 CentOS 风格完成。
请注意,使用具有两个 IP 别名的桥接接口可能不是您想要的,因为您将无法安全地过滤流量 - 无论您如何配置 IP 过滤器,桥接连接总是会将流量从一个网段传递到另一个网段。您应该使用两个单独的接口分别连接到 10.0.0.0/8 和 192.168.0.0/16 网络(如果您不使用桥接 AFAICS,则在您的配置中为 eth0 和 eth2)。此外,应从路由中删除 APIPA 网络(169.254.0.0/16)- 添加到NOZEROCONF=yes
并/etc/sysconfig/network
重新启动网络(或主机)。
答案2
您想要执行基于策略的路由,如下所示:
echo 200 Static >> /etc/iproute2/rt_tables
ip rule add from 10.0.0.0/8 table Static
ip route add default via <ppp1 IP> dev ppp1 table Static
ip route flush cache
这将路由来自 10.0.0.0 的所有流量通过 ppp1,其他任何流量都应遵守常规路由规则。您可能需要添加一条规则来告诉网络如何相互通信,但这应该可以满足您的要求。
进一步阅读一下,这是对这些概念的非常好的介绍:http://lartc.org/howto/