Eu tenho uma interface autoescrita tun0 ( baseada em TUN/TAP ) que emite o que recebe.
Preciso que todo tráfego do sistema flua por essa interface.
O papel da interface é:
- Para descobrir os pacotes que provavelmente serão censurados e canalizá-los.
- Passe todos os outros tráfegos intocados.
Como você deve imaginar, estou tentando construir uma ferramenta anticensura.
A decisão sobre o tunelamento deve ser tomada dentro do processo tun0
porque somente lá podemos usar DNS confiáveis.
Preciso da sua ajuda para me mostrar como fazer todo o tráfego fluir por meio de uma interface autoescrita tun0. Se tun0 precisar de alterações, peço que forneça essas alterações.
Abaixo está como tentei fazer todo o tráfego passar pelo tun0 e falhei (falha nos pings).
Compilando
gcc tun0.c
sudo ./a.out
Configurando
sudo ip addr add 10.0.0.1/24 dev tun0
criar tabela João
$ cat /etc/iproute2/rt_tables # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 200 John
A ordem é importante:
sudo ip rule add from all lookup John
sudo ip route add default dev tun0 table John
sudo ip rule add iif tun0 lookup main priority 500
$ ip rule 0: from all lookup local 500: from all iif tun0 lookup main 32765: from all lookup John 32766: from all lookup main 35000: from all lookup default
Solução de problemas
sudo tcpdump -i wlp2s0 -qtln icmp
e entãoping -I tun0 8.8.8.8
não mostrar nenhum pacote capturado, significa que nenhum pacote foi transmitido de tun0 para wlp2s0 viaiif tun0 lookup main
regra.Quando substituí
tun0
porlo
todos os lugares, funcionou para mim.
Também tentei
- Desativando a filtragem de caminho reverso,
rp_filter=0
em/etc/sysctl.conf
Resposta Solução de problemas
iptables -I FORWARD -j LOG --log-prefix "filter/FORWARD "
iptables -t nat -I OUTPUT -j LOG --log-prefix "nat/OUTPUT "
iptables -t nat -I PREROUTING -j LOG --log-prefix "nat/PREROUTING "
iptables -t nat -I POSTROUTING -j LOG --log-prefix "nat/POSTROUTNG "
tail -f /var/log/syslog
As fontes modificadas da resposta também estão aqui .
Então, na sua configuração, todos os pacotes que você tenta enviar para a rede inicialmente se originam
10.0.0.1
(porque estão passando pelatun0
interface e seu endereço local é10.0.0.1
). Você captura os pacotes, está tudo bem até agora.Agora,
tun0
envia os pacotes ainda mais. O endereço de origem é10.0.0.1
e você deseja que os pacotes saiam por uma interface diferente (wlp2s0
no seu caso). Isso é roteamento , então vamos habilitar o roteamento primeiro:Depois disso, se você observar, poderá notar que os pacotes saem com o endereço de origem
tcpdump
e não com o endereço de origem da interface wlan (o que você esperaria, eu acho). Portanto, precisamos alterar o endereço de origem e é chamado source NAT . No Linux é fácil com a ajuda do netfilter/iptables :wlp2s0
10.0.0.1
Por favor, verifique também se sua
FORWARD
rede temACCEPT
política ou você precisa permitir o encaminhamento com algo como:Tudo deve funcionar agora: o kernel do linux faz o roteamento, está movendo os pacotes da
tun0
interface para o arquivowlp2s0
. O netfilter deve alterar o IP de origem para o endereço atribuído10.0.0.1
à suawlp2s0
interface para pacotes de saída. Ele memoriza todas as conexões e quando os pacotes de resposta voltam (se eles forem) ele muda o endereço de destino dawlp2s0
interface atribuída ao endereço10.0.0.1
(o recurso "conntrack").Bem, deveria, mas não. Parece que o netfilter se confunde com essa complicada configuração de roteamento e com o fato de que o mesmo pacote primeiro passa pela
OUTPUT
cadeia e depois é roteado e chega àPREROUTING
cadeia. Pelo menos na caixa Debian 8 não funciona.A melhor maneira de solucionar problemas do netfilter é o
TRACE
recurso:Eu só habilito o rastreamento de pacotes ICMP, você pode usar outro filtro para depurar.
Ele mostrará por quais tabelas e cadeias o pacote passa. E posso ver que o pacote não vai além da
FORWARD
cadeia (e não está sendo pego pelanat/POSTROUTING
cadeia que realmente fazSNAT
).Abaixo estão várias abordagens para fazer este trabalho.
ABORDAGEM Nº 1
A melhor maneira de desfazer a confusão do netfilter é alterar o endereço IP de origem dos pacotes no
tun0.c
aplicativo. É também a forma mais natural. Precisamos alterar 10.0.0.1 para 10.0.0.2 na ida e 10.0.0.2 para 10.0.0.1 na volta.Modifiquei
tun0.c
com o código de alteração do endereço de origem. Aqui está o novo arquivo e aqui está o patchfile para o seu arquivotun0.c
. Mudanças no cabeçalho IP também envolvem correção de soma de verificação , então peguei algum código do projeto OpenVPN . Aqui está a lista completa de comandos que executo após uma reinicialização e inicialização limpastun0_changeip.c
:Observe que você não precisa desativar a filtragem de caminho reverso nesse caso, porque tudo é legal -
tun0
apenas recebe e envia pacotes que pertencem à sua sub-rede. Além disso, você pode fazer um roteamento baseado em origem em vez de baseado em interface.ABORDAGEM Nº 2
É possível fazer antes da interface
SNAT
de alcance do pacote .tun0
Não é muito correto embora. Definitivamente, você precisará desativar a filtragem de caminho reverso neste caso:Agora, faça
SNAT
: iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT --to-source ip.address.of.your.wlan.interfaceAqui, alteramos o endereço de origem pouco antes de os pacotes chegarem ao
tun0
dispositivo.tun0.c
o código reenvia esses pacotes "como estão" (com o endereço de origem alterado) e eles são roteados com sucesso pela interface wlan. Mas você pode ter um IP dinâmico na interface wlan e deseja usarMASQUERADE
(para não especificar explicitamente o endereço da interface). Aqui está como você pode usarMASQUERADE
:Observe o
10.0.55.1
endereço IP " " - é diferente. Você pode usar qualquer IP aqui, não importa. Os pacotes alcançamnat/POSTROUTING
a cadeia nawlp2s0
interface se alterarmos o IP de origem antes. E agora não depende de um IP estático para interface wlan.ABORDAGEM Nº 3
Você também pode usar
fwmark
. Dessa forma, você não precisaSNAT
, mas capturará apenas os pacotes de saída:Primeiro, precisamos desabilitar a filtragem de caminho reverso
tun0
porque ela encaminhará pacotes que pertencem a outra rede:Esse é outro "hack" para roteamento e netfilter que funciona na minha caixa Debian 8, mas ainda assim recomendo a primeira abordagem, pois é mais natural e não usa nenhum hack.
Você também pode considerar construir seu aplicativo como um proxy transparente . Acho que seria muito mais fácil em vez de analisar pacotes do dispositivo tun.