sábado, 19 de julho de 2025

UISP/UNMS não adota M5

Problemas com Nginx Proxy Manager e rádios M5

Eu uso nginx proxy manager e estava tendo problema em conectar meus rádios M5.

Infelizmente a solução reduziu a segurança de todos os meus outros serviços deste proxy porque não achei uma solução que poderia ser aplicada a um único host.

Outro problema: não sei deixar o meu NPM configurado se recriar o container.

Solução: criar certificados na Let's Encrypt do tipo RSA

Para isso eu editei o /etc/letsencrypt.ini alterando key-type = ecdsa para key-type = rsa.

/etc/letsencrypt.ini

text = True
non-interactive = True
webroot-path = /data/letsencrypt-acme-challenge
key-type = rsa
elliptic-curve = secp384r1
preferred-chain = ISRG Root X1

Alteração no algoritmo de troca de chave DH

Para isso precisa criar o arquivo dhparam.pem com o comando:

openssl dhparam -out /etc/nginx/dhparam.pem 2048

Após criar o arquivo precisa ser indicado na configuração com ssl_dhparam, eu escolhi fazer essa configuração em /etc/nginx/conf.d/include/ssl-ciphers.conf

/etc/nginx/conf.d/include/ssl-ciphers.conf
# intermediate configuration. tweak to your needs.
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'DHE-RSA-AES128-GCM-SHA256:AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-A
ES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-PO
LY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
ssl_dhparam /etc/nginx/dhparam.pem;

Por último precisa reiniciar o nginx.

Configuração no container

Como estou usando container eu copiei e editei localmente os 2 arquivos de configuração depois enviei tudo para o container com os comandos:

docker exec nginx-proxy-manager-app-1 openssl dhparam -out /etc/nginx/dhparam.pem 2048
docker cp letsencrypt.ini nginx-proxy-manager-app-1:/etc/letsencrypt.ini
docker cp ssl-ciphers.conf.bkp nginx-proxy-manager-app-1:/etc/nginx/conf.d/include/ssl-ciphers.conf
docker restart nginx-proxy-manager-app-1

Testando a configuração

Para testar usei o nmap:

nmap --script ssl-enum-ciphers -p 443 uisp.xxxxxx.com.br

sexta-feira, 4 de julho de 2025

Expadir LVM em maquina virtual

Para expandir o disco precisamos:

  1. Com fdisk

    • apagar a partição
    • Recriar a partição com o mesmo setor de inicio

    IMPORTANTE: Não apagar a "LVM2_member signature"

    # fdisk /dev/vdb
    Command (m for help): p
    Disk /dev/vdb: 30 GiB, 32212254720 bytes, 62914560 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x986b9785
    
    Device     Boot Start      End  Sectors Size Id Type
    /dev/vdb1        2048 20971519 20969472  10G 8e Linux LVM
    
    Command (m for help): d 1
    
    Command (m for help): n
    Partition type
       p   primary (0 primary, 0 extended, 4 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (1-4, default 1):
    First sector (2048-62914559, default 2048):
    Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62914559, default 62914559):
    
    Created a new partition 1 of type 'Linux' and of size 30 GiB.
    Partition #1 contains a LVM2_member signature.
    
    Do you want to remove the signature? [Y]es/[N]o: n
    
    Command (m for help): w
    
    The partition table has been altered.
    Syncing disks.
  2. Atualizar o PV:

    # pvresize /dev/vdb1
      Physical volume "/dev/vdb1" changed
      1 physical volume(s) resized or updated / 0 physical volume(s) not resized
  3. Expandir a LV:

    # lvextend -l +100%FREE /dev/mediaVG/media
      Size of logical volume mediaVG/media changed from 10.00 GiB (2560 extents) to 30.00 GiB (7680 extents).
      Logical volume mediaVG/media successfully resized.
  4. Expandir o sistema de arquivos ext3/ext4:

    Para sistemas de arquivos ext3 ou ext4, você precisará usar o comando resize2fs para expandir o sistema de arquivos para usar todo o espaço disponível no LV.

    # resize2fs /dev/mediaVG/media
    resize2fs 1.45.5 (07-Jan-2020)
    Filesystem at /dev/mediaVG/media is mounted on /mnt/media; on-line resizing required
    old_desc_blocks = 2, new_desc_blocks = 4
    The filesystem on /dev/mediaVG/media is now 7864320 (4k) blocks long.

    IMPORTANTE: Se o sistema de arquivos estiver montado, o resize2fs fará a expansão online. Se não estiver montado, adicione a opção -f para forçar a verificação do sistema de arquivos antes de expandir.

    Verificando o espaço disponível após a expansão:

    # df -h /mnt/media
    Filesystem               Size  Used Avail Use% Mounted on
    /dev/mapper/mediaVG-media   30G   8G   21G  28% /mnt/media

