Назад | Перейти на главную страницу

Направлять данные в Интернет через указанный интерфейс

У меня есть основной сервер (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.

... в основном, весь трафик, который должен идти в Интернет, проходить через ppp1, если он исходит из 10.0.0.0/8. Сохранение способности разных сетей разговаривать друг с другом.

Я безуспешно пробовал несколько примеров маршрутизации на основе источника, у меня не было доступа с главного сервера к виртуальным машинам. С 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

Вы должны иметь 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 соответственно (eth0 и eth2 в вашей конфигурации, если вы не будете использовать мост AFAICS). Также следует убрать из маршрутов сеть APIPA (169.254.0.0/16) - добавить NOZEROCONF=yes к /etc/sysconfig/network и перезапустите сеть (или хост).

Вы хотите выполнить маршрутизацию на основе политик, что-то в этом роде:

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/