Rota dados para a internet através de uma interface especificada

2

Eu tenho um servidor principal (Centos 6.2) que serve como roteador / firewall e possui máquinas virtuais. As máquinas virtuais estão na rede 10.0.0.0/8 e todos os outros (existe o servidor DHCP) estão em 192.168.0.0/16.

Eu tenho duas interfaces voltadas para a internet, ppp0 com um IP variável e ppp1 com um IP estático. O que eu preciso fazer é fazer todo o tráfego de saída de 10.0.0.0/8 passar por ppp1 para que as máquinas virtuais sejam vistas como o IP estático. Máquinas em 192.168.0.0/16 devem poder se comunicar diretamente com máquinas em 10.0.0.0/8.

... basicamente, faça todo o tráfego que for para a internet, passe pelo ppp1 se for originado a partir de 10.0.0.0/8. Mantendo a capacidade de as diferentes redes se comunicarem entre si.

Eu tentei vários exemplos de roteamento baseado em origem sem sorte, acabo sem acesso do servidor principal para as máquinas virtuais. Nada com o iptables parece funcionar também.

Meu esquema inteiro se parece com:

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.*.

A saída de ip route show no servidor é:

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

A saída de 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
    
por Mario 22.04.2013 / 16:05

2 respostas

4

Você deve ter o pacote iproute instalado para fazer o roteamento de políticas.

# 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

Isso seria basicamente, mas você precisaria descobrir como tornar as entradas reboot-persistent (o que normalmente seria feito colocando-as em um script de inicialização e parametrizando-as um pouco para atender às suas necessidades). Dê uma olhada em este post da lista de discussão para um exemplo de como isso pode ser feito no CentOS estilo.

Observe que o uso de uma interface em ponte com dois aliases IP provavelmente não é o que você deseja, pois você não seria capaz de filtrar o tráfego com segurança - a conexão em ponte sempre passaria tráfego de um segmento de rede para outro, independentemente de como você configura Filtros IP. Você deve usar duas interfaces separadas conectadas às redes 10.0.0.0/8 e 192.168.0.0/16, respectivamente (eth0 e eth2 em sua configuração, se você não estiver usando uma ponte AFAICS). Além disso, a rede APIPA (169.254.0.0/16) deve ser removida das rotas - adicione NOZEROCONF=yes a /etc/sysconfig/network e reinicie a rede (ou o host).

    
por 22.04.2013 / 16:38
1

Você deseja fazer o roteamento com base em políticas, algo ao longo destas linhas:

echo 200 Static >> /etc/iproute2/rt_tables em ip rule add from 10.0.0.0/8 table Static em ip route add default via <ppp1 IP> dev ppp1 table Static em ip route flush cache

Isso encaminhará qualquer tráfego de 10.0.0.0 a ppp1, qualquer outro tráfego deverá obedecer às regras de roteamento regulares. Você pode precisar adicionar uma regra para dizer às redes como falar umas com as outras, mas isso deve fazer o que você pediu.

Algumas outras leituras, esta é uma introdução muito boa aos conceitos: link

    
por 22.04.2013 / 16:36