Vento no Litoral

A linha do horizonte me distrai

In the last rambling episode, the one with the Volvo bashing, I made some observations concerning politics, principles and compromises. After that was published, I saw Bertram's post over at The Crooked Timber.

Now, you're probably thinking: “That was over a year ago!” Yes, my browser has a huge backlog of hundreds of open tabs left to read later. Only recently did I came around to reading Bertram's piece. May we get back to the topic?

Anyway, the disposition in that post aligns pretty well with my fleeting comments. Now I would like to play the devil's advocate and argue against myself (as seems to be in vogue nowadays) and Bertram.

First, I don't actually disagree when it comes to those particular immigration policies discussed by Bertram. But there is plenty to be said against the general idea of settling for the second-best or, perhaps just in a more folksy turn of phrase, not letting the perfect be the enemy of the good.

After all, who is dealing the options? Who says we can't get a better second-best? How do we assess whether we really can't get the actual best? Can we trust such comparative judgements in the first place? Even if we could be sure that there were only two options, the second-best may be quite a long way from our desired outcome.

I guess there is some strategic wisdom in the principle: better to gain something through compromise than to achieve nothing out of sheer stubbornness. I think we humans are naturally averse to being stubborn. People tend to avoid conflict and rightly so.

Consensus is a powerful thing. In its purest form, it may bring about genuine agreement. But it can also hide the frustrated and premature forsaking of worthy goals because of miscalculated positions. It's one of the great misfortunes of life that many of our most consequential actions are plagued by too many unknowns. Perhaps we were not dealt such a bad hand. And our tendency to compromise and be agreeable may obfuscate that.

People wanting to effect change are often perceived as stubborn. To a certain degree, depending on the size of the change, they kind of have to be. When considered stubborn, they are rarely praised for being tenacious but instead disapproved for being unreasonable. And perhaps they are. But I fear certain kinds of objectives can only be achieved unreservedly. There's no incremental route to them. There is no piecemeal overarching series of compromises that would deliver them.

That's not me shouting Vive la révolution by the way. I am as weary of radicals as your average bourgeois. I think it is important to recognize though that to resist making concessions is not always such a blemish as the phrase “making the perfect the enemy of the good” would have us believe. Sometimes making concessions may even be counterproductive to the main cause. Sometimes it's actually more advisable to keep the issue unresolved and potentially uncomfortable for everybody than to give way to an imperfect relief that would nonetheless destroy any momentum towards a full solution.

