Conexão recusada na conexão de internet compartilhada

2

A figura a seguir mostra a topologia da minha rede. Agora quero rotear todo o tráfego http de 10.8.0.15 via 10.8.0.42 para o mundo externo, usando o wlan0. Infelizmente, sou um noob quando se trata de iptables e roteamento. Alguém pode me apontar na direção certa?

Edit: Até agora eu executei os seguintes comandos em 10.8.0.15

sudo ip rule add fwmark 2 table 3
sudo ip route add default via 10.8.0.42 table 3
sudo ip route flush cache
sudo iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.8.0.15
sudo sysctl -w net.ipv4.conf.eth0.rp_filter=2
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 10.8.0.42

e o seguinte em 10.8.0.42

sudo iptables -I FORWARD -i eth0 -o wlan0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo sysctl -w net.ipv4.ip_forward=1

quando agora quero testar a conexão em 10.8.0.15, recebo o seguinte

curl http://freegeoip.net/json/
curl: (7) Failed to connect to freegeoip.net port 80: Connection refused

e um tcpdump em 10.8.0.42 mostra

sudo tcpdump -n -i eth0 -s 0 src or dst port 80
10:05:18.552329 IP 10.8.0.15.36186 > 10.8.0.42.80: Flags [S], seq 460236380, win 29200, options [mss 1308,sackOK,TS val 22927 ecr 0,nop,wscale 6], length 0
10:05:18.552612 IP 10.8.0.42.80 > 10.8.0.15.36186: Flags [R.], seq 0, ack 460236381, win 0, length 0
10:05:19.068397 IP 10.8.0.15.50052 > 10.8.0.42.80: Flags [S], seq 2824330189, win 29200, options [mss 1308,sackOK,TS val 22969 ecr 0,nop,wscale 6], length 0
10:05:19.068674 IP 10.8.0.42.80 > 10.8.0.15.50052: Flags [R.], seq 0, ack 2824330190, win 0, length 0

O propósito desta configuração é usar um cliente arbitrário dentro da rede como gateway de internet. Enquanto no diagrama existe apenas 10.8.0.42, existem potencialmente vários desses clientes, cada um com seu próprio acesso dedicado à Internet, que pode ser usado por outros clientes.

Atualização: Eu testei agora a seguinte configuração como sugerido abaixo.

box0:

sudo ip route add default via 10.8.0.42 dev tun0 table 3
sudo ip rule add fwmark 2 table 3
sudo ip route flush cache
sudo iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 2
sudo sysctl -w net.ipv4.conf.eth0.rp_filter=0
sudo iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 80 -j SNAT --to-source 10.8.0.15
sudo iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 443 -j SNAT --to-source 10.8.0.15

box1:

sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -A POSTROUTING -t nat -s 10.8.0.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.0.2
sudo iptables -A POSTROUTING -t nat -s 10.8.0.0/24 -p tcp --dport 443 -j SNAT --to-source 192.168.0.2

A saída tcpdump na caixa1 permanece a mesma:

12:24:05.788127 IP 10.8.0.15.45844 > 10.8.0.42.80: Flags [S], seq 4169666416, win 29200, options [mss 1308,sackOK,TS val 15420789 ecr 0,nop,wscale 6], length 0
12:24:05.788414 IP 10.8.0.42.80 > 10.8.0.15.45844: Flags [R.], seq 0, ack 4169666417, win 0, length 0
12:24:06.786406 IP 10.8.0.15.45844 > 10.8.0.42.80: Flags [S], seq 4169666416, win 29200, options [mss 1308,sackOK,TS val 15420889 ecr 0,nop,wscale 6], length 0
12:24:06.786694 IP 10.8.0.42.80 > 10.8.0.15.45844: Flags [R.], seq 0, ack 1, win 0, length 0
12:24:08.789821 IP 10.8.0.15.45844 > 10.8.0.42.80: Flags [S], seq 4169666416, win 29200, options [mss 1308,sackOK,TS val 15421089 ecr 0,nop,wscale 6], length 0
12:24:08.790111 IP 10.8.0.42.80 > 10.8.0.15.45844: Flags [R.], seq 0, ack 1, win 0, length 0

A saída do tcpdump na caixa 0:

11:26:14.220391 IP 10.8.0.15.33420 > 158.69.242.138.80: Flags [S], seq 2659446178, win 29200, options [mss 1460,sackOK,TS val 15433635 ecr 0,nop,wscale 6], length 0
11:26:14.308915 IP 10.8.0.42.80 > 10.8.0.15.33420: Flags [R.], seq 0, ack 2659446179, win 0, length 0
11:26:15.211761 IP 10.8.0.15.33420 > 158.69.242.138.80: Flags [S], seq 2659446178, win 29200, options [mss 1460,sackOK,TS val 15433735 ecr 0,nop,wscale 6], length 0
11:26:15.337652 IP 10.8.0.42.80 > 10.8.0.15.33420: Flags [R.], seq 0, ack 1, win 0, length 0

Eu acho que o principal problema é que o destino para os pacotes tcp é 10.8.0.42 quando chega na box1 em vez de qualquer que seja o IP da URL (aqui: 158.69.242.138) da solicitação http. Mas não consigo ver onde esse destino é alterado.

    
por Coxer 05.10.2016 / 14:41

2 respostas

1

Para mim, parece que você deseja que o host com a interface eth0 e wlan0 faça o SNAT no tráfego http com origem nos dispositivos na rede em que o eth0 está conectado.

Você pode fazer assim:

No host 10.8.0.15 , você configura 10.8.0.42 como o gateway padrão:

ip route add default via 10.8.0.42 dev eth0

No host 10.8.0.42 , você ativa o SNAT:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.0.2
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -p tcp --dport 443 -j SNAT --to-source 192.168.0.2

Isso habilita o NAT para as portas 80 e 443, isto é, http e https. Você pode adicionar mais portas. Se você quiser que o DNS seja resolvido pelo mesmo caminho, você precisa adicionar uma regra para ele, etc.

Se quiser obter todo o tráfego encaminhado através dessa interface, pode simplesmente utilizar:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 192.168.0.2

EDIT: informações adicionadas que refletem a pergunta atualizada:

Estas linhas da sua pergunta devem fazer com que os dispositivos do cliente direcionem o tráfego http / https para o outro gateway:

sudo ip rule add fwmark 2 table 3
sudo ip route add default via 10.8.0.42 table 3
sudo ip route flush cache
sudo iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2

EDIT: O roteamento no dispositivo cliente pode ser tratado com as instruções dadas nesta resposta: link

Basicamente é o mesmo que na sua pergunta, exceto pela última regra DNAT que não é necessária.

    
por 11.10.2016 / 23:05
0

A regra sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 10.8.0.42 redirecionará todo o tráfego HTTP para 10.8.0.42 (tem destino), não para 10.8.0.42 (roteamento para). Como você pode ver no tcpdump, o servidor 10.8.0.42 não aceita conexões na porta 80.

Você pode remover esta regra.

    
por 11.10.2016 / 21:46