Dica importante:

Se você estiver usando XFS como sistema de arquivos, o processo é diferente. Para XFS você deve usar:

# xfs_growfs /mnt/media

E o sistema de arquivos deve estar montado durante a operação.

sexta-feira, 27 de junho de 2025

Fedora CoreOS

Para usar o Fedora Core é necessário criar um arquivo de inicialização semelhante à ideia do Cloud-init.

Mas o arquivo de configuração YAML (YAML Ain't Markup Language) é conhecido como Butane.

Esse arquivo precisa ser convertido para JSON, conhecido como Ignition.

Para definir a senha no arquivo, é preciso criar o hash usado no Linux. Uma forma de fazer isso é usando Podman:

podman run -ti --rm quay.io/coreos/mkpasswd --method=yescrypt

Exemplo do arquivo Butane que eu usei:

variant: fcos
version: 1.6.0
passwd:
  users:
    - name: core
      ssh_authorized_keys:
        - ssh-ed25519 AAAAC3NzaXXXXXXXXXXXXXXXII/RsHt5CL/v5juZaj+qmQfw9G+n6J24PzTLu+hIuMOd
      password_hash: $y$j9T$GNBLbCycFxXXXXni1hs.$GHx/wq5SwJpqyXXXXXXXXXXtfDY9nSYqLx7jqpt2w99
storage:
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: fcos01
    - path: /etc/vconsole.conf
      mode: 0644
      contents:
        inline: |
          KEYMAP=br-abnt2
systemd:
  units:
    - name: "install-qemu-guest-agent.service"
      enabled: true
      contents: |
        [Unit]
        Description=Ensure qemu-guest-agent is installed
        Wants=network-online.target
        After=network-online.target
        Before=zincati.service
        ConditionPathExists=!/var/lib/%N.stamp

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=rpm-ostree install --allow-inactive --assumeyes --reboot qemu-guest-agent
        ExecStart=/bin/touch /var/lib/%N.stamp

        [Install]
        WantedBy=multi-user.target

Para converter o Butane em Ignition:

No Linux:

podman run -i --rm quay.io/coreos/butane --pretty --strict < fcos.bn | tee fcos.ign

No PowerShell:

Get-Content fcos.bn | 
    podman run -i --rm quay.io/coreos/butane --pretty --strict | 
    ConvertFrom-Json | 
    ConvertTo-Json -Depth 100 -Compress | 
    Set-Content fcos.minimized.ign -Encoding utf8

Ou:

Get-Content fcos.bn | 
    podman run -i --rm quay.io/coreos/butane --pretty --strict | 
    Tee-Object -FilePath fcos2.ign -Encoding utf8

Se for usar VirtualBox:

Depois de importar o arquivo OVA, crie o guestproperty:

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestproperty set 'FCOS' /Ignition/Config "$(cat .\fcos.minimized.ign)"

No meu caso, a máquina chamava FCOS e o arquivo Ignition fcos.minimized.ign.

Se for usar Proxmox, uma opção é iniciar com ISO e depois baixar o ign previamente hospedado por HTTP:

curl -o coreos.ign http://<ip-address>:8080/coreos/coreos.ign
coreos-installer install /dev/sda -i coreos.ign

Outra opção é editar o arquivo:

/etc/pve/qemu-server/<vmid>.conf
args: -fw_cfg name=opt/com.coreos/config,file=path/to/example.ign

Adicione na máquina uma interface serial porque foi configurada como terminal.

quinta-feira, 26 de junho de 2025

PROXMOX - CLOUD-INIT

Como falei antes usar cloud-init e libguestfs é muito útil aqui vou escrever como eu usei.


Primeiro precisa instalar a ferramenta:

apt install libguestfs-tools -y


Eu guardo minhas ISOs em um NFS que não fica no servidor mas está montado nele, então vou trabalhar dele assim posso usar o resultado em todos os servidores da rede, use a pasta onde você guarda suas ISOs e templates.

cd /mnt/pve/nfs-remoto/

Baixe o arquivo da sua distribuição, observe que eu usei genericcloud e extensão raw.

wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.raw


Para facilitar minha vida criei um script pra deixar a imagem com os ajustes que eu uso. Mas você pode fazer linha por linha.

Eu criei o arquivo cloud-prep.sh:

#!/bin/bash
IMAGEM="debian-12-genericcloud-amd64.raw"
SERIAL_DEVICE="ttyS0"
BAUD_RATE="115200"

# Instala QEMU Guest Agent
virt-customize -a "$IMAGEM" \
  --install qemu-guest-agent

# Criar diretório de override para serial-getty
virt-customize -a "$IMAGEM" \
  --mkdir /etc/systemd/system/serial-getty@${SERIAL_DEVICE}.service.d

# Criar arquivo de override com autologin root
virt-customize -a "$IMAGEM" \
  --write "/etc/systemd/system/serial-getty@${SERIAL_DEVICE}.service.d/override.conf:[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin root --keep-baud ${BAUD_RATE},38400,9600 %I \$TERM
TTYVTDisallocate=no"

# Habilitar o serviço serial-getty
virt-customize -a "$IMAGEM" \
  --run-command "systemctl enable serial-getty@${SERIAL_DEVICE}.service"

# Configurar GRUB_CMDLINE_LINUX
virt-customize -a "$IMAGEM" \
  --edit '/etc/default/grub:s/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX="console=tty0 console='${SERIAL_DEVICE}','${BAUD_RATE}'"/'

# Configurar GRUB_TERMINAL
virt-customize -a "$IMAGEM" \
  --edit '/etc/default/grub:s/^#?GRUB_TERMINAL=.*/GRUB_TERMINAL="console serial"/'

# Configurar GRUB_SERIAL_COMMAND
virt-customize -a "$IMAGEM" \
  --edit '/etc/default/grub:s/^#?GRUB_SERIAL_COMMAND=.*/GRUB_SERIAL_COMMAND="serial --speed='${BAUD_RATE}' --unit=0 --parity=no --stop=1"/'

# Atualizar configuração do GRUB
virt-customize -a "$IMAGEM" \
  --run-command "update-grub"

echo "Configurado qemu-guest-agent"
echo "Configuração do console serial"

O arquivo deve ser executável:

chmod +x ~/cloud-prep.sh

Execute:

~/cloud-prep.sh

Então use o novo arquivo em suas VMs importando o disco, no exemplo o ID da VM é 101 altere para o de sua VM:

qm importdisk 101 debian-12-genericcloud-amd64.raw local-lvm

Por ultimo adicione ao Hardware da VM o CloudInit Drive para poder fazer as configurações. Eu usei EFI Disk também.

domingo, 9 de março de 2025

Editar imagem de disco sem iniciar o sistema operacional guest. (https://libguestfs.org/)


E nesse segundo que esse video tem a informação mais util.
Você edita um disco, o template da VM sem nem precisar iniciar a maquina.

Essa ferramenta é muito importante, não posso esquecer, mas é só isso mesmo.

https://libguestfs.org/

sábado, 8 de fevereiro de 2025

Cloudflare BROWSER SSH - MIkrotik

TL;DR

Crie um container Debian:12-slim
Instale ou compile Name Service Switch module All-To-One (libnss-ato).

Essa foi a grande descoberta que nem as inteligências artificiais conseguiram me dar a dica, penei muito para achar. Quero agradecer muito ao desenvolvedor Donapieppo por ter feito essa lib.

Para quem possa interessar os detalhes

Bom se você não me conhece, para colocar algo meu para rodar na sua rede sem saber como funciona, talvez você queira replicar minha experiencia e fazer sua versão.
 
Eu fiz o Dockerfile e disponibilizei no meu GitHub.

Lá está tudo bem explicado em 3 arquivos README.md separados.

https://github.com/eduardomazolini/cloudflare-mikotik

Obrigado!

CloudFlare Tunnel - Mikrotik

TL;DR


Depois de fazer o túnel configure como app seu MikroTik por web e SSH.

MAS você ainda vai ter que entrar com usuário e senha do MikroTik todas as vezes depois de se autenticar na Cloudflare.

MAS o container cloudflare/cloudflared só tem pra ARM64 não iria rodar em uma 4011.

Eu criei um container para arm32/v7 que roda na minha RB4011, se precisar cloudlared-arm-mikrotik pode usar.

Para quem possa interessar os detalhes

Bom se você não me conhece, para colocar algo meu para rodar na sua rede sem saber como funciona, talvez você queira replicar minha experiencia e fazer sua versão.
 
Eu fiz o Dockerfile e disponibilizei no meu GitHub.

Lá esta tudo bem explicado em 3 arquivos README.md separados.


Obrigado!

Asterisk e VIVO SIP (Atualização)

Em agosto de 2023 eu achei um bug que me impedia de fazer ligações no SIP da VIVO.
E consegui corrigir esse bug e fiz um pull request para a correção estar no asterisk.
Em setembro 2023 eu fiquei orgulhoso da minha modificação ter sido aceita pela pela mantenedora do código.
Só em julho de 2024 eu o código que eu tinha modificado foi incorporado a um release.
Foram os releases 20.7 e 21.
O FreePBX 16 usava a versão 20.5 mas a versão 17 Beta já estava com a versão 21.
Em janeiro consegui escrever o procedimento aqui para quem não pudesse atualizar corrigir o bug em seus equipamentos.
Hj a versão 17 já não é beta. Recomendo atualizar mas observem que chan_sip não existe mais, pode ser configurado, mas não é recomendado.

Acesso remoto Console Serial pela Cloudflare

Pessoal eu penei por um ano e meio para conseguir entender o que fazer e como fazer. Finalmente terminei.


Eu vi um consultor de TI usar um HUB de USB para ligar todos os cabos console a um equipamento que ele poderia acessar caso a rede estivesse fora. Eu comprei os Hubs USB em 8 de Setembro de 2023.

Pedi um Chip Vivo com modem USB para me fornecer o acesso também.

Só que o modem da Vivo tem bloqueio para acesso direto ao IP dele.

Em alguns caso o modem fica atrás de CGNAT também.

 

Como resolver?

1) VPN
Foi minha primeira ideia. Mas ai quem fosse resolver o meu problema teria que estar na mesma VPN com o mesmo software de VPN instalado eu teria que enviar as configurações do acesso.

2) WARP CloudFlare

