Como encaminhar o tráfego através de diferentes interfaces com base no número da porta?

2
iptables -A PREROUTING -i usb0 -t mangle -p tcp --dport 8080 -j MARK --set-mark 1

iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

// roteia o tráfego com a marca 1 para a tabela myusb0

ip rule add fwmark 1 table myusb0

ip route ls

192.168.0.0/24 dev usb1  proto kernel  scope link  src 192.168.0.136  metric 1 
192.168.3.0/24 dev usb0  proto kernel  scope link  src 192.168.3.182  metric 1 

regra ip ls

0:  from all lookup local 
32762:  from all fwmark 0x1 lookup myusb0 
32763:  from 192.168.3.0/24 lookup myusb0 
32764:  from 192.168.0.1/24 lookup myusb1 
32766:  from all lookup main 
32767:  from all lookup default 

rota ip ls tabela myusb0

default via 192.168.3.2 dev usb0 

rota ip ls tabela myusb1

default via 192.168.0.1 dev usb1

// abre meias na porta 8080

ssh -f -N -D 0.0.0.0:8080 [email protected]

// verifique se funciona

curl --socks5 192.168.3.182:8080 ip.appspot.com

channel 1: open failed: administratively prohibited: open failed
curl: (7) Failed to receive SOCKS5 connect request ack.

Eu tenho duas conexões de Internet de dois ISPs diferentes e gostaria de abrir um proxy / socks5 em cada um deles. Eu pensei que faria sentido associar cada interface a um número de porta para que pudéssemos gerenciar as conexões.

Eu criei duas tabelas de roteamento ( myusb0 e myusb1 ) para cada dispositivo ( usb1 e usb0 ) e marquei o tráfego com base no número da porta (por exemplo, na porta 8080 I mark 1) e rotear o tráfego nessa marca para a tabela específica ( myusb0 ). Então eu tentei abrir um socks5 naquele IP e tentei localmente, mas por algumas razões ele não funciona.

Uma vez que o trabalho localmente, acho que devo abrir as meias de maneira inversa, para que eu possa disponibilizá-lo para o (s) servidor (es) remoto (s) que precisam usá-lo.

Alguma ideia do motivo pelo qual não está funcionando atualmente e como devo corrigi-lo? Por algumas razões eu acho que a conexão socks está tentando o gateway padrão da tabela principal que não está definida, em vez de seguir a regra da porta 8080 e tentar a tabela myusb0. Estou usando o Ubuntu (última versão).

Deve-se mencionar que ambos ISPs fornecem IPs dinâmicos

Editar

Como eu suspeitava, parece que o tráfego para a porta 8080 não está sendo roteado (esqueça o problema de meias), mas não sei por que

 curl portquiz.net:8080 
curl: (7) Couldn't connect to server
    
por JimmyCummings 13.11.2014 / 22:54

1 resposta

3

Na verdade, quando você faz:

$ ssh -f -N -D 0.0.0.0:8080 [email protected]
$ curl --socks5 192.168.3.182:8080 ip.appspot.com

Os seguintes eventos ocorrem:

  1. CURL abre uma conexão TCP de [YOUR-HOST]: [RANDOM-PORT] para o servidor SOCKS que o SSHD executa em 192.168.3.182:8080
  2. O SSHD aceita a conexão
  3. O CURL pede ao SSHD para abrir uma nova conexão de 192.168.3.182: [RANDOM-PORT] para ip.appspot.com:80
  4. O SSHD tenta abrir uma conexão TCP e falha
  5. O SSHD retorna uma mensagem de falha: "canal 1: falha na abertura: proibida administrativamente: falha na abertura"

O SSHD não pode abrir uma nova conexão porque os pacotes IP destinados a ip.appspot.com:80 estão sendo gerados na caixa do roteador - não sendo roteados por ele. Por causa disso, os pacotes não recebem a marca, o kernel pula as tabelas myusb0 e myusb1 e a ausência de uma entrada de rota correspondente em main table causa um erro rede inacessível . Se você quisesse gerenciar pacotes gerados localmente, a cadeia correta na tabela mangle seria OUTPUT em vez de PREROUTING .

Sobre o problema do teste de porta:

$ curl portquiz.net:8080 
curl: (7) Couldn't connect to server

Por favor, verifique a configuração do roteador:

  1. Existe um gateway padrão na tabela "principal"?

    $ ip route show
    
  2. O encaminhamento de pacotes está ativado?

    $ cat /proc/sys/net/ipv4/ip_forward
    
  3. Os pacotes estão sendo NAT?

    $ iptables -t nat -nvL
    # iptables -t nat -A POSTROUTING -o myusb0 -j MASQUERADE
    # iptables -t nat -A POSTROUTING -o myusb1 -j MASQUERADE
    
por 26.06.2015 / 13:17