Como o Spotify pode ajudar a aprender demônios, RFCs, redes e promoção de código aberto. Ou o que acontece se você não puder pagar, e alguns bolos premium realmente querem.
Iniciar
No terceiro dia, percebeu-se que o Spotify distribui anúncios com base no país do endereço IP. Também foi observado que em alguns países a publicidade não foi veiculada. Por exemplo, na Bielorrússia . E, em seguida, venceu um plano "brilhante" para desativar anúncios em uma conta não premium.
Um pouco sobre o Spotify
De um modo geral, o Spotifay tem uma política estranha. Nosso irmão precisa ser bastante pervertido para comprar um prêmio: mude a localização no perfil para outro no exterior, procure um cartão GIF adequado que só possa ser pago com paypal, que recentemente foi estranho e quer vários documentos. Em geral, também é uma aventura, mas de uma ordem diferente. Embora a maior parte disso seja para a versão móvel, não estou interessado nela. Portanto, todos os itens a seguir ajudarão apenas no caso da versão para desktop. Além disso, não haverá expansão de funções. Apenas cortando parte do excesso.
Por que tão complicado?
E assim pensei, registrando os dados do proxy socks na configuração do Spotify. O problema acabou sendo que sua autenticação em meias por login e senha não funciona. Além disso, os desenvolvedores alteram regularmente algo em torno do proxy: permitir ou desativar e depois quebrá-lo, o que dá origem a painéis inteiros de discussões fora do local.
Foi decidido não confiar em funções instáveis e encontrar algo mais confiável e curioso.
Em algum lugar aqui, o leitor deve perguntar: por que não pegar ssh
com a -D
e lidar com o fim? E, em geral, ele estará certo. Mas, primeiro, ele ainda precisa ser demonizado e fazer amizade com autossh, para não pensar em romper conexões. E segundo: é muito simples e chato.
Em ordem
Como sempre, vamos da esquerda para a direita, de cima para baixo e descrevemos tudo o que precisamos para implementar nossa idéia "simples".
Primeiro você precisa de um proxy
E muitas alternativas ao mesmo tempo:
- você pode simplesmente obtê-lo em proxylists abertos. Barato (ou melhor, por nada), mas absolutamente não confiável e a vida útil desses proxies tende a zero. Portanto, seria necessário encontrar / escrever um analisador de proxy das listas, filtrá-los pelo tipo e país desejados, e a questão de substituir o proxy encontrado no Spotify permanece aberta (bem, a menos que, através de
HTTP_PROXY
transmita e invólucro personalizado para o binário, para que todo o restante do tráfego não seja enviado para lá ) - Você pode comprar um proxy semelhante e evitar a maioria dos problemas descritos acima. Mas a um preço de proxy, você pode comprar imediatamente um prêmio no Spotify, e isso não é um esporte como parte da tarefa inicial.
- Levante a sua. Como você provavelmente adivinhou, esta é a nossa escolha.
Por mero acaso, pode acontecer que você tenha um amigo com um servidor na Bielorrússia ou em outro país pequeno. Você precisa usar isso e implantar o proxy desejado nele. Especialistas especiais podem ficar satisfeitos com um amigo com uma rota para DD-WRT ou software similar. Mas lá seu próprio mundo maravilhoso e esse mundo obviamente não se encaixam no quadro dessa história.
Portanto, nossas opções: Squid - não inspirador, e eu não quero um proxy HTTP, esse protocolo tem muitos por aí. E no campo das MEIAS nada sensato, exceto Dante , foi entregue ainda. Portanto, nós aceitamos.
O Manula para instalar e configurar o Dante não espera. Ele apenas procura no Google e é de pouco interesse. Na configuração mínima, você precisa incluir todos os tipos de client pass
do client pass
, socks pass
, registrar corretamente as interfaces e não se esqueça de adicionar socksmethod: username
. Neste formulário, para autenticação, o logopus será obtido dos usuários do sistema. E a parte sobre segurança: a proibição de acesso ao host local, a restrição aos usuários e assim por diante - isso é puramente individual, dependendo da paranóia pessoal.
A performance em dois atos.
Ato um
Nós descobrimos o proxy, agora precisamos acessá-lo na web global. Se você tiver uma máquina com um IP branco no país certo, poderá pular esse item com segurança. Não temos um (como mencionado acima, hospedamos amigos em casa) e o IP branco mais próximo está em algum lugar da Alemanha, portanto, estudaremos as redes.
Então, sim, um leitor atento perguntará novamente: por que não usar um serviço existente como o ngrok ou algo semelhante? E ele estará certo novamente. Mas este é um serviço, novamente ele precisa ser demonizado, também pode custar dinheiro e, em geral, não é esporte. Portanto, criaremos bicicletas a partir de materiais improvisados.
Tarefa: existe um proxy em algum lugar muito além do NAT th, você precisa pendurá-lo em uma das portas VPS, que possui um IP branco e está localizada na extremidade do mundo.
É lógico supor que isso seja resolvido encaminhando a porta (que é implementada através do ssh
mencionado anteriormente) ou combinando pedaços de ferro em uma rede virtual via VPN. Sabemos como trabalhar com ssh
, autossh
chato de autossh
, então vamos autossh
o OpenVPN.
A DigitalOcean tem um ótimo controle sobre esse assunto. Não tenho nada a acrescentar. E a configuração resultante pode ser feita facilmente com o cliente OpenVPN e o systemd
. Basta colocá-lo (config) em /etc/openvpn/client/
e não se esqueça de mudar a extensão para .conf
. Depois disso, puxe o serviço openvpn-client@openvpn-client-config-name.service
, não se esqueça de enable
-lo e fique feliz por tudo ter voado.
Obviamente, você precisa desativar qualquer redirecionamento de tráfego para uma VPN recém-criada, porque não queremos reduzir a velocidade na máquina cliente devido ao tráfego excedido por meia bola.
E sim, você precisa registrar um endereço IP estático no servidor VPN para o nosso cliente. Isso será necessário um pouco mais na narrativa. Para fazer isso, habilite o ifconfig-pool-persist
, edite o ipp.txt
incluído no OpenVPN e ative o client-config-dir, além de editar a configuração do cliente desejado, adicionando o ifconfig-push
com a máscara correta e o endereço IP desejado.
Ato Dois
Agora, temos uma máquina na "rede" voltada para a Internet e que pode ser usada para ganho pessoal. Ou seja, redirecione parte do tráfego através dele.
Portanto, uma nova tarefa: você precisa finalizar o tráfego que chega a uma das portas VPS com um IP branco, para que esse tráfego voe para uma rede virtual conectada recentemente e a resposta possa retornar a partir daí.
Solução: claro que o iptables
! Quando você terá uma oportunidade maravilhosa de praticar com ele?
A configuração necessária é encontrada em breve, em três horas, cem palavrões e um punhado de nervos gastos, porque as redes de depuração são um procedimento muito específico.
Primeiro, você precisa habilitar o redirecionamento de tráfego no kernel. Essa coisa é chamada ipv4.ip_forward
e ativa um pouco diferente, dependendo do SO e do gerenciador de rede.
Em segundo lugar, você precisa selecionar uma porta no VPS e agrupar todo o tráfego para uma sub-rede virtual. Isso pode ser feito, por exemplo, assim:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8080 -j DNAT --to-destination 10.8.0.2:8080
Aqui, redirecionamos todo o tráfego TCP que chegou à porta 8080 da interface externa para a máquina com IP 10.8.0.2 e a mesma porta 8080.
Quem quer os detalhes sujos de netfilter
, iptables
e roteamento em geral deve considerar isso ou aquilo .
Então, agora nossos pacotes voam para uma sub-rede virtual e ... eles ficam lá. Mais precisamente, a resposta do proxy de meias voa de volta pelo gateway padrão na máquina Dante e o destinatário a descarta, porque nas redes não é aceito enviar uma solicitação para um IP, mas receber uma resposta de outro. Portanto, você precisa conjurar mais.
Portanto, agora você precisa redirecionar todos os pacotes do proxy de volta para a sub-rede virtual para o VPS com IP branco. Aqui a situação é um pouco pior, porque o iptables
simplesmente não será suficiente para nós, porque se corrigirmos o endereço de destino antes do roteamento ( PREROUTING
), nosso pacote não voará para a Internet e, se não o corrigirmos, o pacote irá para o default gateway
. Portanto, você precisa fazer o seguinte: lembre-se da cadeia mangle
para marcar pacotes através do iptables
e envolvê-los em uma tabela de roteamento personalizada que os enviará para onde deveria.
Mal disse o que fez:
iptables -t mangle -A OUTPUT -p tcp --sport 8080 -j MARK --set-mark 0x80 ip rule add fwmark 0x80 table 80 ip route add default via 10.8.0.1 dev tun0 table 80
Pegamos o tráfego de saída, marcamos tudo o que voa da porta na qual o proxy fica (8080 no nosso caso), redirecionamos todo o tráfego marcado para a tabela de roteamento com o número 80 (em geral, o número não depende de nada, eu só queria) e adicionamos a única regra , pelo qual todos os pacotes que se enquadram nessa tabela voam para a sub-rede VPN.
Ótimo! Agora os pacotes voam de volta para o VPS ... e morrem lá. Porque o VPS não sabe o que fazer com eles. Portanto, se você não se incomoda, pode simplesmente pegar e redirecionar todo o tráfego que chega da sub-rede virtual de volta à Internet:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 172.42.1.10
Aqui, tudo o que chega da sub-rede 10.8.0.0 com uma máscara 255.255.255.000 é envolto em NAT de origem e voa para a interface padrão, que é direcionada para a Internet. É importante observar que isso só funcionará se encaminharmos de forma transparente a porta, ou seja, a porta de entrada no VPS corresponder à porta do nosso proxy. Caso contrário, você precisará sofrer um pouco mais.
Em algum lugar agora tudo deve começar a funcionar. E resta apenas um pouco: não se esqueça de garantir que todas as iptables
e configurações de route
não continuem após o reinício. Para iptables
existem arquivos especiais como /etc/iptables/rules.v4
(no caso do Ubuntu), e para rotas tudo é um pouco mais complicado. Coloquei-os up/down
scripts up/down
do OpenVPN, embora, eu acho, isso pudesse ser feito com mais decência.
Quebrar o tráfego do aplicativo para o proxy
Portanto, temos um proxy com autenticação no país certo, acessível por um endereço IP branco estático. Resta usá-lo e redirecionar o tráfego do Spotify para lá. Mas há uma nuance, como mencionado acima, a senha de login para o proxy no Spotifaya não funciona, portanto, procuraremos desviar.
Para iniciantes, lembre-se de proxifier . Ótimo, custa apenas como uma nave estelar (US $ 40). Podemos comprar um prêmio pelo dinheiro e lidar com o fim. Portanto, procuramos mais análogos gratuitos e abertos na papoula (sim, queremos ouvir música na papoula). Descobrimos uma ferramenta completa: proximal . E com alegria vamos cutucá-lo.
Mas a alegria não será longa, porque você precisa ativar o modo de depuração e as extensões personalizadas do kernel no MacOS, arquivar uma configuração simples e entender que esta ferramenta tem exatamente o mesmo problema do Spotify: ela não pode se autenticar com uma senha de login no meias-proxy.
Em algum lugar aqui, é hora de surtar e ainda comprar um prêmio ... mas não! Vamos tentar pedir para corrigi-lo, código aberto! Nós fazemos um ingresso . E, em resposta, temos uma história emocionante de que o único mantenedor não tem mais um macbook e vai para o inferno com você, e não uma correção.
Chateado novamente. Mas então lembramos que a juventude e C, ativam o modo de depuração no Dante, investigam cem kilobytes de logs, acessam o RFC1927 para obter informações sobre o protocolo SOCKS5, descobrem com o Xcode e ainda encontram o problema. Basta corrigir um caractere na lista de códigos de método que o cliente oferece para autenticação e tudo começa a funcionar como um relógio. Nós nos alegramos, coletamos o binário de liberação, fazemos a solicitação de pool e ir ao pôr do sol Vamos para o próximo ponto.
Automatize
Depois que o Proximac ganhou, você precisa demonizá-lo e esquecê-lo. Para isso, é adequado um sistema de inicialização completo, que é o MacOS, o launchd .
Nós encontramos rapidamente o manual e entendemos que isso não é totalmente systemd
, e aqui está quase uma colher e um xml
. Nenhuma configuração bonita para você, nenhum comando como status
, restart
, daemon-reload
. Somente hardcore do formulário start-stop
, list-grep
, unload-load
e muito mais esquisitices. Superando tudo isso, escrevemos plist
, load. Não funciona Estudamos o método de depuração do daemon, debazhim, entendemos que mesmo o PATH
não importou o normal lá, juramos, importamos (adicionando /sbin
e /usr/local/bin
) e, finalmente, desfrutamos de inicialização automática e operação estável.
Expire
Qual é o resultado? Uma semana de aventura, um zoológico na altura dos joelhos, de serviços que são preciosos para o coração e faz o que é necessário. Um pouco de conhecimento em áreas técnicas duvidosas, uma gota de código aberto e um sorriso no rosto com o pensamento "eu consegui!"
PS: não se trata de um boicote aos capitalistas, de economia em partidas ou de astúcia total, mas apenas uma indicação da possibilidade de pesquisa e desenvolvimento onde, em geral, você não os espera.