John Tanner wrote in his Handbook that all progress depends on the unreasonable man. All his failings aside (and don't even get me started on Bernard Shaw), I think there is a truth to that. Sometimes we just have to put our feet down.

CC-BY-SA 4.0

The One with the Volvo Bashing

So, who likes airport paperbacks?

I know. I don't particularly like them either.

Once I was stranded in an airport and the only paperback priced according to the loose bills in my pocket was Dan Brown's The da Vinci Code. What a piece of garbage! I only got through it because I literally had nothing better to do.

But there is a book in the airport paperback category that had a considerable influence on me, although I didn't bought it or read it in an airport: Trevanian's Shibumi. It's no masterpiece, like Pride and Prejudice or Ana Karenina, but has its upsides. It also has a lot of silliness and awkwardness.

Between the ludicrous tantric sex and the tedious passages around spelunking, there is this recurring stupidity where the protagonist always bashes his Volvo car after entering or leaving it. At one point, Trevanian's narrator remarks:

It was not long before his caving associates fell into the practice of bashing his Volvo whenever they passed it, at first as a joke and later by habit. Soon they and the young men they traveled with began to bash any Volvo they passed. And in the illogical way of fads, Volvo-bashing began to spread, here taking on an anti-Establishment tone, there a quality of youthful exuberance; here as an expression of antimaterialism, there as a manifestation of in-cult with-itness. Even owners of Volvos began to accept the bashing craze, for it proved that they traveled in circles of the internationally aware. And there were cases of owners secretly bashing their own Volvos, to gain unearned reputations as cosmopolites.

As a teenager, I found the detached prose quite entertaining. Specially the passages where the narrator pokes fun at all sorts of shallow practices and hypocrisy, from corporate capitalism to military mentality. I guess it was the persistent derision towards authority, institutions and mass culture that attracted me as a teenager.

More recently, I took a peek inside the book once more and reread some passages. Predictably, my overall opinion of the book is now way lower. What changed?

Well, let me first dwell on what didn't change.

Although the narrator seems to invariably shine a good light over the protagonist, I think is very likely that Trevanian himself despises him. Nicholai Hel, that's his name, is actually a caricature, whom the narrator seems to admire, but whom the author is trying to mock. The novel is a spoof, as were previous novels by Trevanian with similar protagonists.

I mean, the backstory of Nicholai Hel alone is such a ridiculous pastiche, it's almost burlesque: a child of a German soldier and Russian nobility born in Shanghai is sent by his Japanese foster father to study Go in Japan. What?!

Mixed in with this entertaining satire, however, there are some serious and thoughtful passages about war and other human misfortunes.

The Bombing of Shanghai, the desperation and hunger endured by civilians in Japan at the end of WWII, the incompetence and brutality of military missions in the subsequent Cold War (an appalling misnomer).

These were all experienced by the protagonist and often masterfully narrated. I remember in particular the passage where Hel tries to endure torture by going somewhere else deep inside his own mind.

I still hold these passages in high regard. Now, for the low points.

First, the female characters are... well, they are not really characters, but caricatures. I guess that could be said of every character in the book, but still. It seems the female characters got it worst on average. Perhaps, I just shouldn't expected good character development from airport paperbacks.

Furthermore, there is a particular running theme... some kind of cheap contempt, and sometimes even resentment, towards average persons. Actually, it reminds me of the kind of petty aristocratic resentment so frankly expressed in Tocqueville's Democracy in America:

When I survey this countless multitude of beings, shaped in each other's likeness, amidst whom nothing rises and nothing falls, the sight of such universal uniformity saddens and chills me, and I am tempted to regret that state of society which has ceased to be. When the world was full of men of great importance and extreme insignificance, of great wealth and extreme poverty, of great learning and extreme ignorance, I turned aside from the latter to fix my observation on the former alone, who gratified my sympathies. But I admit that this gratification arose from my own weakness: it is because I am unable to see at once all that is around me, that I am allowed thus to select and separate the objects of my predilection from among so many others. Such is not the case with that almighty and eternal Being whose gaze necessarily includes the whole of created things, and who surveys distinctly, though at once, mankind and man. We may naturally believe that it is not the singular prosperity of the few, but the greater well-being of all, which is most pleasing in the sight of the Creator and Preserver of men. What appears to me to be man's decline, is to His eye advancement; what afflicts me is acceptable to Him. A state of equality is perhaps less elevated, but it is more just; and its justice constitutes its greatness and its beauty. I would strive then to raise myself to this point of the divine contemplation, and thence to view and to judge the concerns of men.

The translation doesn't quite manage to capture the beauty of the original prose. I suppose it's pedantic of me to write that, which seems appropriate to the context 😉.

Yes, it's almost endearing coming from a 19th century French aristocrat. With respect to Shibumi, however, this disparagement of the “common masses” annoyed me quite a bit this time around, whereas I barely even noticed it the first time. To be fair to my past self, the first time around, I haven't yet read any great literature. No Kafka, Austen, Tolstoy, Dostoevsky or Flaubert. After those, people tend to become less forgiving as readers.

Anyway, I don't want to turn this into a review of Shibumi. After all, the book is only a pretext for me to ramble about and waste your time.

This supposedly new failing I found is likely a projection of some musings that have preoccupied me lately. You see, individuals are often the subject of admiration. They can distinguish themselves. They can be unique, interesting, special, rare.

The communal is usually less exciting. It's more difficult to find praise for what is common, popular, collective, public. And when you do find it, there's always a catch. We love to praise “democracy”, but also never get tired of complaining about it, specially when it doesn't deliver the results we were expecting.

We prefer to flaunt MLK, Gandhi and Einstein than to discuss civil rights, social change and physics. We want heroes to praise, messiahs to save us, examples to admire. It is comforting to have these figures. They provide something to look up to and aspire, as well as an excuse when we don't get there. Who can blame us? We're no Gandhi!

Ideally we would need fewer heroes, messiahs, martyrs and examples. Virtue should not always require sacrifice. Achievement should not require genius.

We've made some progress. But heroes, messiahs, knights, geniuses and benevolent dictators still entice us. Why?

The civil rights movement in the United States, for example, was much more than MLK or any other individual. But a MLK biopic is probably more watchable than a civil rights documentary. Most people would rather quote MLK than review a draft bill or discuss parliamentary procedure. And that's fine. Really.

We should not forget, however, that some details in legislation or parliamentary procedure can be much more important for the values we hold so dear. What keeps those values in place is often dull, boring and even undignified.

We like to complain about politicians and their compromises and alliances. We think politics should be mostly principled and that unreasonable people can simply be “forced to be free”, to borrow a phrase from Rousseau.

Hel's Volvo served him pretty well. Yet he despised it and felt compelled to bash it whenever possible.

Let us not bash our Volvos.

CC-BY-SA 4.0

Eu não gosto muito de televisão.

Para deixar claro, nada tenho contra televisores. Isto é, embora eu aprecie telas grandes, especialmente por causa da minha miopia, a programação dos canais de TV aberta no Brasil (e boa parte dos canais pagos também) não costuma despertar meu interesse.

A programação aberta no Brasil, assim como em outras partes do mundo, é focada no entretenimento. Entretanto, desde pequeno, eu nunca senti a necessidade de ser entretido (perdoe-me a aliteração, não pude resistir). Daí, as programações que despertam meu interesse costumam ser noticiários, documentários, reportagens. Enfim, algo que me informe, me faça pensar ou que tenha algum apelo cultural ou estético, como dramas ou filmes, caso tenham algum valor artístico.

Na minha infância e adolescência, o uso do televisor estava limitado pela programação aberta no Brasil. Isto, juntamente com a competição dos livros, fez do televisor um passatempo meio entediante para mim. Na infância, quando ainda morava no interior, assistia bastante televisão. Nada de melhor pra fazer no interior, muitas vezes. Na adolescência, ao me mudar pra capital (viva as bibliotecas públicas!), deixei a televisão de lado. Ainda usava o televisor eventualmente para assistir a filmes alugados em cassete, mas não mais me submetia à programação aberta.

Muitos anos depois, morando na Alemanha, a programação aberta servia como uma maneira de aprender um pouco sobre o país e sua cultura, manter o contato com o idioma quando em casa e também extrair algum benefício de uma certa taxa. A programação aberta naquele país me agradou bem mais. É mais variada, menos concentrada em entretenimento. De lá pra cá, desenvolvi um certo interesse em ter contato com outros países e culturas por meio das suas programações de televisão.

Recentemente, após mais de dez anos sem televisor em casa, adquiri um. Ciente de que isto ofereceria uma oportunidade ímpar para futricar no que não devia, escolhi uma TCL com sistema operacional Android (versão 9).

Depois de manusear um pouco e instalar alguns aplicativos, habilitei as opções de desenvolvedor e ativei a depuração USB. Sentei na frente do computador e fui me divertir.

$ nmap -sT espectro
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-12 17:47 -03
Nmap scan report for espectro (192.168.1.5)
Host is up (0.014s latency).
rDNS record for 192.168.1.5: espectro.lan
Not shown: 995 closed tcp ports (conn-refused)
PORT     STATE SERVICE
5555/tcp open  freeciv
8008/tcp open  http
8009/tcp open  ajp13
8443/tcp open  https-alt
9000/tcp open  cslistener

Nmap done: 1 IP address (1 host up) scanned in 0.20 seconds

O DNS aqui em casa já resolve o nome da TV, “espectro”, pro respectivo IP.

Bem, a porta 5555 é para ADB. Kodi, um dos aplicativos que instalei antes, está escutando na 8008. Quanto às demais portas, não faço ideia.

$ adb connect espectro:5555
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to espectro:5555

Maravilha!

Não gostei da tela inicial, principalmente por causa da propaganda de programação da Globo e Disney. Instalei o FLauncher.

No caso deste aparelho, o pacote que responde pela tela inicial é com.google.android.tvlauncher (sem “x” no final). Portanto, é necessário adaptar as instruções no repositório do FLauncher:

$ adb shell
BeyondTV:/ $ pm disable-user --user 0 com.google.android.tvlauncher 

Aproveitei para desabilitar outros aplicativos incorporados pelo fabricante que estavam estorvando.

Para ter acesso a alguns aplicativos melhores e úteis, instalei o F-Droid, uma versão clássica, melhor de manusear com o controle remoto.

$ adb install eu.bubu1.fdroidclassic_xxxx.apk

A maioria dos aplicativos disponíveis nos repositórios do F-Droid não são calibrados para funcionar em televisores, salvo algumas notáveis exceções.

Instalei o Termux, o qual funciona surpreendentemente bem no televisor. O único problema é que usar terminal sem teclado físico é uma tortura. Depois de algumas semanas de sofrimento, comprei um teclado sem fio (Bluetooth), o mais barato que encontrei. Infelizmente, as teclas estavam inserindo conforme o mapeamento americano, mas o teclado é brasileiro. Por alguma razão, dentre as alterações feitas pela fabricante, estava o desativamento da configuração do idioma para teclados físicos que costuma estar disponível no Android.

Sem muita paciência para perseguir uma solução adequada, lancei mão de uma gambiarra. Instalei Key Mapper e remapeei as teclas de modo a simular o teclado brasileiro. Para minha surpresa, esta gambiarra funciona perfeitamente. Foi um tanto custosa para implantar, pois são muitas teclas a serem remapeadas e o aplicativo não responde bem ao controle remoto. A minha sorte foi que me lembrei de uma ferramenta excelente disponível no Debian.

$ adb connect espectro:5555
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to espectro:5555
$ scrcpy

A tela do televisor apareceu numa janela e eu consegui controlar tudo usando o cursor e o teclado do meu computador. Perfeito!

No Termux, adicionei o seguinte no arquivo de configuração ~/.termux/termux.properties:

extra-keys = []
ctrl-space-workaround = true
fullscreen = true

Com o teclado, ajustei o tamanho da fonte, e obtive um excelente terminal na telona. Em poucos minutos, sentado no sofá com o teclado no colo, escrevia satisfeito usando minhas ferramentas prediletas: Emacs + Magit.

Usando o esquema de roteamento transparente conjugado a um serviço de VPN com suporte a Wireguard (existem muitos por aí, custam por volta de cinco euros por mês), foi possível obter uma boa variedade de canais abertos ao redor do mundo, conforme mostra a captura da telona.

Televisor

Alguns aplicativos na figura acima são por assinatura ou não tem acesso restrito por bloqueios geográficos. Mas temos aplicativos de canais abertos no Canadá, Reino Unido, Austrália, Alemanha, Suíça, Áustria, Estados Unidos, Portugal, Espanha, França, Suécia e Nova Zelândia. Estes necessitam de algum roteamento pelo respectivo país.

Mesmo a disponibilidade de alguns destes aplicativos na Google Play está limitado a algumas regiões. Contudo é possível obtê-los em portais como APKMirror e instalar via ADB. Melhor ainda é instalar Aurora Store e simular a localização com a ajuda de Sagernet + SOCKS5. Assim é possível também obter atualizações com mais facilidade.

Seria cruel e inútil fornecer um passo-a-passo para cada um destes canais. Seria cruel por estragar a diversão e o aprendizado. Seria inútil porque os roteamento de domínios necessários hoje, podem muito bem não ser os mesmos de amanhã, embora costumem permanecer estáveis por muito tempo. Talvez convenha apenas alertar que uma ferramenta recomendada na receita sobre roteamento transparente, o sniproxy, parece estar negligenciada. Sugiro substituir por outra ferramenta capaz de fazer fachada ao TLS, tais como Nginx, HAProxy ou mesmo Apache.

CC-BY-SA 4.0

Apesar da infraestrutura básica ser livre, a vasta maioria dos dispositivos Android está longe de fornecer a mesma liberdade de sistemas operacionais baseados em Linux para computadores de mesa. Os dispositivos que chegam às mãos da vasta maioria dos consumidores contém controladores proprietários para vários componentes (sensores, moduladores, câmeras, rádio, GPS, GPU e por aí vai). Isto sem contar as tranqueiras embutidas por diversas empresas na cadeia de produção e distribuição, desde fabricantes até telecomunicações.

A melhor opção para quem quer um aparelho relativamente livre, mas ainda assim altamente funcional, é instalar alguma distribuição alternativa derivada do AOSP. A mais madura e popular dentre elas é, certamente, LineageOS.

A gama de aparelhos suportados não é muito ampla, porém é comum que um ou outro dispositivo comercializado no Brasil esteja na lista, ainda que apenas disponível no mercado de segunda mão, com destaque para aparelhos Samsung com circuito integrado Exynos. O meu aparelho, por exemplo, é um Samsung Galaxy A5, o qual comprei já usado em 2019. Entrou no mercado em 2016, portanto deve estar completando mais de seis anos de uso. Provavelmente teve a bateria trocada antes de chegar na minha mão, mas eu mesmo nunca o fiz. Minha expectativa é mantê-lo ainda alguns anos, pois satisfaz todas minhas necessidades e, por causa do LineageOS, dispõe de um sistema operacional mais atualizado (Android 11) do que muitos aparelhos novos vendidos hoje.

A questão crucial, naturalmente, é o que esperar de um aparelho antigo com LineageOS. Em primeiro lugar, certamente não é uma boa para quem usa intensamente (por exemplo, com jogos e entretenimento). Mesmo que as capacidades técnicas ainda satisfaçam, a bateria teria que ser substituída com certa frequência, uma tarefa propositalmente difícil nos dispositivos modernos. Pode ser uma excelente alternativa, porém, para quem usa primariamente para se comunicar, informar e organizar. O sistema operacional pode ser atualizado para muito além do suporte oficial do fabricante, além de proporcionar um manuseio mais enxuto, agradável e flexível. Sem mencionar o impacto positivo na redução de refugo eletrônico.

Eis algumas dicas para quem dispõe de um dispositivo antigo com LineageOS. Algumas delas, entretanto, são aplicáveis ao ecossistema Android em geral.

Tema escuro

O componente que mais suga energia é, sem sobra de dúvida, a tela. Se você possui um dispositivo com tela AMOLED, é possível obter uma economia considerável de energia ao empregar temas escuros. Inclusive, muitos aplicativos, e mesmo o próprio Android/LineageOS em suas versões recentes, dispõe de temas especificamente calibrados para a economia de energia nestas telas, conhecido como “tema AMOLED”, “tema preto (puro)” ou algo que o valha. Para escurecer o conteúdo das páginas no Chrome, acessar chrome://flags e habilitar #enable-force-dark (Auto Dark Mode for Web Contents). No Firefox, existe um complemento.

Pareamento com o computador

Além do tema escuro, outra maneira de poupar o uso da bateria é manter a tela desligada, sempre que possível. Para algumas pessoas, não é incomum ter o celular consigo enquanto trabalham em um computador, com uma tela maior. Nestas situações, é possível evitar ligar a tela do celular para conferir notificações e etc. mediante a sincronização com o computador. Pessoalmente, eu uso o KDEConnect.

Automação

LineageOS já vem com algumas funcionalidades que permitem automação. É possível definir perfis de sistema que são ativados de acordo com certos critérios. Por exemplo, um perfil pode ser configurado para que o aparelho ative os dados móveis ao desconectar da sua rede sem fio doméstica. Ou para silenciar o aparelho ao chegar em casa e conectar na rede sem fio doméstica. Assim, evita-se tarefas repetitivas ao mesmo tempo em que a bateria é economizada, na medida em que é poupada a ativação da tela.

Para além daquilo embutido no sistema operacional, aplicativos como o Easer oferecem ainda mais amplitude de automação.

Respaldo

Existem várias maneiras de se resguardar contra desastres que não requerem uma conta com a Google. Estratégias manuais são: usar o sistema de recuperação, ADB, ou mesmo rsync.

Seedvault promete um método mais automatizado e já vem embutido em versões mais recentes do LineageOS.

F-Droid

Nenhuma discussão sobre ferramentas livres para Android estaria completa sem mencionar F-Droid. Os aplicativos distribuídos pelos repositórios padrão são vetados com respeito à segurança, liberdade e privacidade. Vários metadados importantes para o usuário estão visíveis antes da instalação, algo que só recentemente tem sido adotado pela loja de aplicativos da Google. Alguns aplicativos disponíveis via F-Droid não estão disponíveis na loja da Google. Mas mesmo aqueles que estão disponíveis ficam enterrados nas buscas, pois a Google possui um interesse financeiro em promover alguns aplicativos em detrimento de outros.

Alguns aplicativos interessantes:

CC-BY-SA 4.0

The One with the Journey From a Vanity Project to Reflections on the Separation Between Church and State

Out of curiosity (or perhaps vanity) I recently compiled an academic genealogy with the help of the Mathematics Genealogy Project, Geneagrapher and some other sources. I was kind of disappointed (although not really surprised) to find just one woman in there. This was Anscombe, from whom I descend via Thomas Sattig, one of the three people who wrote reports on my dissertation.

I recognized some of the names, but had no clue about many others. While I was thinking that it could be fun to look up some random unknown academic precursor, my eyes landed on a name: “Anne du Bourg”. That sounds like it could be a woman, I thought. So I opened up Wikipedia and surprise, surprise, it's a dude's name. He is an interesting character though. Apparently, he mentored the young Étienne de la Boétie, whose Discours de la servitude volontaire (also known as Contr'un) I admire, and was a protestant martyr.

Now, I have a copy of the Martyrs Mirror which I flip through occasionally, especially in difficult times. I grabbed it and searched for du Bourg's name in the index of martyrs from 1525 to 1660. It was not there. OK, that makes sense, since the book focuses on Anabaptists. From what I could gather, Anne du Bourg rejected transubstantiation (perhaps even the Lutheran “real presence” doctrine), but there is no record of him being baptized as an adult. Besides, he signed a somewhat empty recantation (although he latter withdrew it) and there was some violent reactions from his supporters. All of which would not sit well with most Anabaptists. Still, du Bourg was executed mainly because of his faith (and partly because he embarrassed Henry II), despite the pleas of Margaret of Valois (not to be confused with her niece, Queen Margot).

But I digress. “Wait. Isn't that the point of this whole series of posts? It's called Ramblings after all”, I can hear you all saying. Well, yes. At least, that's how it is supposed to look from the outside. Just like religious conflicts are supposed to be about religion, but are often about something else.

Speaking of religious conflicts, the execution of Anne du Bourg was an important event in the escalation of tensions leading up to St. Bartholomew's Day massacre when one Margaret of Valois (now we are talking Queen Margot) helped some protestants evade death. Now, if you read up on this conflict, or the Crusades, or the Münster Rebellion (or... you know, there are countless, take your pick), you soon realize that secularism, or the separation of church and state, is a much underappreciated blessing.

It was a hard lesson, assimilated over the course of much human suffering. Today, secularism is enshrined in the legal apparatus of many modern democracies. However, that's no guarantee that politics is immune from the influence of religion and vice-versa. You see, most modern democracies work by amassing support from various segments of the population, while large concentrations of power try to keep meaningful changes with majority acclaim from entering the political spectrum. There's nothing barring religious groups from engaging in this game. And it could be argued that it would be wrong to bar them, at least in principle. So, here we are today. Religion and politics often intertwine. Not anymore by necessity, but by opportunism and convenience.

I think it is kind of ironic that, although the Christians in the Martyrs Mirror were the persecuted, many Christians today are actually the persecutors. They pressure their legislatures to codify supposedly christian morals into law. For instance, many oppose gay marriage, even in countries where some rights and social benefits are closely tied to it. So, although it may not be the intention of those Christians, surviving spouses of gay couples may not get the pensions they deserve. Is this really qualitatively very different from the old edicts curtailing the rights of Protestants, or Jews, to own property?

In today's secular nations, there are still some religiously motivated legislation. Sure, these laws are not enacted because the State itself has a religion, but because some politicians needed the support from some religious groups. For the people targeted, I don't think this is much consolation, though. Do you?

I admire the perseverance of many christian martyrs of old. Sadly, however, I am incapable of feeling the same towards most contemporary Christians.

CC-BY-SA 4.0

Um vacilo no TLS <= 1.2 compromete a sua privacidade, mas também pode facilitar a sua vida.

Cenário

Suponhamos que você disponha de variados pontos de saída rumo à internet. Por exemplo, você pode dispor de uma via através da universidade para acesso a periódicos científicos, ou alguma máquina em outra localização que você possa acessar via SSH, ou um serviço de VPN.

A prática mais comum é ficar saltando entre configurações no navegador, talvez com a ajuda de extensões ou perfis segregados, ou ligar e desligar a VPN sob demanda, de acordo com a atividade a ser realizada. Contudo, o processo torna-se logo entediante. Não tarda muito para que, imaginemos, a banda dos servidores da universidade seja desperdiçada na transmissão de vídeos de gatos (em vez de artigos científicos), pois esquecemos de restaurar as configurações no navegador.

Contudo, é razoável assumir que você deseje que link.springer.com seja sempre acessado pela universidade, enquanto youtube.com seja sempre contactado diretamente, poupando a rede universitária dos vídeos de gatos. Havendo esta relação fixa entre o domínio (springer.com) e a rota (servidor VPN da universidade), o troca-troca e/ou liga-desliga pode ser evitado. Vejamos uma receita para fixar rotas de acordo com domínio de destino, de modo transparente, para todos os equipamentos na rede local. Para tanto, necessitados de:

  • uma máquina conectada à rede, preferencialmente por cabo, rodando Linux (assumiremos Debian instável)
  • controle do servidor DHCP da rede, normalmente o roteador, para alteração dos servidores DNS e reserva de IPs estáticos

Solução

Assumimos que a máquina Linux está conectada por cabo à sua rede (diretamente no roteador, na maior parte dos casos), roda Debian instável e dispõe de um endereço IP estático na rede interna (LAN), digamos, 192.168.1.2. Esta máquina deverá estar sempre ligada e operante, sob pena dos dispositivos na rede não conseguirem mais resolver DNS e, portanto, perderem acesso efetivo à internet. Boas candidatas são SBCs, como placas da família Raspberry Pi, pois costumam ser relativamente potentes, apesar de consumir pouquíssima energia (em boa parte dos casos, menos energia inclusive que o próprio roteador).

Embora as instruções tenham sido testadas com Debian instável, é muito provável que os passos descritos abaixo funcionem perfeitamente com a suíte estável do Debian, ou com outra distribuição qualquer do Linux, especialmente aquelas derivadas do Debian, como Ubuntu e Mint.

Você precisa ter acesso de administrador ao terminal da máquina, seja por meio de periféricos (teclado, tela e etc.), seja por acesso remoto via SSH.

Serviço DNS – AdGuardHome

Em tese, qualquer serviço DNS que permita a reescrita de requisições de acordo com o domínio (como dnsmasq, por exemplo) seria suficiente. Mas vamos usar AdGuardHome, pois oferece outras funcionalidades úteis, como o bloqueio de domínios de propaganda/rastreamento e diversas ferramentas para controle dos pais.

Por razões de segurança, adotamos uma instalação um pouco distinta do método padrão recomendado na documentação: em vez de executarmos o serviço como superusuário, concedemos seletivamente ao binário os privilégios necessários. Primeiramente, criamos um usuário dedicado para execução do serviço.

# adduser --system --disabled-login --group --home /opt/agh agh

Abrimos uma linha de comando como o novo usuário e pulamos para o diretório $HOME.

$ sudo -u agh /bin/bash
$ cd $HOME

Baixamos o binário de acordo com a plataforma da máquina, digamos arm64, e extraímos.

$ wget ENDEREÇO_PARA_O_PACOTE.tar.gz
$ tar --strip-components=2 -zxvf PACOTE.tar.gz

Concedemos ao binário a capacidade de se atrelar à portas privilegiadas, como a 53.

# setcap 'CAP_NET_BIND_SERVICE=+eip CAP_NET_RAW=+eip' ./AdGuardHome

Executamos o binário enquanto navegamos para http://192.168.1.2:3000 (adapte para o IP da sua máquina, caso necessário) e seguimos as instruções para configuração inicial. Eu recomendo que você configure para que a página de gerenciamento escute por conexões apenas a partir de dentro da própria máquina. Supondo que você tenha acesso remoto via SSH, poderá sempre simular o acesso interno:

$ ssh -L 3000:localhost:3000 192.168.1.2

Após os ajustes iniciais, criamos uma unidade de sistema em /etc/systemd/system/agh.service:

[Unit]
Description=Local DNS
After=syslog.target network-online.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/opt/agh/AdGuardHome
WorkingDirectory=/opt/agh
User=agh
Group=agh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Carregamos, habilitamos e iniciamos a unidade.

# systemctl daemon-reload
# systemctl enable agh.service
# systemctl start agh.service

Consulte a documentação e configure o serviço de acordo com as suas preferências. Eu recomendo usar 1.1.1.1 (Cloudflare) e 8.8.8.8 (Google) como servidores de arranque (apenas) e realizar as resoluções DNS normais via HTTPS: https://dns.cloudflare.com/dns-query (Cloudflare) e https://dns.google/dns-query (Google). Desta maneira, alguém bisbilhotando o tráfego DNS não poderá descobrir daí os sites que você visita. Alguém bisbilhotando o tráfego TCP, entretanto, ainda poderá fazê-lo por meio do SNI. Mais adiante, veremos como este defeito do TLS pode ser empregado para rotear transparentemente tráfego encriptado.

A opção de DNS otimista pode reduzir o tempo médio de resposta para aproximadamente cinco milissegundos sem causar problemas perceptíveis (em comparação com a latência média de cinquenta milissegundos entre João Pessoa e os servidores da Google e Cloudflare em São Paulo). Por fim, não se esqueça de alterar DNS primário e secundário no servidor DHCP (normalmente abrigado no roteador) da sua rede para o IP da máquina e certifique-se de que ela aceita pacotes na porta 53 (de que a porta não está sendo filtrada, por exemplo).

Compartimentos de rede

No Linux, podemos criar compartimentos de rede completamente segregados, sem que seja necessário virtualizar todo o SO (por exemplo, com Docker) ou quaisquer outros recursos do sistema, seja armazenamento, processamento e etc. Esta economia é particularmente bem-vinda em SBCs.

Todas as configurações alcançadas por meio dos comandos a seguir são efêmeras e não sobrevivem a reinicialização da máquina. Existem várias formas de torná-las permanentes. Nas distribuições Linux modernas, a maneira mais robusta provavelmente envolve configurações de ferramentas da família systemd. Isto não é abordado.

Criamos uma ponte virtual de rede (br0) para conectar todas as interfaces da máquina. Estamos assumindo que a interface física cabeada (digamos, eth0) foi completamente desconfigurada. A ponte virtual tomará o seu lugar.

# ip link add name br0 type bridge
# ip link set eth0 up
# ip link set eth0 master br0

Agora que nós temos uma ponte virtual contendo a interface física cabeada, podemos configurá-la via DHCP.

# dhclient br0

Observe, porém, que a ponte obteve um MAC aleatório (distinto daquele atrelado à eth0) e que a reserva DHCP, caso já exista, provavelmente terá que ser atualizada para refletir o novo MAC.

Wireguard

Muitas pessoas contratam serviços de VPN com servidores espalhados pelo mundo com o intuito de contornar bloqueios ou filtros geográficos. VPNs também são ocasionalmente usadas para escapar de filtros impostos pela rede de origem, como a Grande Muralha (virtual) da China, dentre outros usos.

Como ilustração, vejamos como seria possível desviar, de modo transparente, todo tráfego da rede destinado para ardmediathek.de (e subdomínios) via um servidor VPN na Alemanha. Usamos Wireguard, pois é mais simples e eficiente que as alternativas (como OpenVPN e IPSec) para os nossos propósitos.

Suponhamos, então, que há uma máquina na Alemanha (IP A.A.A.A) com uma interface wireguard escutando na porta UDP 51820, chave pública Deu...land=. Esta máquina está disposta a encaminhar os nossos pacotes recebidos do endereço interno 10.1.1.4 encriptados com a chave privada PriV...sEcrEt=.

# apt install wireguard-tools

Criamos uma interface wireguard com o nome de.

# ip link add dev de type wireguard

Agora, criamos um compartimento de rede separado (também chamado de) e transportamos a interface wireguard recém-criada para lá.

# ip netns add de
# ip link set de netns de

A interface wireguard lembra a sua rede de nascimento e sempre irá encriptar e despachar pacotes por ali, ainda que agora habite um compartimento de rede diferente. Configuramos, então, a interface wireguard dentro do compartimento. Para simplificar, estamos usando apenas IPv4.

# ip netns exec de wg set private-key <(echo PriV...sEcrEt=) peer Deu...land= allowed-ips 0.0.0.0/0 endpoint A.A.A.A:51820
# ip -n de address add 10.1.1.4/32 dev de
# ip -n de link set up dev de

Pronto. Dentro do compartimento, a única interface disponível no momento é a inferface wireguard. Definimos esta interface como rota padrão para pacotes gerados dentro do compartimento.

# ip -n de route add default via 10.1.1.4 dev de

Agora, qualquer programa executando dentro do compartimento terá seu tráfego redirecionado através da Alemanha. Para poder expor a rota alemã a programas executando em outras máquinas, conectamos o compartimento à rede local por meio de um cabo de rede virtual.

# ip link add vethde type veth peer name cethde
# ip link set cethde netns de
# ip -n de link set up cethde
# ip link set up vethde
# ip link set vethde master br0

Aqui a ponta vethde do cabo habita a rede padrão e está ligada à ponte br0 e a outra ponta cethde habita o compartimento de. Isto significa que cethde pode agora solicitar um endereço local na rede para o compartimento de via DHCP (digamos que foi cedido o endereço 192.168.1.3).

# ip netns exec de dhclient cethde
sniproxy

Muitas ferramentas de rede procuram por arquivos de configuração em /etc/netns/$NOME antes do padrão /etc quando executadas no compartimento de rede $NOME. É o caso do sniproxy. Ele irá escutar nas portas padrões 80 (HTTP) e 443 (HTTPS), e irá redirecionar o tráfego TCP com base no nome do servidor destino, conforme especificado na origem do tráfego, consultando o SNI, no caso de tráfego encriptado (daí o nome da ferramenta).

# apt install sniproxy

No nosso caso, o tráfego será direcionado para o mesmo servidor estipulado na origem. Porém, como o sniproxy executa dentro do compartimento de, o tráfego percorrerá a rota alemã. Um exemplo de /etc/netns/de/sniproxy.conf seria:

user daemon

listen 192.168.1.3:80 { proto http }
listen 192.168.1.3:443 { proto tls }
table { .* * }

resolver { mode ipv4_only }

Por razões de segurança, a configuração acima pede que o sniproxy escute apenas na rede local. É aconselhável também implantar um filtro de rede próprio para o compartimento de, por exemplo, executando comandos nft dentro do compartimento, mas não trataremos disto.

# ip netns exec de sniproxy

Convém observar, novamente, que um endereço MAC aleatório foi atribuído a cethde, o que deve ser levado em consideração na hora de fazer uma reserva estática de IP por DHCP (o que é altamente recomendável). Logo após a criação do cabo de rede virtual, é possível atribuir um $MAC específico caso necessário para preservar uma reserva de IP já vigente.

# ip -n de link set dev cethde address $MAC

Roteamento baseado no domínio

Agora, usamos o nosso servidor DNS para direcionar as conexões de todos os equipamentos da rede ao compartimento, conforme o domínio requisitado. Para tanto, configuramos uma regra de reescrita no AdGuardHome (dns/#custom_rules). Para desviar tráfego destinado ao domínio ardmediathek.de (e seus subdomínios) através da Alemanha, por exemplo, podemos usar a regra:

||ardmediathek.de^$dnsrewrite=NOERROR;A;192.168.1.3,client=~192.168.1.3

Esta regra especifica que a resposta DNS para ardmediathek.de (e seus subdomínios) será 192.168.1.3 (o endereço local do compartimento de). Exceção para requisições vindas do próprio compartimento, as quais serão, naturalmente, resolvidas com o IP real.

Em resumo, ao acessar ardmediathek.de, os equipamentos da rede serão levados a abrir uma conexão TCP com o sniproxy (na porta 80 ou 443). Ele, por sua vez, consulta o nome do servidor destino no SNI, faz sua própria resolução DNS, obtendo agora o IP real, e encaminha a conexão TCP adiante. Porém, por estar executando no compartimento de, esta conexão TCP seguirá para a interface wireguard correspondente, saindo na outra ponta na Alemanha, como se ali tivesse originado.

SOCKS5

Também é possível usar a rota alemã direta e indistintamente via SOCKS5.

# apt install microsocks

Uma vez que o microsocks é bem simplório e não rebaixa automaticamente para um usuário comum, invocamos setpriv para evitar executar como administrador.

# ip netns exec de setpriv --reuid daemon --regid daemon --clear-groups --inh-caps=-all microsocks -i 192.168.1.3 &

Este método requer a configuração de cada aplicação (e.g. firefox) ou do SO para empregar a saída de rede via SOCKS5, endereço 192.168.1.3, porta 1080. Ademais, todo tráfego por ali percorrerá a rota alemã, sem distinção de domínio. Uma vantagem, porém, é que pode ser facilmente usado com outros protocolos, além de HTTP/HTTPS.

Android

Sagernet é uma ferramenta que permite configurar diferentes perfis SOCKS5 e rotear com base no aplicativo que originou o tráfego. Possui diversos outros usos e configurações, a maior parte direcionada a usuários que almejam superar a muralha virtual chinesa.

CC-BY-SA 4.0