route na interface específica baseada na porta

0

Eu tenho um aplicativo php / bash na parte superior de uma máquina Linux com uma interface física conectada a, por exemplo, o servidor de saída 123.123.123.123: 80. Eu faço isso através de vários provedores openvpn. Eu tenho os provedores tun e tap, mas meu provedor favorito usa tun.

Na verdade, sou perfeitamente capaz de fazer a série:

  1. abre a vpn
  2. sudo route add 123.123.123.123 tun0
  3. envia tráfego para 123.123.123.123: 80
  4. feche a vpn
  5. sudo route del 123.123.123.123

Eu uso a opção "route-nopull" dentro do arquivo de configuração .ovpn para manter a máquina Linux acessível e permitir conexões openvpn simultâneas.

Agora preciso abrir várias solicitações independentes, sempre para o servidor de saída 123.123.123.123: 80. Mas meu fluxo real é serial e preciso esperar que a primeira conexão seja fechada e limpa antes de tentar uma segunda conexão.

Tenho certeza de que posso alcançá-lo mutilando com "portas falsas". Por exemplo:

  • interfaces tun0, tun1, tun2
  • portas falsas 9000, 9001, 9002
  • várias tabelas de roteamento rt0, rt1, rt2

Então, conceitualmente falando:

  • 123.123.123.123:9000 - > marca para rt0 (tun0 é o gateway padrão) - > reescreva como 123.123.123.123:80 - > rt0
  • 123.123.123.123:9001 - > marca para rt1 (tun1 é o gateway padrão) - > reescreva como 123.123.123.123:80 - > rt1
  • 123.123.123.123:9002 - > marca para rt2 (tun2 é o gateway padrão) - > reescreva como 123.123.123.123:80 - > rt2

Eu só posso representar o conceito porque quase não tenho habilidades no iptables. Se você tem diferentes maneiras de alcançar o resultado, eles são bem-vindos. Obrigado por ler e ajudar.

    
por fab 28.10.2015 / 10:21

1 resposta

0

Eu resolvi e documentei aqui: link

Isso fará com que o kernel rotule permanentemente os pacotes, habilite várias rotas e até mesmo redes não atestadas na máquina:

nano /etc/sysctl.conf

net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >| $f ; done

Isto irá inicializar o iptables e, em particular, mangle e nat, que são necessários para marcar o tráfego:

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

adicione a edição de rotas alternativas:

nano /etc/iproute2/rt_tables

Adicionar (nomes são suas referências):

1 tunnel0
2 tunnel1

adicione rotas e regras, usamos IDs de tabelas em vez de nomes mais imediatos. Como você pode notar, o gateway é irrelevante, especialmente para túneis que podem ter gateways dinâmicos:

ip route add 0.0.0.0/0 dev tun0 table 1
ip route add 0.0.0.0/0 dev tun1 table 2

adicione regras para marcar o tráfego e vincular-se à tabela correspondente:

ip rule add from all fwmark 1 table 1
ip rule add from all fwmark 2 table 2
ip route flush cache

verifique se você gosta:

ip route show table 1
ip route show table 2
ip rule show

Se você perder alguma coisa, pode excluir desta forma:

ip rule del table 1
ip route flush table 1

AGORA A PARTE AUSENTE: ISSO NÃO VAI TRABALHAR:

iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1

ESTE VAI:

iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables-save

Você precisa selecionar tráfego e enviá-lo simultaneamente em um dispositivo / túnel? Não tem problema, eu resolvi isso também:

iptables -A OUTPUT -t mangle -p tcp --dport 10001 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p tcp --dport 10002 -j MARK --set-mark 2
iptables -t nat -A OUTPUT -p tcp --dport 10001 -j DNAT --to :80
iptables -t nat -A OUTPUT -p tcp --dport 10002 -j DNAT --to :80

NAT obrigatório para resposta

iptables -t nat -A POSTROUTING -o $DEV1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $DEV2 -j MASQUERADE

iptables-save
    
por 07.11.2015 / 18:36