Foi o que pensei por muito tempo e por isso estudei suas formas.

A vinda do MikroTik v7 com Wireguard parecia a solução.

Perdi um bom tempo para entender tudo por isso acabei publicando os artigos anterioes sobre WARP.

3) Cloudflare Tunnel (cloudflared)

Depois de entender que as aplicações na Cloudflare só funcionam com Cloudlared Tunnel e não com WARP. Precisava subir um servidor só para rodar o túnel.
 

Então vaio a ideia de fazer isso com container dentro do Mikrotik e essa é a solução.
Vou explicar no próximo post como fazer o container com o túnel.

Mas quem for acessar precisa fazer isso de forma muito rápida e acessar o MikroTik para depois fazer os acessos aos equipamentos me parecia limitado, bom seria ter um servidor Linux.
Quem estiver em meu socorro tem que lembrar usuário e senha do acesso que é usado uma vez só na vida ou quem sabe nunca se Deus quiser. Pra depois pular para os equipamentos de rede.

O Cloudflare BROWSER SSH é muito simples mas pede senha ou chave privada, depois de ter autenticado o usuário na página deles.

Para não precisar entra com senha ou chave privada podemos usar certificado, mas o usuário seria sempre o que estivesse antes do @ do e-mail.

Mas qual Vai ser o e-mail que meu amigo salvador que vai me ajudar no momento de crise tem para eu permitir ele acessar minha rede?

