Um túnel que transforma o tráfego UDP em tráfego FakeTCP/UDP/ICMP criptografado usando Raw Socket, ajuda a ignorar FireWalls UDP (ou ambiente UDP instável).
Quando usado sozinho, o udp2raw encapsula apenas o tráfego UDP. No entanto, se você usou udp2raw + qualquer VPN baseada em UDP juntos, você pode encapsular qualquer tráfego (incluindo TCP/UDP/ICMP), atualmente OpenVPN/L2TP/ShadowVPN e tinyfecVPN são suportados.
ou
wiki udp2raw
简体中文
Host Linux (incluindo Linux para desktop, telefone/tablet Android, roteador OpenWRT ou Raspberry PI) com conta root ou capacidade cap_net_raw.
Para usuários de Windows e MacOS, use udp2raw neste repositório.
Os cabeçalhos ICMP/FakeTCP ajudam a contornar o bloqueio de UDP, UDP QOS ou comportamento UDP NAT impróprio em alguns ISPs. No modo de cabeçalho ICMP, o udp2raw funciona como um túnel ICMP.
Cabeçalhos UDP também são suportados. No modo de cabeçalho UDP, ele se comporta como um túnel UDP normal e você pode apenas usar outros recursos (como criptografia, anti-replay ou estabilização de conexão).
No modo de cabeçalho FakeTCP, o udp2raw simula o handshake de 3 vias ao estabelecer uma conexão, simula seq e ack_seq durante a transferência de dados. Também simula algumas opções de TCP como: MSS
, sackOk
, TS
, TS_ack
, wscale
. Os firewalls considerarão o FakeTCP como uma conexão TCP, mas é essencialmente UDP: ele suporta entrega em tempo real/fora de ordem (assim como o UDP normal), sem controle de congestionamento ou retransmissão. Portanto, não haverá nenhum problema de TCP sobre TCP ao usar o OpenVPN.
Notas sobre criptografia
Falhas de conexão são detectadas por pulsações. Se o tempo limite expirar, o cliente alterará automaticamente o número da porta e se reconectará. Se a reconexão for bem-sucedida, a conexão anterior será recuperada e todas as conversas UDP existentes permanecerão válidas.
Por exemplo, se você usar udp2raw + OpenVPN, o OpenVPN não perderá a conexão após qualquer reconexão, mesmo se o cabo de rede for reconectado ou o ponto de acesso WiFi for alterado .
Multiplexação Um cliente pode lidar com múltiplas conexões UDP, todas compartilhando a mesma conexão bruta.
Vários clientes Um servidor pode ter vários clientes.
Suporte NAT Todos os 3 modos funcionam em ambientes NAT.
Suporte OpenVZ testado no BandwagonHost VPS.
Fácil de construir, sem dependências. Para compilar o udp2raw, tudo o que você precisa fazer é apenas baixar um conjunto de ferramentas, modificar o makefile para apontar para o conjunto de ferramentas, executar make cross
e tudo estará pronto. RaspberryPi, Android, alguns roteadores Openwrt já estão incluídos nas versões)
Bypass UDP QoS
Bypass UDP Blocking
Bypass OpenVPN TCP over TCP problem
OpenVPN over ICMP
UDP to ICMP tunnel
UDP to TCP tunnel
UDP over ICMP
UDP over TCP
Baixe a versão binária em https://github.com/wangyu-/udp2raw-tunnel/releases
Suponha que seu UDP esteja bloqueado ou com QOS ou apenas com suporte insuficiente. Suponha que o IP do seu servidor seja 44.55.66.77, você tem um serviço escutando na porta udp 7777.
# Run at server side:
./udp2raw_amd64 -s -l0.0.0.0:4096 -r 127.0.0.1:7777 -k " passwd " --raw-mode faketcp -a
# Run at client side
./udp2raw_amd64 -c -l0.0.0.0:3333 -r44.55.66.77:4096 -k " passwd " --raw-mode faketcp -a
(Os comandos acima precisam ser executados como root. Para melhor segurança, com algumas etapas extras, você pode executar udp2raw como não root. Verifique este link para mais informações)
Agora, um túnel bruto criptografado foi estabelecido entre o cliente e o servidor através da porta TCP 4096. Conectar-se à porta UDP 3333 no lado do cliente é equivalente a conectar-se à porta 7777 no lado do servidor. Nenhum tráfego UDP será exposto.
Para rodar no Android, verifique Android_Guide
-a
opção adiciona automaticamente uma regra de iptables (ou algumas regras de iptables) para você, udp2raw depende desta regra de iptables para funcionar de forma estável. Esteja ciente de que você não esquece -a
(é um erro comum). Se você não deseja que o udp2raw adicione a regra iptables automaticamente, você pode adicioná-la manualmente (dê uma olhada na opção -g
) e omitir -a
.
udp2raw-tunnel
git version:6e1df4b39f build date:Oct 24 2017 09:21:15
repository: https://github.com/wangyu-/udp2raw-tunnel
usage:
run as client : ./this_program -c -l local_listen_ip:local_port -r server_address:server_port [options]
run as server : ./this_program -s -l server_listen_ip:server_port -r remote_address:remote_port [options]
common options,these options must be same on both side:
--raw-mode <string> avaliable values:faketcp(default),udp,icmp
-k,--key <string> password to gen symetric key,default:"secret key"
--cipher-mode <string> avaliable values:aes128cbc(default),xor,none
--auth-mode <string> avaliable values:hmac_sha1,md5(default),crc32,simple,none
-a,--auto-rule auto add (and delete) iptables rule
-g,--gen-rule generate iptables rule then exit,so that you can copy and
add it manually.overrides -a
--disable-anti-replay disable anti-replay,not suggested
client options:
--source-ip <ip> force source-ip for raw socket
--source-port <port> force source-port for raw socket,tcp/udp only
this option disables port changing while re-connecting
other options:
--conf-file <string> read options from a configuration file instead of command line.
check example.conf in repo for format
--fifo <string> use a fifo(named pipe) for sending commands to the running program,
check readme.md in repository for supported commands.
--log-level <number> 0:never 1:fatal 2:error 3:warn
4:info (default) 5:debug 6:trace
--log-position enable file name,function name,line number in log
--disable-color disable log color
--disable-bpf disable the kernel space filter,most time its not necessary
unless you suspect there is a bug
--sock-buf <number> buf size for socket,>=10 and <=10240,unit:kbyte,default:1024
--force-sock-buf bypass system limitation while setting sock-buf
--seq-mode <number> seq increase mode for faketcp:
0:static header,do not increase seq and ack_seq
1:increase seq for every packet,simply ack last seq
2:increase seq randomly, about every 3 packets,simply ack last seq
3:simulate an almost real seq/ack procedure(default)
4:similiar to 3,but do not consider TCP Option Window_Scale,
maybe useful when firewall doesnt support TCP Option
--lower-level <string> send packets at OSI level 2, format:'if_name#dest_mac_adress'
ie:'eth0#00:23:45:67:89:b9'.or try '--lower-level auto' to obtain
the parameter automatically,specify it manually if 'auto' failed
--gen-add generate iptables rule and add it permanently,then exit.overrides -g
--keep-rule monitor iptables and auto re-add if necessary.implys -a
--clear clear any iptables rules added by this program.overrides everything
-h,--help print this help message
-a
e -g
Este programa envia pacotes via soquete bruto. No modo FakeTCP, o processamento de pacotes TCP do kernel Linux deve ser bloqueado por uma regra iptables em ambos os lados, caso contrário, o kernel enviará automaticamente RST para um pacote TCP não reconhecido e você sofrerá problemas de estabilidade/desempenho. Você pode usar a opção -a
para permitir que o programa adicione/exclua automaticamente a regra iptables ao iniciar/sair. Você também pode usar a opção -g
para gerar a regra iptables e adicioná-la manualmente.
--cipher-mode
e --auth-mode
Sugere-se usar aes128cbc
+ hmac_sha1
para obter segurança máxima. Se quiser executar o programa em um roteador, você pode tentar xor
+ simple
, que pode enganar a inspeção de pacotes por firewalls na maior parte do tempo, mas não pode protegê-lo de ataques sérios. O modo nenhum é apenas para fins de depuração. Não é recomendado definir o modo de criptografia ou o modo de autenticação como nenhum.
--seq-mode
O modo FakeTCP não se comporta 100% como uma conexão TCP real. Os ISPs podem distinguir o tráfego TCP simulado do tráfego TCP real (embora seja caro). O modo seq pode ajudá-lo a alterar ligeiramente o comportamento de aumento do seq. Se você tiver problemas de conexão, tente alterar o valor.
--lower-level
--lower-level
permite enviar pacotes no nível 2 do OSI (nível do link), para que você possa ignorar quaisquer regras locais do iptables. Se você tem regras complicadas de iptables que entram em conflito com udp2raw e você não pode (ou tem preguiça de) editar as regras de iptables, --lower-level
pode ser muito útil. Tente --lower-level auto
para detectar automaticamente os parâmetros, você pode especificá-lo manualmente se auto
falhar.
Formato manual if_name#dest_mac_adress
, ou seja: eth0#00:23:45:67:89:b9
.
--keep-rule
Monitore iptables e adicione novamente regras de iptables (para bloquear o processamento tcp do kernel), se necessário. Especialmente útil quando as regras de iptables podem ser limpas por outros programas (por exemplo, se você estiver usando openwrt, toda vez que você alterou e confirmou uma configuração, regra de iptables pode ser limpo e reconstruído).
--conf-file
Você também pode carregar opções de um arquivo de configuração para manter os segredos longe do comando ps
.
Por exemplo, reescreva as opções do exemplo server
acima (na seção Introdução) no arquivo de configuração:
server.conf
-s
# You can add comments like this
# Comments MUST occupy an entire line
# Or they will not work as expected
# Listen address
-l 0.0.0.0:4096
# Remote address
-r 127.0.0.1:7777
-a
-k passwd
--raw-mode faketcp
Preste atenção ao parâmetro -k
: No modo de linha de comando, as aspas ao redor da senha serão removidas pelo shell. Nos arquivos de configuração não removemos aspas.
Então inicie o servidor com
./udp2raw_amd64 --conf-file server.conf
--fifo
Use um fifo (pipe nomeado) para enviar comandos ao programa em execução. Por exemplo --fifo fifo.file
.
No lado do cliente, você pode usar echo reconnect >fifo.file
para forçar o cliente a se reconectar. Atualmente, nenhum comando foi implementado para o servidor.
iperf3 TCP via OpenVPN + udp2raw (o modo UDP iperf3 não é usado devido a um bug mencionado nesta edição: esnet/iperf#296. Em vez disso, empacotamos o tráfego TCP em UDP por OpenVPN para testar o desempenho. Leia o aplicativo para obter detalhes.
iperf3 -c 10.222.2.1 -P40
iperf3 -c 10.222.2.1 -P40 -R
raw_mode: faketcp cipher_mode: xor auth_mode: simples
(a velocidade reversa era semelhante e não carregada)
raw_mode: faketcp cipher_mode: aes128cbc auth_mode: md5
(a velocidade reversa era semelhante e não carregada)
Verifique o wiki para mais informações:
https://github.com/wangyu-/udp2raw-tunnel/wiki