Vento no Litoral

A linha do horizonte me distrai

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 entices 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.apps.tv.launcher 

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