PySkyWiFi: criando Wi‑Fi gratuito e lento em voos de longa distância
(robertheaton.com)- O PySkyWiFi é um experimento que usa campos de perfil de uma conta de milhagem aérea acessíveis mesmo antes do pagamento como armazenamento temporário, para fazer requisições e respostas HTTP irem e voltarem de forma extremamente lenta durante voos longos
- O protótipo inicial criava um chat atualizando e consultando o campo de nome da conta, e depois foi expandido para um modelo em que um daemon em solo lia pedidos como
STOCKPRICE: APPLe devolvia o resultado - A arquitetura final é dividida entre um sky proxy dentro do avião e um ground daemon conectado à internet, passando a URL de destino pelo cabeçalho
X-PySkyWiFiem requisições locais decurl - A transmissão divide as requisições HTTP em pequenos chunks e usa segmentos
DATA,ACKeEND, além de números de sequência de 6 dígitos, para manter a ordem - O autor evitou continuar enviando requisições automáticas para contas reais de companhias aéreas, e o teste final ficou no nível de chamar a página inicial do blog com
curlvia GitHub Gist e receber a resposta HTML alguns minutos depois
Um caminho alternativo descoberto no portal de Wi‑Fi antes do pagamento
- A página de login do Wi‑Fi do avião exigia pagamento, mas ainda permitia gratuitamente o login na conta de milhagem aérea antes do pagamento
- Ao ver o campo de nome na tela de edição de perfil, surgiu a ideia de usá-lo como um pequeno canal de comunicação com o mundo externo
- A linguagem pensada no início era Go, mas Python foi escolhido porque assim a ferramenta poderia se chamar PySkyWiFi
- O código-fonte foi publicado em PySkyWiFi
Protótipo 1: mensagens instantâneas com o campo de nome
- Dois clientes faziam login na mesma conta de milhagem aérea e trocavam mensagens atualizando e lendo alternadamente o campo de nome
- Um lado mudava o nome para
Hello how are you, e o outro lia isso - Depois mudava para
Im fine how are you, e o primeiro lado confirmava a resposta
- Um lado mudava o nome para
- Como mudar o nome manualmente pela UI era trabalhoso, isso foi automatizado com uma ferramenta de linha de comando
- A ferramenta fazia login no site e atualizava o campo de nome da conta de teste com a mensagem
- A cada poucos segundos, consultava o campo de nome e, quando o valor mudava, exibia isso como resposta da outra ponta
- Decidiu-se não enviar mais dados automáticos para contas reais de milhagem aérea, e apenas foi verificado se cerca de 10 atualizações rápidas do nome funcionavam com sucesso
- Esse resultado sugere que a conta talvez não aplicasse limitação de taxa ou de quantidade de requisições
- Depois disso, o desenvolvimento continuou reproduzindo o mesmo princípio com GitHub Gists e arquivos locais
- porque isso tornava o ciclo de desenvolvimento mais rápido e fácil do que usar uma conta de milhagem aérea
Protótipo 2: buscando informações externas com um daemon em solo
- Na etapa seguinte, um daemon era executado em um computador com internet em solo ou na nuvem
- O daemon consultava continuamente o campo de nome da conta de milhagem aérea em busca de requisições estruturadas enviadas do avião
- Exemplo:
STOCKPRICE: APPL - Exemplo:
SCORE: MANUNITED
- Exemplo:
- Ao detectar uma nova requisição, o daemon a interpretava, buscava as informações em APIs relevantes e as devolvia para o avião pela mesma conta de milhagem aérea
- A partir desse ponto, deixava de ser apenas um chat simples e passava a permitir consulta de informações em tempo real, como preços de ações ou placares esportivos
A arquitetura completa com sky proxy e ground daemon
- O PySkyWiFi é um protocolo semelhante ao TCP/IP que empurra uma requisição HTTP inteira para dentro de uma conta de milhagem aérea, faz um computador em solo executar a requisição HTTP real e então envia a resposta de volta da mesma maneira
- Há dois componentes
- sky proxy: proxy executado no notebook dentro do avião
- ground daemon: daemon executado em casa ou em um computador na nuvem com acesso à internet
- Antes do uso, primeiro inicia-se o daemon em solo; depois, já conectado ao Wi‑Fi do voo, inicia-se o sky proxy no notebook
- O usuário envia uma requisição HTTP ao proxy local usando ferramentas como
curl- Exemplo:
curl localhost:1234 -H "X-PySkyWiFi: example.com" - A URL de destino real é colocada no cabeçalho customizado
X-PySkyWiFi
- Exemplo:
- O ground daemon remove o cabeçalho
X-PySkyWiFie o usa para rotear a requisição ao site de destino- O corpo da requisição e os demais cabeçalhos são encaminhados como estão
- Quando tudo termina, recebe-se uma resposta HTTP como numa requisição comum à internet, mas dependendo do estado da rede da aeronave a requisição pode ficar parada por vários minutos e a velocidade pode cair para poucos bytes por segundo
Chunks, ACKs e uma segunda conta para o tráfego HTTP de ida e volta
- O sky proxy recebe a requisição do
curle divide a requisição HTTP inteira em chunks- porque a quantidade que cabe de uma vez no campo de nome da conta de milhagem aérea é pequena
- Cada chunk é gravado em sequência no campo de nome da primeira conta de milhagem aérea
- O ground daemon consulta a conta e, ao encontrar um novo chunk, lê o conteúdo e deixa uma confirmação de recebimento dizendo que o próximo chunk já pode ser enviado
- Quando a requisição HTTP completa é remontada, o ground daemon envia a requisição real para a internet
- A resposta HTTP passa pelo mesmo processo no sentido inverso
- o ground daemon divide a resposta em chunks e os envia
- para simplificar a implementação, os chunks da resposta usam uma segunda conta de milhagem aérea
- o sky proxy lê os chunks, recompõe a resposta HTTP e a devolve à chamada original do
curl
Separando os papéis da camada de transporte e da camada de rede
- A lógica de comunicação do PySkyWiFi é dividida entre camada de transporte e camada de rede
- A camada de transporte decide quais dados enviar e em que ordem
- como dividir mensagens longas em chunks menores
- como sinalizar que o receptor está pronto para receber o próximo chunk
- um papel vagamente parecido com o do TCP
- A camada de rede realmente escreve e lê no meio de armazenamento definido pela camada de transporte
- esse meio pode ser uma conta de milhagem aérea, um arquivo local ou um perfil do Discord
- Essa separação facilita conectar novas plataformas de milhagem de companhias aéreas
- basta implementar uma nova camada de rede, enquanto a camada de transporte permanece a mesma
- uma camada de rede de teste pode ler e escrever em arquivos locais no lugar da conta de milhagem aérea
Regras de transporte com DATA, ACK e END
- A conexão de transporte do PySkyWiFi é composta por dois pipes
- cada cliente tem um pipe SEND para escrita e um pipe RECV para leitura
- uma conta de milhagem aérea pode ser usada como pipe
- Em um dado momento, um cliente PSWF só pode estar enviando ou recebendo
- no modo de envio, ele não consegue ver os dados enviados pela outra ponta
- no modo de recebimento, mesmo que envie dados, a outra ponta não consegue vê-los
- não é um esquema de envio e recebimento bidirecional a qualquer momento como no TCP
- Mensagens longas são transmitidas com segmentos
DATA,ACKeENDDATA: composto pela letraD, um número de sequência com 6 dígitos preenchidos e os dados reais do chunk- Exemplo:
D000451adline": "Mudslide in Wigan causes m ACK: composto pela letraAe o número de sequência de 6 dígitos que está sendo confirmado- Exemplo:
A000451 END: uma única letraEindicando o fim da mensagem
- O transmissor envia um
DATAe então espera receber oACKcorrespondente àquele número de sequência- ao receber
A000451, entende que o chunk000451foi processado e envia o chunk000452
- ao receber
- Quando o receptor vê
END, trata a mensagem como encerrada e transmissor e receptor trocam de papel
Interface de implementação da camada de rede
- A camada de rede fornece uma interface simples para escrever e ler dados no meio de armazenamento
- Há duas operações obrigatórias
send(msg: str): gravamsgno armazenamentorecv() -> str: lê uma mensagem do armazenamento
- Na implementação baseada em milhagem aérea, essas duas operações se tornam escrever e ler o campo de nome da conta
- Também há dois atributos obrigatórios
sleep_for: tempo, em segundos, que a camada de transporte deve esperar entre uma consulta e outra ao pipe RECVsegment_data_size: número de caracteres que cabem em um segmento
sleep_forpode ser baixo em implementações de teste com arquivos, por exemplo, mas na implementação com conta de milhagem aérea ele deve ser de pelo menos alguns segundos para evitar requisições demais ao servidor remotosegment_data_sizedeve ser igual ao tamanho máximo do campo usado na conta de milhagem aérea; no exemplo, algo em torno de 20 caracteres- Há dois hooks opcionais
connect_send(): chamado ao inicializar o pipe SEND; na implementação com milhagem aérea, pode ser usado para fazer login com usuário e senha e obter cookiesconnect_recv(): chamado ao inicializar o pipe RECV
Codificação base26 e ideias para melhorar a largura de banda
- O formulário HTML da milhagem aérea pode não aceitar caracteres que não sejam alfabéticos no nome
Stephenpode ser aceitoGET /data?id=5pode ser rejeitado
- Para evitar isso, a camada de rede pode codificar os segmentos em base26 antes de gravá-los na conta de milhagem aérea
- base26 representa a string usando apenas letras de
AaZ - a string de bytes é convertida em um número grande e então representada como se fosse um número em base 26 usando caracteres de
AaZ - Exemplo:
b26_encode("Hello world")retornaCZEZINADXFFTZEIDPKM
- base26 representa a string usando apenas letras de
- A camada de transporte não precisa saber dessa codificação
- a camada de rede converte os bytes para base26 ao gravar e os restaura ao ler
- A base26 alonga bastante as strings e reduz a largura de banda
- usar base52 com maiúsculas e minúsculas poderia encurtar isso, mas foi deixado como melhoria para a versão 2
- A largura de banda pode aumentar ampliando o tamanho do segmento
- mesmo que um campo armazene só 20 caracteres, se 5 campos de 20 caracteres forem usados ao mesmo tempo, um segmento de 100 caracteres pode ser enviado em uma única requisição
- o receptor pode ler os 5 campos em uma única requisição e concatená-los novamente
Espaço para melhorias com HTTP CONNECT e o teste final
- Em vez de trocar requisições HTTP manualmente, o PySkyWiFi poderia criar um túnel melhor usando HTTP CONNECT requests
CONNECTé o método usado pela maioria dos proxies HTTP, e com isso o PySkyWiFi poderia funcionar como um proxy em nível de sistema e até lidar com requisições de navegador- Com
CONNECT, o PySkyWiFi negociaria diretamente uma conexão TLS com o site de destino, então o tráfego que passasse pela conta de milhagem aérea ficaria criptografado - A desvantagem é que isso exigiria muito mais trabalho de implementação
- No teste final, os dados foram tunelados via GitHub Gist e a página inicial do blog foi carregada com
curl, recebendo uma resposta HTML alguns minutos depois
1 comentários
Opiniões no Hacker News
Décadas atrás, minha esposa usava mensagens de texto do Google Voice lendo e respondendo diretamente pela caixa de entrada do Gmail, e, como detestava celulares, carregava um antigo Kindle Keyboard com 3G ilimitado
O navegador simples do Kindle conseguia abrir a interface leve do Gmail, então dava para usá-lo como um aparelho de SMS sem mensalidade; o único problema eram as notificações de novas mensagens
Então, depois de fazer jailbreak, eu estava tentando colocar um contador na tela inicial, quando me ocorreu que bastaria pôr o contador ao lado do nome do dispositivo Kindle, que podia ser alterado na conta da Amazon
No meu servidor doméstico, usei automação de navegador para fazer login na Amazon e alterar o nome do dispositivo para
My Kindle (x), em que x era a quantidade de mensagens não lidas do Google Voice; o Kindle atualizava o nome na tela inicial em menos de um minuto, e isso funcionou bem por anosLembro que economizar apenas alguns bytes já representava algo como um milhão de dólares em redução de custos
Na época, provavelmente era um dos Kindles funcionais mais antigos, então o ladrão deve ter simplesmente pegado o que estava dentro da bolsa
Depois encontrei outro Kindle Keyboard por 20 dólares em um mercado de pulgas, mas a bateria morreu seis meses depois; ainda tenho o aparelho, então fico curioso quanto custaria uma bateria de reposição
Dava para usar o Gmail com muito esforço pelo navegador, e eu também criei um site de Zork amigável ao Kindle, onde era possível escolher entre várias ROMs de zmachine e jogar jogos de texto
Ele chegou a ter alguma repercussão depois de aparecer em alguns sites de notícias
Não tinha a integração esperta de mudar o nome do Kindle, mas por um tempo enviei mensagens de texto usando um Keyboard Kindle com 3G ilimitado
Dava para rodar o site do Google Maps, mal e porcamente
Certa vez peguei uma balsa de cerca de 20 horas da Itália para a Grécia; havia Wi-Fi pago baseado em internet via satélite, mas eu não queria pagar
O acesso ao Stripe estava liberado para pagamento e, como descobri, dava para acessar todas as páginas de stripe.com, incluindo a documentação de desenvolvimento, então comecei a desperdiçar largura de banda baixando imagens repetidamente
Aí lembrei que, para o Stripe funcionar, era preciso acesso ao CDN Fastly, e que o Reddit também usava Fastly; então me conectei ao Stripe e mudei o cabeçalho HTTP
Hostparareddit.com, e consegui ver o RedditAs imagens não funcionavam porque
i.redd.itnão era Fastly, mas, ao apontarold.reddit.compara o IP Fastly do Stripe em/etc/hostse ignorar erros assustadores de TLS, até consegui fazer loginSe a conexão ficar lenta e eles decidirem nunca mais comprar, a empresa provedora também é prejudicada, e isso também pode aumentar os custos de upload do Stripe
Eu tendo a evitar downloads até no celular para não afetar negativamente as pessoas ao meu redor
Entendo o experimento intelectual de explorar até onde dá para acessar em uma conexão bloqueada, mas desperdiçar largura de banda de propósito é parecido com abrir a torneira de um banheiro público para jogar água fora ou entupir o vaso até transbordar
https://en.wikipedia.org/wiki/Domain_fronting
Algumas semanas atrás, levei meus filhos a uma aula em um shopping e tentei usar o Wi-Fi grátis; o login no notebook funcionou, mas aparecia que não havia internet
Ao verificar o gateway padrão, vi que ele apontava para um modem Cisco; dava para ver ferramentas de diagnóstico e a lista de dispositivos conectados, mas a conexão com a internet estava desligada
Pesquisei o modelo pelo celular e dizia que a conta de administrador era o número de série e a senha ficava em branco; também havia um padrão de exemplo, e o nome de um dos dispositivos conectados parecia exatamente esse padrão
Fiz login assim mesmo, liguei o botão de internet, e 15 segundos depois ficou verde; também defini uma nova senha para o dispositivo
A VPN não conectava, então, como era fácil acessar o roteador, alterei a configuração de MTU, e ela passou a funcionar imediatamente
Esse tipo de hacking é legal e eu gosto dele no sentido original da palavra
Dito isso, em uma verificação recente, parece que no skywifi o DNS global resolve normalmente mesmo sem pagamento, e no voo em que eu estava acho que um túnel iodine comum também teria funcionado
https://github.com/yarrick/iodine
Para evitar denúncias de abuso, fazia o tráfego externo do servidor passar pelo Tor, também coletava logs de em quais redes de trens, hotéis e aeroportos ele funcionava, e oferecia outros protocolos de tunelamento
Foi um projeto divertido por um tempo; eu deveria tê-lo deixado rodando
Hoje em dia, o tunelamento por DNS ficou um pouco mais difícil porque alguns servidores DNS, especialmente os do Google, randomizam maiúsculas e minúsculas nas requisições DNS, o que quebra bastante certos encodings
A ideia e os princípios são interessantes, mas, por causa da velocidade, na prática é quase inútil — talvez desse para rodar algo como um mensageiro sobre UDP, mas só isso ;-)
“Esqueci de carregar os fones de ouvido e Limp Bizkit começou a tocar pelos alto-falantes do notebook. Felizmente, as outras pessoas no avião não pareceram se importar, então todo mundo curtiu junto.”
Pessoas assim carecem de etiqueta básica em público
Muita gente ao redor com certeza se incomodou, mas é bem provável que fossem pessoas educadas demais para dizer para não impor barulho inútil aos outros
Há tanta gente sem essa etiqueta básica que achei uma piada engraçada, e pelo menos não acho que o autor seja realmente uma pessoa assim
Ela mostra a imagem do hacker que vê a possibilidade de internet grátis como uma oportunidade executável e, depois, cria uma distância ao sugerir que não é alguém que de fato abusaria dos sistemas da companhia aérea, então o tom inicial parece um recurso estilístico
Caso contrário, seria uma atitude extremamente rude e insensível
Fico me perguntando se sou o único que fica sempre tão cansado ao entrar num avião que não consegue fazer nada além de fechar os olhos e esperar até o fim
Só de pensar em tirar o notebook ou um livro já fico exausto, há muito ruído, e, sem fones com cancelamento de ruído, é difícil me concentrar
Já passei pelo menos 2 horas desde que saí de casa, pegando trem, bonde e passando pela segurança, e a comida nada saudável do aeroporto também não ajuda
Em metade do ano, o clima também está quente ou frio demais, e a mochila de 10 kg me faz suar o tempo todo, então no fim não sobra ânimo para fazer nada dentro do avião
É contraintuitivo, mas ouvi dizer que muitos cérebros com TDAH funcionam assim, e o tempo que passo no avião é o mais produtivo
Ou você precisa apoiá-lo no colo, ou, se a pessoa da frente reclinar o assento, há risco de a tela quebrar — isso aconteceu de verdade com um colega alguns anos atrás
Hoje em dia, simplesmente pego o iPad e os fones com cancelamento de ruído e assisto a filmes ou séries de TV
Meu corpo reage exatamente igual, e acho que tem a ver com a redução da quantidade de oxigênio no ar
Não é uma questão de ruído, é uma questão do ar; e fones com cancelamento de ruído funcionam muito bem
Mas também há pessoas que não são afetadas em nada e fazem coisas úteis no avião
Por mais cansado que eu esteja ou por menos que tenha dormido, no avião não consigo pegar no sono nem fico cansado, então voos transatlânticos são ainda mais sofridos, e quando quem viaja comigo dorme por 8 horas parece até que estão zombando de mim
Durante o voo minha cabeça fica muito grogue, então fico de olhos fechados até o pouso; quando tento ler um livro ou trabalhar, depois de 5 a 10 minutos meu cérebro desliga
Curiosamente, a refeição de bordo sempre me causa inchaço abdominal, então preciso de remédio logo depois de pousar
O interessante é que, nas duas vezes em que voei de classe executiva, consegui ler um pouco antes de o cérebro desligar
Em trens de longa distância, se eu estiver sentado no sentido do movimento, é de fato mais fácil trabalhar, mas, se o trem estiver bem cheio, meu cérebro desliga de novo
A história de enviar cotações de ações, placares de jogos e clima me lembrou os recursos que o Google oferecia antigamente como serviço de mensagens de texto
Usei muito antes de comprar meu primeiro smartphone, e, se você enviasse
W[ZIP code]para 46645(GOOGL), ele respondia por SMS com a previsão do tempostock:[symbol]também funcionava, e havia vários outros recursos dos quais já me esqueciClaro que o Google encerrou o serviço, mas, enquanto durou, era bem legal
A estrutura era: você enviava algumas linhas da letra por SMS DM, que o Twitter suportava na época, ele pesquisava
" lyrics"no Google, analisava os resultados e devolvia por SMS o artista e o títuloNão funcionava tão bem, mas eu tinha bastante orgulho dele
Graças a isso, posso fazer perguntas ao ChatGPT de qualquer lugar do planeta usando um comunicador via satélite portátil inReach Mini 2, e é bem legal poder perguntar algo até no meio do Death Valley
Levava bastante tempo para digitar os termos de busca do Google, e os resultados podiam demorar 1 ou 2 minutos para chegar, mas era melhor do que nada
Eu o usava principalmente para pesquisar o endereço de lugares aonde queria ir e digitá-lo no TomTom; os tempos mudaram muito
Por volta de 1995, quando eu trabalhava em uma empresa de pesquisa em telecomunicações, subsidiária da Ericsson, tive uma ideia assim, e o principal exemplo era atualizações de status de voos
Como ninguém imaginava que mensagens P2P, em que era preciso apertar várias vezes para digitar uma letra no teclado numérico, seriam tão populares, no contexto de aumento de dados na web inicial, serviços de informação pareciam o melhor uso
O Teletext ainda existia, e também havia um projeto separado para extrair dados dele
Mas é interessante pensar no que nós, que tínhamos acesso a SMS, e o público em geral acabamos usando de fato
É interessante que o autor tenha chegado bem perto de um TCP sobre um campo abstrato de edição compartilhada
Isso, por si só, poderia ser uma ferramenta muito legal
Dá para imaginar um proxy em que você só projeta em alto nível como ler e escrever em um recurso compartilhado dos dois lados, e ele cuida de todo o resto e o expõe como um proxy SOCKS
No fim, Wi-Fi gratuito virou padrão e isso deixou de ser grande coisa; agora a disputa passou para o Wi-Fi gratuito a bordo
No fim, o Wi-Fi a bordo também será gratuito em todos os lugares, e várias companhias aéreas já fazem isso
Só funcionaria para texto, não para imagens ou vídeos, mas teria sido suficiente para navegação web comum
Alguns anos atrás, o reitor da nossa universidade disse algo como “os jogos estão afetando a frequência às aulas” e decidiu bloquear a rede LAN depois das 22h
A implementação consistia em bloquear todo o tráfego de ida e volta por endereço IP, mas não bloqueava o TCP em si e também tinha se esquecido completamente do IPv6, que na época já nem era tão novidade assim
Então criei um app simples de chat P2P que funcionava via IPv6, e o único problema era fazer meus amigos compartilharem seus endereços IPv6 e mantê-los nos contatos
Funcionou bem, mas depois descobri que era muito mais fácil fazer tunelamento para um computador fora da rede
Acho que este é um exemplo quase perfeito que lembra o texto sobre escrever mais software inútil e a discussão subsequente no HN
Muda a vida de alguém? Provavelmente não
O processo de criar e explorar foi divertido? Quase certamente
Deveríamos fazer mais coisas assim
https://ntietz.com/blog/write-more-useless-software/
https://news.ycombinator.com/item?id=37911900