+ Responder ao Tópico



  1. #1
    tomiz
    Visitante

    Padrão Roteamento com base no protocolo ou porta

    Tenho um servidor Linux com três placas de rede: Uma para a rede local (eth0) e as outras duas cada uma para um provedor diferente.

    Neste servidor roda o Squid (proxy) e o QMail (servidor de correio).

    Estou querendo separar o tráfego. Todo o tráfego do Squid quero vá pelo Provedor1 e todo o tráfego do QMail quero vá pelo Provedor2.

    Alguém conhece uma solução para fazer isso ?

    Já tentei a solução abaixo (iproute e iptables) mas não obtive êxito.

    # Create two tables (21 and 31) to use with each connection
    # Copy main route to table 31
    ip route show table main | grep -Ev ^default | \
    while read ROUTE ; do \
    ip route add table 31 $ROUTE; \
    done
    # use ISP-1 as default gateway for table 31
    ip route replace default via x.x.x.2 table 31

    # Copy main route to table 21
    ip route show table main | grep -Ev ^default | \
    while read ROUTE ; do \
    ip route add table 21 $ROUTE; \
    done
    # use ISP-2 as default gateway for table 21
    ip route replace default via y.y.y.2 table 21

    # Mark packages (1 or ISP-1 e 2 for ISP-2)
    # aqui, já troquei OUTPUT por POSTROUTING e PREROUTING sem sucesso
    iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 1
    iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 2

    # Define rules to use the correct connection
    ip rule add from x.x.x.1 table 31
    ip rule add fwmark 1 table 31

    ip rule add from y.y.y.1 table 21
    ip rule add fwmark 2 table 21

  2. #2
    karfax
    Visitante

    Padrão Roteamento com base no protocolo ou porta

    Baeado na suposição de que vc tem duas placas com ip fixo, ou cada uma delas apontando para um modem/roteador conectado a 2 linhas diferentes:

    Sugestão:
    Separe as máquinas. Crie uma entrada MX no teu dns apontando para a máquina na qual está o SMTP e aponte no MUA dos clientes a interface interna dessa máquina. E é mais seguro, os dois serviços vão ficar mais livres, etc.
    Se voce definir o gateway da rede como sendo a máquina do proxy e essa máquina e o smtp puderem se enxergar (via cabo cross?) basta informar ao proxy que o smtp é a outra máquina, e ele vai rotear o pacote pelo tipo de serviço (smtp/25 e 110+145/pop+imap).




    Sds,

  3. #3
    TheMage
    Visitante

    Padrão regras para iproute 2

    Ola Tomix,..


    Cara eu tenho isso nas minhas regras ,.. e funciona bem ,.... mas não vou dizer que esta tudo certo nele,.. eu to meio sem tempo pra ajustar isso ai ,.. mas em fim ,... a unica Rede fria,.. é a XXX.XXX as demais são ips quentes,.. e a rede XXX.XXX.33.0/24 na verdade é apenas uma ponte para um adsl,... tenho isso rodando em um provedor de internet,.. !

    Da uma olhada ,.. espero que ajude,... !


    #!/bin/sh


    eth0arps='aaa.aaa.aaa.1 bbb.bbb.bbb.129 XXX.XXX.33.53';
    eth1arps='ccc.ccc.ccc.211 ccc.ccc.ccc.220 ddd.ddd.ddd.ddd ccc.ccc.ccc.214 ccc.ccc.ccc.219';
    eth2arps='XXX.XXX.22.10 XXX.XXX.22.50 XXX.XXX.22.120';

    case "$1" in

    [sS][tT][aA][rR][tT])

    ip link set up dev eth0
    ip link set up dev eth1
    ip link set up dev eth2
    ip link set up dev lo

    ip addr flush label "eth*"

    ip addr add 127.0.0.1/8 dev lo
    ip addr add bbb.bbb.bbb.130/29 dev eth0 broadcast bbb.bbb.bbb.135
    ip addr add XXX.XXX.33.1/24 dev eth0 broadcast XXX.XXX.33.255 label eth0:1
    ip addr add aaa.aaa.aaa.2/26 dev eth0 broadcast aaa.aaa.aaa.63 label eth0:2
    ip addr add ccc.ccc.ccc.210/28 dev eth1 broadcast ccc.ccc.ccc.223
    ip addr add XXX.XXX.11.1/28 dev eth1 broadcast XXX.XXX.11.15 label eth1:1
    ip addr add XXX.XXX.22.1/24 dev eth2 broadcast XXX.XXX.22.255

    ip route add default via bbb.bbb.bbb.129
    ip route add ddd.ddd.ddd.ddd via ccc.ccc.ccc.211

    # ip route add table to.192 dev eth0
    ip route add table embratel.1.out dev eth0
    ip route add dev eth1 table to.208
    ip route add via ccc.ccc.ccc.220 table to.quack
    ip route add dev eth2 table to.22
    ip route add dev eth0 table to.33
    ip route add via XXX.XXX.33.53 table gvt.1
    ip route add via bbb.bbb.bbb.129 table brt.1
    ip route add via bbb.bbb.bbb.129 table brt.2
    ip route add table http via XXX.XXX.33.53

    ip ru add to aaa.aaa.aaa.0/64 prio 5 lookup embratel.1.out
    ip ru add to ccc.ccc.ccc.208/28 prio 10 lookup to.208
    ip ru add to ddd.ddd.ddd.ddd prio 15 lookup to.quack
    # ip ru add to ccc.ccc.ccc.192/28 prio 20 lookup to.192
    ip ru add to bbb.bbb.bbb.128/29 lookup to.192 prio 21
    ip ru add to XXX.XXX.22.0/24 lookup to.22 prio 25
    ip ru add to XXX.XXX.33.0/24 lookup to.33 prio 30

    ip ru add fwmark 1 lookup http prio 50
    ip ru add fwmark 2 lookup gvt.1 prio 51
    ip ru add fwmark 3 lookup brt.2 prio 52
    ip ru add fwmark 4 lookup brt.1 prio 53
    ip ru add from XXX.XXX.22.0/24 prio 55 lookup gvt.1
    ip ru add from ccc.ccc.ccc.220 prio 60 lookup gvt.1
    ip ru add from ccc.ccc.ccc.219 prio 61 lookup gvt.1
    ip ru add from ccc.ccc.ccc.215 prio 62 lookup gvt.1
    ip ru add from ccc.ccc.ccc.192/27 lookup brt.1 prio 70
    ip ru add from bbb.bbb.bbb.128/28 lookup brt.2 prio 71

    ip neigh add XXX.XXX.33.53 nud permanent dev eth0
    ip neigh add bbb.bbb.bbb.129 nud permanent dev eth0
    ip neigh add aaa.aaa.aaa.2 nud permanent dev eth0
    ip neigh add ccc.ccc.ccc.211 nud permanent dev eth1
    ip neigh add ccc.ccc.ccc.212 nud permanent dev eth1
    ip neigh add ccc.ccc.ccc.214 nud permanent dev eth1
    ip neigh add XXX.XXX.22.10 nud permanent dev eth2
    ip neigh add XXX.XXX.22.50 nud permanent dev eth2
    ip neigh add XXX.XXX.22.120 nud permanent dev eth2

    ## isso fecha os arps das placas,.. isso contribui com seguranca e performace,..
    for a in $eth0arps ; do
    if ping -c1 $a >> /dev/null ; then
    ip neigh change $a nud perm dev eth0 ;
    fi ;
    done ;
    for a in $eth1arps ; do
    if ping -c1 $a >> /dev/null ; then
    ip neigh change $a nud perm dev eth1 ;
    fi ;
    done ;
    for a in $eth2arps ; do
    if ping -c1 $a >> /dev/null ; then
    ip neigh change $a nud perm dev eth2 ;
    fi ;
    done ;

    ;; ## fim start

    esac;


    #### fim de arquivo,..



    ### isto é no firewall (ioptables) ,...
    iptables -t mangle -A PREROUTING -p udp --dport 53 -i eth1 -s ccc.ccc.ccc.211 -d ! ccc.ccc.ccc.192/27 -j MARK --set-mark 2
    iptables -t mangle -A PREROUTING -p tcp --sport 22 -i eth1 -s ccc.ccc.ccc.214 -d ! XXX.XXX.22.0/24 -j MARK --set-mark 2
    iptables -t mangle -A PREROUTING -p tcp --sport 80 -i eth1 -s ccc.ccc.ccc.211 -d ! XXX.XXX.22.0/24 -j MARK --set-mark 3
    iptables -t mangle -A PREROUTING -p tcp --dport 25 -i eth1 -s ccc.ccc.ccc.214 -d ! ccc.ccc.ccc.192/27 -j MARK --set-mark 3

  4. #4
    tomiz
    Visitante

    Padrão Roteamento com base no protocolo ou porta

    Ao karfax:
    Obrigado pela sugestão de separar as máquinas. Irei usar uma alternativa como essa se não encontrar a solução usando uma única máquina.

    Ao TheMage
    Pelo que entendi das suas regras, esta máquina funciona apenas como gateway e ela "filtra" os pacotes que estão passando de acordo com o protocolo/porta.
    No meu caso, o tráfego que desejo separar, parte diretamente de aplicações instaladas neste linux, no caso o SQUID e o QMAIL. Este tráfego não passa pela chain PREROUTING da table mangle do iptables. Se eu estiver errado, alguém me corrija por favor.

    Grato.

  5. #5
    TheMage
    Visitante

    Padrão Roteamento com base no protocolo ou porta

    Ops,.. desculpe,.. acho que esqueci desdas duas,.. pois tenho uma parte que é parecida,.. !

    acho que com mais isso,.. vc faz o que vc precisa,.. !

    ## isso tmb é no firewall !
    iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK -o ! eth1 --set-mark 1
    iptables -A PREROUTING -t mangle -p tcp -s 192.168.22.0/24 -i eth2 --dport 80 -j MARK --set-mark 1

  6. #6
    Visitante

    Padrão Roteamento com base no protocolo ou porta

    Use o iptables ROUTE path-o-magic, apesar de estar em estado experimental, não tivemos nenhum problema em mais de dois meses de uso.

  7. #7
    tomiz
    Visitante

    Padrão Roteamento com base no protocolo ou porta

    Citação Postado originalmente por Anonymous
    Use o iptables ROUTE path-o-magic, apesar de estar em estado experimental, não tivemos nenhum problema em mais de dois meses de uso.
    Estou tentando usar o iptables ROUTE, mas ainda não obtive sucesso. Inclui a seguinte linha no meu script para que o tráfego de web saia pela interface ppp0 (velox):
    iptables -t mangle -A PREROUTING -p tcp --dport 80 -j ROUTE --oif ppp0
    Também acrescentei no final da linha o parâmetro --continue e não obtive êxito.
    Vale acrescentar que o tráfego está chegando pela eth0 e o gateway padrão é pela eth2.
    Grato por qualquer ajuda ou dica.

  8. #8
    tomiz
    Visitante

    Padrão Roteamento com base no protocolo ou porta

    A título de informação:
    Consegui fazer funcionar com o iptables (MARK) e iproute. A solução (smplificada) ficou assim:

    iptables -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 3
    ip rule add pref 31 fwmark 3 table 31
    ip rule add pref 31 from <ip do ppp0> table 31
    ip route add default dev ppp0 table 31

    echo 0 > /proc/sys/net/ipv4/conf/ppp0/rp_filter

    O default gateway está na eth1.

    Obrigado a todos que colaboraram.