Eu teria que acessar, pra depois criar ele no Linux, mas se alguém vai me socorrer pode ser que um dos motivos é eu estar indisponível no momento.

Ai veio a ideia se eu criar um servidor Linux que aceite qualquer usuário como certificado?
Um servidor Linux com acesso SSH liberado exclusivamente para o IP do servidor de túnel.
Um servidor que não autentique por senha, mas todos os usuários teriam acesso aos mesmos arquivos.

Vou explicar no próximo post como fazer o servidor SSH.

Até lá!





sexta-feira, 17 de janeiro de 2025

Extraindo configuração do cliente WARP

Eu uso warp-cli em um container docker pra criar as conexões e com os comando abaixo da pra printar os valores dos JSON dos arquivos de configuração.

Lembre de não remover ou desconectar por linha de comando ou esses valores vão se tonar inválidos.


echo $(jq -r .secret_key < /var/lib/cloudflare-warp/reg.json)

echo $(jq -r .public_key < /var/lib/cloudflare-warp/conf.json)

echo $(jq -r '.endpoints[0].v4' /var/lib/cloudflare-warp/conf.json)

echo $(jq -r .interface.v4 < /var/lib/cloudflare-warp/conf.json)/12

fonte: https://github.com/AnimMouse/wgcf-connector/blob/main/wgcf-connector.sh