Acesso remoto e o cliente nativo
Uma VM de espaço de trabalho reside num único Mac, mas quem quer conduzi-la nem sempre está sentado a esse Mac. O Bromure Agentic Coding pode ser acedido remotamente, e cada caminho remoto passa por uma única porta de entrada SSH, opcional e desativada por predefinição. Ative-a e obtém três formas de entrar: uma pessoa pode fazer ssh a partir de qualquer terminal e chegar a um menu; pode gerir a própria porta de entrada a partir da linha de comandos; e um cliente nativo — outro Mac a executar a aplicação, ou a app de iOS / iPadOS — pode ligar-se e espelhar toda a instância (a sua grelha, espaços de trabalho, terminais e painéis de controlo) numa janela em tempo real.
O cliente nativo chega a um servidor de duas formas. Na mesma rede, adiciona-o diretamente por endereço. De qualquer outro lugar, inicia sessão numa conta bromure.io e escolhe o servidor a partir de um diretório: os dois dispositivos são apresentados um ao outro pelo bromure.io e depois comunicam ponto a ponto, sem reencaminhamento de portas, sem VPN e sem qualquer endereço para memorizar — e assim que iniciar sessão, os seus próprios dispositivos autorizam-se mutuamente, pelo que a ligação é sem palavra-passe e sem configuração manual de chaves.
Este capítulo aborda a ativação do acesso remoto no anfitrião, cada um dos pontos de entrada, como o cliente nativo espelha um remoto 1:1 (por endereço e através do bromure.io), o acesso a serviços dentro de VMs remotas, a exposição de um servidor de desenvolvimento à internet e o modelo de segurança que mantém tudo isto seguro. A inscrição à escala de frota e a telemetria na nuvem são um sistema completamente diferente — consulte Empresa. A referência completa de comandos encontra-se em Automatização e a CLI.
As três formas de entrar
Tudo o que se segue depende de a porta de entrada SSH estar ativada (está desligada por predefinição). Uma vez em execução, o mesmo servidor serve todos os três públicos:
| Forma de entrar | Quem a utiliza | O que obtém |
|---|---|---|
| SSH simples | Uma pessoa em qualquer terminal (ssh -p 2222 you@mac) | O menu remoto — uma TUI ao estilo curses. Uma shell em bruto nunca é acessível. |
A CLI bromure-cli remote | Você, no próprio anfitrião | Gerir a porta de entrada: ativar/desativar, chaves, estado. Consulte Ativar o acesso remoto no anfitrião. |
| O cliente nativo | Outro Mac a executar a aplicação, ou a app de iOS / iPadOS | Uma janela-espelho 1:1 em tempo real da instância remota, com edições bidirecionais — alcançada por endereço numa LAN ou através de uma conta bromure.io de qualquer lugar. |
O servidor é incorporado — é a biblioteca swift-nio-ssh da Apple integrada na aplicação, e não o próprio sshd do macOS. Essa distinção é importante: como a aplicação executa o seu próprio servidor, consegue verificar a palavra-passe da sua conta macOS através do OpenDirectory sem que alguma vez ative o Início de sessão remoto nas Definições do Sistema e sem direitos de administrador. Escuta apenas o utilizador macOS exato que lançou o bromure-cli, e força cada início de sessão interativo a entrar no menu remoto. As únicas exceções destinadas a máquinas são quatro comandos na lista branca que o cliente nativo utiliza (bromure-fatclient/1 control, forward <ip> <port>, forward-udp <ip> e browser-mcp <vm>); qualquer outra coisa que uma pessoa escreva comporta-se como um início de sessão e cai no menu.
Nota: A janela de Acesso Remoto descreve o servidor como "uma instância do servidor SSH do sistema propriedade da aplicação". Mais precisamente, é um servidor swift-nio-ssh incorporado, deliberadamente não o
sshddo macOS — é exatamente isso que lhe permite funcionar sem Início de sessão remoto nem direitos de administrador.
Ativar o acesso remoto no anfitrião
O acesso remoto está desligado até que o ative, e pode ser gerido de duas formas equivalentes: a janela Acesso Remoto ou a CLI bromure-cli remote. Ambas escrevem no mesmo local, pelo que uma alteração feita numa reflete-se na outra e é aplicada em tempo real.
A janela de Acesso Remoto
Abra Bromure Agentic Coding (o menu com o nome da aplicação) → Acesso Remoto…. O título da janela é Acesso Remoto. Um ponto verde ou cinzento indica sshd em execução ou sshd parado; quando o servidor está ativo, aparece por baixo do cabeçalho uma cadeia de ligação copiável no formato ssh -p <port> <user>@<host>.
| Secção | Campo | Finalidade | Predefinição |
|---|---|---|---|
| Cabeçalho | Ativar acesso remoto por SSH | Inicia e para o servidor. | Desligado |
| Escuta | IP de vínculo | Em que interface escutar. 0.0.0.0 = todas as interfaces; 127.0.0.1 = apenas este Mac. | 0.0.0.0 |
| Escuta | Porta | Porta TCP de escuta; tem de ser ≥ 1024 (um processo não-root não pode vincular portas privilegiadas). | 2222 |
| Autenticação | Palavra-passe da conta macOS | Aceitar a palavra-passe de início de sessão macOS do utilizador que executa a aplicação (verificada via OpenDirectory). | Ligado |
| Autenticação | Chave pública | Aceitar chaves da lista de chaves autorizadas abaixo. | Ligado |
| Chave de anfitrião do servidor | impressão digital | A impressão digital ed25519 da própria chave de anfitrião do servidor, para verificação fora de banda. Indica (gerada na primeira ativação) até à primeira utilização. | — |
| Chaves públicas autorizadas | lista | Chaves públicas ssh-ed25519 / ecdsa inscritas. Adicione colando uma linha de chave; remova com o ícone do lixo. Indica Nenhuma chave inscrita. quando vazia. | vazia |
Edite o IP de vínculo ou a Porta e prima Return para aplicar a alteração em tempo real. A secção Autenticação indica Verificado contra <user> — o utilizador que executa o bromure-cli. para que fique claro de quem é a palavra-passe que desbloqueia a porta.
Aviso: Pelo menos um método de autenticação tem de permanecer ativado — não pode desligar simultaneamente a autenticação por palavra-passe e por chave pública. Colar uma chave inválida é rejeitado com Não é uma chave pública válida. Adicionar ou remover uma chave autorizada reinicia a escuta, o que interrompe quaisquer ligações em curso.
A CLI bromure-cli remote
A CLI comunica com a aplicação em execução através do seu socket de controlo exclusivo do proprietário, pelo que a aplicação continua a ser a única fonte de verdade. É a forma mais rápida de ativar o acesso num Mac sem monitor a que chegou através de uma shell existente.
| Comando | O que faz |
|---|---|
bromure-cli remote (ou remote status) | Imprime o estado de ativado/em execução, o vínculo e a porta, os métodos de autenticação, a impressão digital da chave de anfitrião, o utilizador de início de sessão, uma cadeia de ligação pronta a usar e a lista numerada de chaves autorizadas. |
bromure-cli remote enable [--port N] [--bind IP] [--password|--no-password] [--pubkey|--no-pubkey] | Inicia o servidor (lançando automaticamente o agente da aplicação, se necessário). Predefinições: porta 2222, vínculo 0.0.0.0, ambos os métodos de autenticação ligados. |
bromure-cli remote disable | Para o servidor e persiste o estado desligado. |
bromure-cli remote key add <path-or-key-text> | Inscreve uma chave pública a partir de um caminho de ficheiro ou de uma linha de chave colada; imprime a sua impressão digital. |
bromure-cli remote key ls | Lista as chaves autorizadas com um índice iniciado em 1, a impressão digital e o comentário. |
bromure-cli remote key rm <index|fingerprint> | Remove uma chave por índice ou por uma subcadeia da impressão digital. |
O remote enable recusa se passar simultaneamente --no-password e --no-pubkey, e dá erro enquanto uma imagem base estiver em falta ou a instalar. Quando a aplicação não está em execução, status, disable e key ls imprimem Nenhum agente bromure-cli em execução.
Nota: O servidor não arranca enquanto a imagem base estiver ausente ou ainda a instalar — ativá-lo devolve então um erro acionável em vez de uma operação silenciosamente ignorada. Isto é verdade tanto no arranque como quando alterna o comutador. Instale ou conclua primeiro a instalação da imagem base.
Chaves de anfitrião, impressões digitais e confiança
Na primeira ativação, o servidor gera uma chave de anfitrião ed25519. A sua impressão digital — mostrada na linha Chave de anfitrião do servidor e por bromure-cli remote status, no formato 256 SHA256:… bromure-ac-remote (ED25519) — é o que um cliente que se liga verifica para se certificar de que chegou ao Mac correto. Forneça esta impressão digital a quem se liga (ou verifique-a você mesmo na folha de primeiro contacto do cliente nativo) para que um atacante intermediário não possa fazer-se passar pelo anfitrião. Consulte confiança na primeira utilização para saber como o cliente nativo a fixa.
Limitação de taxa
As tentativas de palavra-passe são limitadas por IP de origem através de um token bucket: cinco tentativas à velocidade máxima e, depois, uma reposição de cerca de uma tentativa a cada dois segundos, com o atraso imposto limitado a oito segundos. As tentativas são atrasadas, nunca recusadas, e ninguém é alguma vez bloqueado; um IP ruidoso não pode abrandar outro. A autenticação por chave pública nunca é limitada.
Iniciar sessão por SSH simples
Qualquer terminal pode aceder ao anfitrião com ssh -p 2222 <user>@<mac>. Em vez de uma shell, a ligação chega ao menu remoto — uma TUI ao estilo curses (internamente bromure-cli __remote-menu) forçada em cada início de sessão humano. Uma shell em bruto nunca é acessível através dele.
O menu espelha a aplicação: uma lista unificada de Espaços de trabalho com glifos de estado em tempo real (● em execução, ◌ a arrancar, ⏸ suspenso, ○ desligado), além das secções Modelos e Rastreio. A partir dela pode:
- Criar um espaço de trabalho com um formulário de ecrã único, com uma porta Definições completas… para todos os catorze painéis de configuração (Geral, Agentes, Modelos locais, Fusion, Pastas, Credenciais, Ambiente, MCP, Rastreio, Salvaguardas, Cadeia de fornecimento, Injeção de prompt, Aparência, Recursos).
- Iniciar, suspender, terminar, reiniciar ou eliminar qualquer espaço de trabalho.
- Editar todas as definições. Os segredos aparecem como
•••• (definido); deixar um segredo em branco mantém o valor armazenado. - Gerir worktrees — criar, fundir, associar um terminal ou descartar — com o mesmo aninhamento que a GUI.
- Gerar chaves SSH, alternar o Fusion e o encaminhamento de modelos, e navegar por resumos de rastreio.
- Associar a qualquer separador tmux ou a um contentor Docker em execução.
Navegue com as teclas de setas, Enter para selecionar e q ou Esc para retroceder; Sair (desligar) termina a sessão. Selecionar Associar entrega o terminal ao tmux do convidado; Ctrl-b d desassocia de volta ao menu. Enquanto está associado, um atalho de sobreposição (predefinição Ctrl-]) abre um controlador do lado do anfitrião — mudar de separador, abrir um novo separador, gerir worktrees, alternar o Fusion ou o encaminhamento, editar definições, reiniciar, suspender ou desligar — sem que a tecla alguma vez chegue ao convidado. Associar a um contentor pede a shell (Enter = sh).
Nota: O menu precisa de um terminal real. Ligar-se sem um TTY imprime uma sugestão para reconectar com
ssh -t. Iniciar um espaço de trabalho a frio aguarda até cerca de 20 segundos pela sessão tmux do convidado antes de associar. Se um espaço de trabalho utilizar autenticação por Subscrição, o menu lembra-o de executar o início de sessão da ferramenta (por exemploclaude login) dentro da VM depois de esta arrancar.
O atalho de sobreposição é configurável no Mac anfitrião (a máquina a que se está a ligar) através do ficheiro ~/Library/Application Support/BromureAC/remote/overlay-key — as formas aceites são C-], ^], 0x1d ou 29 — ou da variável de ambiente BROMURE_OVERLAY_KEY.
Espelhar um remoto com o cliente nativo
O cliente nativo transforma a cópia deste Mac do Bromure Agentic Coding num espelho em tempo real de uma remota. Obtém uma janela completa que apresenta o remoto utilizando exatamente as mesmas vistas de barra lateral, grelha e terminal que já conhece — a mesma disposição mostrada abaixo para uma instância local — mas intitulada Remoto — <name>, e cada edição que faz é executada no remoto e ecoa de volta.
Ligar
Abra Espaços de trabalho → Ligar a um Bromure remoto… (⇧⌘K). A janela resume a escolha: «Espelhe outro Mac a executar o Bromure — a sua grelha, espaços de trabalho, separadores e automatizações. Inicie sessão para alcançar os seus servidores a partir de qualquer lugar, ou adicione um diretamente por endereço na sua LAN.» Ambos os caminhos chegam à mesma janela-espelho; diferem apenas na forma como os dois Mac se encontram e se autorizam.
Por endereço (mesma rede)
Use isto numa LAN onde conhece o endereço do Mac e não precisa de uma conta bromure.io.
- No Mac remoto, ative o acesso remoto (a janela Acesso Remoto ou
bromure-cli remote enable). - Neste Mac, clique em +, introduza um Nome (por exemplo,
rack mini), um Endereço, uma Porta (predefinição2222) e um Utilizador remoto, depois clique em Ligar. As linhas guardadas mostramuser@address:porte a hora da última ligação. - No primeiro contacto, uma folha mostra a impressão digital da chave de anfitrião SSH do remoto. Verifique-a contra a janela Acesso Remoto do remoto e depois clique em Confiar e Continuar. A fixação é memorizada para este ponto de extremidade; as ligações posteriores são silenciosas, a menos que a chave mude, caso em que o botão fica vermelho e indica Confiar na Nova Chave e Continuar — um possível atacante intermediário.
- O cliente tenta a autenticação por chave pública com a chave dedicada deste Mac. Se este Mac ainda não estiver autorizado, recorre à palavra-passe de início de sessão macOS do utilizador remoto (botão: Iniciar sessão); um início de sessão por palavra-passe bem-sucedido inscreve a chave deste Mac no remoto através do túnel, para que todas as ligações posteriores sejam sem palavra-passe. Para pré-autorizar sem alguma vez escrever uma palavra-passe, clique em Mostrar a chave deste Mac e execute
bromure-cli remote key add '<this Mac's key>'no remoto.
Após a primeira ligação, faça duplo clique num servidor guardado para reconexões com um só clique; o menu de contexto de cada linha oferece Ligar, Editar… e Remover.
Através de uma conta bromure.io (de qualquer lugar)
Iniciar sessão no bromure.io permite a um cliente alcançar os seus servidores através de redes — de um Wi-Fi de café a um Mac em casa — sem reencaminhamento de portas, sem VPN e sem qualquer endereço para memorizar. O bromure.io apenas apresenta os dois Mac e retransmite bytes quando um caminho direto é impossível; a própria sessão SSH mantém-se encriptada de ponta a ponta entre os dois Mac.
- Inicie sessão. Escolha Janela → Inscrever-se no bromure.io… e introduza o código de inscrição que a sua conta bromure.io lhe fornece (uma frase de seis palavras cunhada pelo seu administrador, ou pela consola web para uma conta pessoal) mais um Nome do dispositivo. Cada dispositivo que inscreve partilha a mesma conta.
- No Mac remoto, ative o Acesso Remoto. Um servidor só aparece no diretório enquanto a sua porta de entrada estiver ativa e estiver a enviar sinais de vida ao bromure.io.
- Neste Mac, abra Ligar a um Bromure remoto…. Os seus servidores estão listados em Os meus servidores · bromure.io com um ponto de online em tempo real e a hora da última presença. Faça duplo clique num deles (ou selecione-o e clique em Ligar). O estado indica «A ligar a
<name>através do bromure.io…» enquanto se estabelece um caminho ponto a ponto — direto, mapeado por porta do router, ou retransmitido — e depois a janela-espelho abre.
Neste caminho não há qualquer endereço para escrever, nenhuma folha de chave de anfitrião e nenhuma palavra-passe: os seus próprios dispositivos confiam uns nos outros através da sua conta (abaixo), e a chave de anfitrião é fixada automaticamente.
Sem palavra-passe entre os seus próprios dispositivos
Assim que tiver iniciado sessão, cada dispositivo que inscreve partilha a sua identidade SSH através da sua conta, pelo que qualquer um dos seus dispositivos alcança qualquer um dos seus servidores sem palavra-passe e sem bromure-cli remote key add manual:
- Cada dispositivo publica a sua chave pública SSH no bromure.io ao arrancar. Cada um dos seus servidores (Acesso Remoto ativo) obtém as chaves dos seus dispositivos e instala-as no seu
authorized_keysem segundos — através do mesmo canal de dispositivo, pelo que um dispositivo que acabou de inscrever fica autorizado quase de imediato, sem qualquer chave copiada à mão. - Um servidor também publica o início de sessão macOS com que é executado, pelo que o cliente o contacta automaticamente como o utilizador correto (o mesmo campo que o caminho por endereço lhe pede para preencher).
- As chaves estão limitadas aos seus próprios dispositivos — nunca aos de outro utilizador, mesmo dentro da mesma organização.
- Terminar sessão num dispositivo reforma-o: a sua chave é removida dos seus servidores e ele desaparece do diretório, pelo que voltar a iniciar sessão nunca deixa um duplicado obsoleto. Um dispositivo não usado durante 90 dias também deixa de estar autorizado até voltar a dar sinal. E a partir da consola web do bromure.io pode terminar a sessão de qualquer um dos seus dispositivos a pedido.
Nota: O cliente nativo gera o seu próprio par de chaves ed25519 dedicado (comentário
bromure-ac-fatclient) na primeira vez que o utiliza, armazenado no diretório do cliente remoto — esta é a chave publicada na sua conta. Para uma ligação por endereço, a fixação da chave de anfitrião pertence ao ponto de extremidade (address:port), não ao utilizador, pelo que editar o endereço ou a porta de um servidor guardado remove a fixação e reativa a folha de impressão digital; uma ligação bromure.io fixa em vez disso a chave do par através da conta. Tanto a app de macOS como a app de iOS / iPadOS («Bromure Client») usam este modelo de conta — a app móvel é um espelho apenas de cliente, alcançado exatamente da mesma forma (iniciar sessão, escolher um servidor, ligar). O caminho por endereço é exclusivo do macOS.
A janela-espelho
A janela-espelho abre automaticamente após uma ligação bem-sucedida. Clique numa linha de espaço de trabalho para montar o seu terminal em tempo real (se estiver em execução) ou o seu painel de controlo da VM com Iniciar / Retomar (se estiver desligado ou suspenso); o palco acompanha as transições de estado em tempo real. Os cliques nos separadores mudam de forma otimista e são confirmados pelo próximo sondagem de estado.
A barra de ferramentas da sua barra de título espelha a pílula por VM local, da esquerda para a direita: o comutador do túnel de rede (apenas janelas remotas), a pílula de IP, o raio do Fusion, Navegar ficheiros (pasta), Reiniciar a VM, Editar espaço de trabalho (roda dentada), Destacar para a sua própria janela, Mostrar ou ocultar o navegador agêntico (⌃⌘B) (globo) e Mostrar ou ocultar os ficheiros do repositório (⌃⌘E). O painel de controlo do Docker abre a partir da barra lateral, exatamente como acontece localmente.
Algumas funcionalidades comportam-se de forma especial no espelho:
- Editar espaço de trabalho abre o mesmo editor de perfil que o local, mas sustentado por uma leitura com os segredos apagados e por uma gravação que preserva os segredos (consulte Os segredos ficam no anfitrião). Gerar nova chave SSH funciona e mostra-lhe a nova chave pública.
- Navegar ficheiros abre uma janela por VM ao estilo do Finder, intitulada Ficheiros —
<workspace>(<host>) sobre o sistema de ficheiros do convidado — Início mais até oito pastas partilhadas — com transferência por arrastar para dentro e para fora através do túnel. - Reiniciar a VM pergunta Suave vs Forçado localmente, depois envia o verbo.
- Destacar abre uma janela de terminal em tempo real adicional que fecha automaticamente se o espaço de trabalho parar.
Nos bastidores, o espelho sonda o snapshot /state do remoto a cada 0,75 segundos através de uma ponte de socket de controlo tunelizada por SSH, e apresenta-o através das mesmas vistas que uma janela local. As chamadas de controlo curtas multiplexam-se sobre uma única ligação SSH ControlMaster por anfitrião; as associações de terminal interativas utilizam deliberadamente as suas próprias ligações SSH dedicadas, porque um canal multiplexado armazena em buffer a saída espontânea (redesenhos do tmux) de que um terminal precisa imediatamente. Numa ligação bromure.io, a mesma ponte e os mesmos fluxos de terminal seguem o caminho SSH ponto a ponto (alcançado através de um shim de loopback local), e o espelho comporta-se de forma idêntica.
O que é espelhado e o que funciona remotamente
O espelho é abrangente. Apresenta cada espaço de trabalho com o seu estado de execução em tempo real, todos os separadores e worktrees (totalmente aninhados), a disposição em grelha, as automatizações, os painéis de controlo da VM para espaços de trabalho desligados e suspensos, o painel de controlo do Docker, os sinais vitais (CPU, memória, carga, disco, tempo de atividade, IP, portas) e os terminais interativos em tempo real. As edições são bidirecionais e convergem em cada cliente ligado na próxima sondagem: iniciar/parar/suspender/reiniciar, operações de separador, edições de grelha (disposição inteira, ganha o último a escrever), edições de automatização, o comutador do Fusion, ações do Docker, gravações de definições e transferências de ficheiros.
Algumas operações não estão disponíveis a partir do cliente nativo nesta versão:
- Operações de worktree conduzidas por prompt — criar uma nova worktree, fundir, resolver um conflito ou semear uma automatização — não são remotizadas na v1. Faça-as na própria GUI do anfitrião ou através do menu remoto (que suporta criar, fundir e resolver). O espelho continua a apresentar todas as worktrees, e remover e associar terminal funcionam remotamente.
- As edições de disposição em grelha precisam de uma janela GUI aberta no remoto. Um remoto totalmente sem monitor (aplicação em execução, sem janela unificada) espelha tudo o resto mas não pode aceitar uma alteração de disposição.
- Funcionalidades exclusivas do lado do anfitrião — importar uma chave SSH a partir de um ficheiro e o registo de subscrição — estão ocultas no editor de definições remoto.
Pedidos de decisão pendentes
Algumas ações que inicia remotamente levantam uma decisão no remoto — uma atualização do armazenamento de início, uma reposição de desvio da imagem base ou uma limpeza de VM comprometida. Estas surgem no snapshot /state como pedidos pendentes e aparecem como alertas locais na sua janela-espelho; a sua resposta viaja de volta pelo túnel. Se um pedido ficar sem resposta, expira para a escolha segura e não destrutiva. Os pedidos de consentimento MITM que um agente em execução pode desencadear (uso de credenciais, passagem da cadeia de fornecimento, escritas de salvaguardas, injeção de prompt) são geridos por um caminho separado e não falsificável pelo convidado, documentado em Gestão do consentimento remoto.
Os segredos ficam no anfitrião
Os segredos nunca atravessam a ligação. Quando o cliente nativo lê um perfil remoto para preencher o editor, cada campo de segredo chega apagado. Ao gravar, um campo em branco significa "manter o valor armazenado" e um campo preenchido substitui-o. As chaves de API, os tokens e os segredos de ambiente MCP ficam no Mac remoto. O cliente nativo autentica-se apenas por chave SSH uma vez emparelhado — não há pedidos de palavra-passe durante o espelhamento.
Aceder a serviços nas VMs do remoto
O servidor de desenvolvimento de um espaço de trabalho remoto reside num endereço privado como http://192.168.64.5:3000 na rede do remoto. O Bromure dá-lhe dois níveis de acesso a ele — um automático e limitado ao navegador, outro opcional e à escala do sistema.
O painel do navegador (automático, limitado por PAC)
O painel do navegador colapsável do lado direito da janela-espelho (o botão do globo na barra de ferramentas, ou ⌃⌘B) é uma VM Chromium local cujo tráfego de página para a sub-rede do espaço de trabalho remoto é tunelizado por SSH. Um script PAC (proxy auto-config) gerado encaminha apenas a sub-rede remota através de um encaminhador SOCKS por anfitrião e tudo o resto DIRECT, e os destinos são resolvidos no lado remoto — pelo que navegar para o literal http://192.168.64.x:port de um servidor de desenvolvimento remoto simplesmente funciona. O próprio fluxo MCP de controlo do navegador do agente remoto é retransmitido para este painel, pelo que o agente de programação remoto conduz o navegador que está a ver.
Selecione um espaço de trabalho remoto em execução e prima ⌃⌘B. O painel não faz nada até que o primeiro snapshot /state tenha entregado a sub-rede do remoto e o encaminhador SOCKS esteja ativo (uma linha de registo assinala "tunnel not ready" até lá). A sua VM de navegador local está fixada à sub-rede 192.168.127.0/24 (gateway 192.168.127.1) para que nunca possa colidir com uma sub-rede de espaço de trabalho. Os perfis de navegador persistentes residem neste Mac, indexados pelo ID do espaço de trabalho remoto.
Nota: O painel do navegador exige que este Mac seja Apple Silicon com a imagem base do navegador instalada localmente. O encaminhador SOCKS vincula
0.0.0.0(para que a VM do navegador o possa alcançar no gateway vmnet) mas aceita ligações apenas do loopback e da sub-rede de navegador fixada192.168.127.x— nunca é um relay aberto.
Encaminhamento SOCKS e encaminhamentos de porta fixos
Cada anfitrião remoto ligado obtém automaticamente um encaminhador SOCKS5 local numa porta efémera vinculada a 0.0.0.0 (filtrada por pares para o loopback e a sub-rede de navegador 192.168.127.x). Cada CONNECT abre um canal SSH forward <ip> <port> que o remoto encaminha — através do relay de loopback sempre ativo do convidado em vsock 5010 — para o próprio 127.0.0.1:<port> desse convidado. Assim, a partir deste Mac, curl --socks5 127.0.0.1:<port> http://192.168.64.5:3000 alcança o convidado remoto byte a byte.
Para encaminhamentos fixos existe encanamento de CLI oculto: bromure-cli __forward <hostID> <localPort> <remoteIP> <remotePort> para um encaminhamento ao estilo ssh -L, e bromure-cli __forward-socks <hostID> <localPort> para um proxy SOCKS autónomo. Ambos vinculam o loopback por predefinição e aceitam --bind-all.
Aviso: O remoto recusa qualquer encaminhamento cujo destino não seja um convidado na sua própria sub-rede vmnet. Não pode usar um encaminhamento para alcançar o próprio Mac remoto, o seu gateway ou a internet — apenas as VMs de espaço de trabalho.
O túnel de rede à escala do sistema
Quando quiser que qualquer aplicação local — não apenas o painel do navegador — alcance as VMs remotas nos seus endereços literais, ative o túnel por anfitrião com o comutador de rede da barra de ferramentas do espelho (o ícone do caminho triangular, o primeiro na barra de ferramentas). A sua dica indica Ativar acesso direto à rede das VMs do remoto (192.168.x.x a partir de qualquer aplicação local).
Um auxiliar privilegiado de uma só vez — um daemon launchd instalado via SMAppService, sem sudo — cria uma interface utun e encaminha a sub-rede remota para ela, depois devolve o descritor de ficheiro da interface à aplicação. Uma pilha TCP/UDP em espaço de utilizador na aplicação termina cada fluxo e junta-o sobre os mesmos canais de encaminhamento SSH, utilizando a sua identidade SSH. Não há regras pf nem encaminhamento no kernel.
Na primeira vez que o ativa, um alerta intitulado Permitir o auxiliar de rede do Bromure explica a aprovação macOS única:
- Clique no comutador da barra de ferramentas.
- No alerta, abra Definições do Sistema → Geral → Itens de arranque e permita Bromure Agentic Coding (o macOS pede credenciais de administrador uma vez).
- A aplicação sonda a aprovação (a cada 2 segundos, até 5 minutos) e liga-se automaticamente no momento em que esta é concedida. Enquanto aguarda, a dica do comutador indica A aguardar aprovação em Definições do Sistema › Itens de arranque….
Quando o túnel está ativo, a dica indica O acesso direto à rede das VMs do remoto está LIGADO — clique para desligar; se falhar, Falha do túnel de rede — clique para tentar novamente. Desligar o comutador para o túnel e, quando o último anfitrião o desativa, o daemon é cancelado. A definição é memorizada por anfitrião.
Nota: O túnel precisa de uma conta de administrador para a aprovação única. Sem uma, o Bromure continua a funcionar através do caminho SOCKS incorporado — o auxiliar só é necessário para alcançar VMs remotas a partir de outras aplicações. Se o macOS recusar o registo de imediato, um alerta intitulado Não foi possível instalar o auxiliar de rede explica-o, e o comutador tenta novamente no clique seguinte. Um
pinga um convidado remoto é respondido localmente pelo túnel: confirma que o encaminhamento está ativo, não que o convidado está vivo.
Múltiplos remotos (sub-redes por instalação + encaminhamento de frota)
Pode espelhar vários remotos ao mesmo tempo; cada um abre a sua própria janela, encaminhador SOCKS e (opcionalmente) túnel. A armadilha em que isto costumava cair: cada instalação usava historicamente a mesma rede 192.168.64.0/24 para as suas VMs de espaço de trabalho, pelo que dois remotos espelhados anunciavam sub-redes idênticas e a VPN à escala do sistema não os conseguia distinguir.
As sub-redes por instalação corrigem isto na origem. Cada Mac escolhe agora um /24 aleatório dentro de 172.16.0.0/12 — ignorando o intervalo 172.17–172.20 do Docker e qualquer /24 em que o anfitrião já se encontre — e utiliza-o para todas as suas VMs de espaço de trabalho, pelo que duas instalações independentes quase nunca colidem (172.16/12 é também o intervalo privado com menor probabilidade de conflito com uma LAN ou VPN empresarial). No primeiro arranque após a atualização, o Bromure oferece-se para migrar este Mac para uma sub-rede privada — Migrar Agora, Mais Tarde ou Não Perguntar Novamente — e pode alterá-la ou re-aleatorizá-la a qualquer momento em Definições → Recursos → Sub-rede do espaço de trabalho. O endereçamento do convidado é DHCP puro a partir do próprio comutador do Bromure, pelo que isto é inteiramente do lado do anfitrião (sem reconstrução de imagem), e o remoto anuncia a sua sub-rede escolhida em /state para que o cliente nativo e o túnel a sigam automaticamente.
Para o caso raro em que dois remotos ainda partilham uma sub-rede, o primeiro é encaminhado literalmente e ao segundo é atribuído um alias no espaço CGNAT 100.64.<n>.0/24, com um remapeamento 1:1 que preserva o octeto do anfitrião para que ambos possam ser alcançados ao mesmo tempo.
Aviso: O encaminhamento por alias multi-anfitrião está implementado e testado unitariamente, mas a ligação em tempo de execução que costura um PAC e um remapeamento browser-MCP com noção de alias entre anfitriões ainda está pendente. Um único anfitrião remoto é a configuração totalmente suportada hoje. Uma limitação conhecida da atribuição de alias, uma vez ligada, é que uma página de desenvolvimento que emita uma hiperligação literal absoluta
http://192.168.64.xdentro de um remoto com alias pode encaminhar incorretamente; os remotos literais (sem alias) não são afetados.
Expor um servidor de desenvolvimento à internet
Independentemente de tudo o acima, um serviço HTTP individual em execução dentro de um espaço de trabalho pode ser exposto à internet pública com um túnel rápido Cloudflare por porta. Abra o painel de controlo de um espaço de trabalho em execução, encontre o serviço sob o cartão de portas e clique no globo (dica: Expor à internet (túnel rápido Cloudflare)). O Bromure executa um processo cloudflared para essa origem e dá-lhe um URL aleatório https://<name>.trycloudflare.com — não é necessária conta Cloudflare. Um túnel e um URL por serviço; expor ou deixar de expor um nunca perturba os outros.
A cor do globo acompanha o estado: cinzento = desligado, laranja = a instalar ou a iniciar, verde = em execução, vermelho = falhou. Uma linha de estado sob a porta mostra o progresso (A transferir e verificar o cloudflared (~18 MB, uma vez)…, depois A iniciar o túnel…) ou o nome de anfitrião público clicável com um botão de cópia.
Na primeira vez que expõe algo, uma caixa de diálogo de consentimento única intitulada Expor serviços à internet via Cloudflare Tunnel? abrange a transferência, a verificação, os Termos de Serviço da Cloudflare e o facto de que qualquer pessoa com o URL aleatório pode alcançar o serviço. Clique novamente no globo para parar.
O binário cloudflared é uma versão fixada, verificada duas vezes antes de alguma vez ser executado: o SHA-256 do arquivo transferido é comparado com um hash embutido na aplicação, e uma verificação da assinatura de código Developer ID confirma o ID de equipa da Cloudflare. Cada passo é registado no Registo da Cadeia de Fornecimento (consulte Proteção da cadeia de fornecimento). É executado com --no-autoupdate.
Aviso: Os URLs de túnel rápido são públicos para qualquer pessoa que os tenha, e o nome de anfitrião muda sempre que o túnel reinicia (um reinício, um deixar de expor/voltar a expor ou uma falha). Apenas as origens HTTP(S) obtêm um globo — SSH e as portas conhecidas de TCP em bruto ou de bases de dados (22, 1433, 3306, 3389, 5432, 5672, 5900, 6379, 9092, 11211, 27017) e UDP nunca o obtêm, porque um navegador não as conseguiria alcançar através da borda da Cloudflare. Todos os túneis de um espaço de trabalho são desmontados quando a sua VM suspende ou encerra. Uma incompatibilidade de hash na transferência recusa a instalação até que a fixação seja atualizada numa versão da aplicação.
Encaminhamento de retorno de chamada OAuth
Uma CLI a executar dentro de uma VM de espaço de trabalho — gh, gcloud, um início de sessão por subscrição — conclui frequentemente um fluxo OAuth abrindo um navegador no seu Mac anfitrião e aguardando um redirecionamento para http://127.0.0.1:<port>/callback. O Bromure faz essa ponte automaticamente: o anfitrião vincula a porta de loopback tanto em IPv4 como em IPv6, e no primeiro pedido real junta-a sobre vsock 5010 ao próprio 127.0.0.1:<port> do convidado. O redirect_uri nunca é reescrito, pelo que o PKCE e a validação de redirecionamento continuam a passar. Não há nada para configurar — inicie o início de sessão dentro do espaço de trabalho e o redirecionamento é entregue ao convidado.
O encaminhador desmonta-se a si próprio após 300 segundos para que a porta de loopback nunca fique retida indefinidamente. Se a porta do anfitrião já estiver em uso, o fluxo prossegue nativamente sem a ponte, e as pré-ligações especulativas do navegador (sockets que abrem mas nunca enviam) são ignoradas para que não possam encravar um servidor de retorno de chamada de disparo único.
Modelo de segurança
O acesso remoto é poderoso, por isso vale a pena ser preciso quanto às suas fronteiras.
- Desligado por predefinição, uma porta. Nenhum caminho remoto existe até que ative o servidor SSH. Cada caminho — menu humano, CLI, cliente nativo, encaminhamentos de porta, browser MCP — passa por esse único servidor e nenhum outro.
- Encriptação e transporte. Todo o tráfego é SSH. A sondagem de controlo do cliente nativo, as associações de terminal, as transferências de ficheiros, os encaminhamentos de porta e o relay browser-MCP viajam todos dentro da ligação SSH. Como o swift-nio-ssh não tem troca de chaves pós-quântica, um cliente OpenSSH moderno imprimirá um aviso "not using a post-quantum key exchange"; isto é esperado e não indica um ataque de downgrade.
- O bromure.io é um intermediário, não um homem no meio. No caminho de conta, o bromure.io apenas apresenta os seus dois dispositivos e — quando nenhum caminho ponto a ponto direto pode ser construído — retransmite bytes opacos através de um relay TURN (sobre TLS). Nunca termina a sessão SSH: o túnel encriptado é executado de ponta a ponta entre os seus dois Mac. As chaves SSH são partilhadas apenas entre os dispositivos da sua própria conta (nunca os de outro utilizador), cada servidor obtém ele próprio as chaves de dispositivo do seu proprietário, e inscrever-se / terminar sessão é a forma como a confiança de um dispositivo é concedida e revogada. Um dispositivo com a sessão terminada ou inativo durante 90 dias deixa de estar autorizado.
- Quem pode iniciar sessão. Apenas o utilizador macOS exato que lançou a aplicação. A autenticação por palavra-passe é verificada contra o OpenDirectory (sem Início de sessão remoto, sem alterações PAM, sem direitos de administrador), e a autenticação por chave pública aceita apenas as chaves que inscreveu. As tentativas de palavra-passe são limitadas por IP de origem; as chaves não.
- O que uma sessão pode fazer. Um início de sessão humano só pode alcançar o menu remoto — nunca uma shell — pelo que pode criar, configurar e conduzir espaços de trabalho, mas não pode executar comandos arbitrários no anfitrião. Os quatro verbos de máquina do cliente nativo são igualmente restritos: uma ponte de socket de controlo, um encaminhamento para um convidado na sub-rede vmnet e um relay browser-MCP. Os encaminhamentos para o próprio anfitrião, o gateway ou a internet são recusados.
- Os segredos nunca saem do anfitrião. As leituras de perfil remoto têm os segredos apagados e as gravações preservam os segredos; as chaves de API, os tokens e os segredos de ambiente MCP ficam no Mac remoto.
- Confiança na primeira utilização. O cliente nativo fixa a chave de anfitrião do remoto por ponto de extremidade no primeiro contacto e avisa de forma audível em qualquer alteração posterior.
- Consentimento não falsificável pelo convidado. Os pedidos de consentimento MITM levantados por um agente em execução são apresentados no lado do anfitrião da bomba de terminal, onde um convidado comprometido não os consegue ver nem falsificar; qualquer expiração ou desassociação resolve-se em negar. Consulte Gestão do consentimento remoto.
Resolução de problemas
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| Ativar devolve um erro | A imagem base está em falta ou ainda a instalar | O servidor não pode arrancar até que a imagem base esteja presente. Conclua a instalação e depois ative novamente. |
O ssh liga-se mas diz para reconectar com ssh -t | Não foi solicitado um TTY | O menu remoto precisa de um terminal; adicione -t (ou use ssh -t -p 2222 <user>@<mac>). |
| O OpenSSH imprime "not using a post-quantum key exchange" | O swift-nio-ssh não tem troca de chaves PQ | Esperado e inofensivo — a ligação continua encriptada. |
| Uma ligação por endereço continua a pedir uma palavra-passe | A chave deste Mac não está inscrita no remoto | Deixe um início de sessão por palavra-passe inscrevê-la automaticamente, ou execute bromure-cli remote key add '<this Mac's key>' no remoto (Mostrar a chave deste Mac copia-a). |
| Uma ligação bromure.io ainda pede uma palavra-passe | O registo de chaves ainda não autorizou este dispositivo nesse servidor | Aqui o sem-palavra-passe é automático — verifique que tem sessão iniciada no bromure.io em ambos os Mac, que o servidor tem o Acesso Remoto ativo e que ambos executam uma compilação atual (o servidor publica o seu início de sessão e obtém as suas chaves). Dê alguns segundos após ativar o Acesso Remoto. |
| Os meus servidores · bromure.io está vazio | Sem sessão iniciada, ou o servidor não se está a anunciar | Inicie sessão (Janela → Inscrever-se no bromure.io…); no remoto, ative o Acesso Remoto para que envie sinais de vida e apareça. Uma linha esbatida significa que deixou de enviar sinais de vida. |
| «Não foi possível estabelecer uma ligação … através do bromure.io» | Nenhum caminho de rede direto ou retransmitido entre os dois Mac | Confirme que ambos conseguem alcançar o bromure.io; o relay precisa que turns:5349 esteja acessível. Tente novamente — um caminho é retentado na tentativa seguinte. |
| «Alcançado … pelo bromure.io, mas a sua porta de entrada SSH não respondeu» | O Acesso Remoto foi desligado no remoto | Reative o Acesso Remoto no Mac remoto. |
| «O dispositivo bromure.io deste Mac foi revogado. Inicie sessão novamente.» | Este dispositivo teve a sessão terminada / foi revogado (por si, pela consola web, ou por 90 dias de inatividade) | Volte a inscrever-se: Janela → Inscrever-se no bromure.io…. |
| Folha vermelha Confiar na Nova Chave e Continuar | A chave de anfitrião do remoto mudou desde que foi fixada | Verifique fora de banda; só continue se souber por que motivo a chave mudou (reinstalação, novo Mac) — caso contrário, pode ser um atacante intermediário. |
| As ligações em curso caem depois de editar chaves | Adicionar ou remover uma chave autorizada reinicia a escuta | Esperado; reconecte. |
| O painel do navegador permanece em branco | O encaminhador SOCKS ou a sub-rede ainda não está pronto | Aguarde a primeira sondagem /state; certifique-se de que o espaço de trabalho está em execução e que este Mac tem a imagem do navegador instalada. |
| Um encaminhamento é recusado | O destino não é um convidado na sub-rede vmnet do remoto | Os encaminhamentos só podem alcançar VMs de espaço de trabalho, nunca o anfitrião, o gateway ou a internet. |
| O comutador do túnel fica preso em A aguardar aprovação… | O auxiliar privilegiado ainda não foi aprovado | Aprove Bromure Agentic Coding em Definições do Sistema → Geral → Itens de arranque (precisa de administrador). Sem ele, o SOCKS continua a funcionar. |
| As edições de disposição em grelha não pegam no remoto | O remoto está sem monitor | As edições de grelha precisam de uma janela GUI aberta no remoto; tudo o resto continua a ser espelhado. |
Ficheiros, portas e variáveis de ambiente
O estado do lado do servidor reside em ~/Library/Application Support/BromureAC/remote/: hostkey_ed25519 (0600) e o seu .pub, authorized_keys (0600) e a sobreposição opcional overlay-key. A identidade e o estado do cliente nativo residem em ~/Library/Application Support/BromureAC/remote-client/: id_ed25519(.pub) (comentário bromure-ac-fatclient), known_hosts (fixações TOFU), hosts.json (servidores guardados) e a persistência de espelho por anfitrião em hosts/<host-UUID>/. Todo o diretório de suporte é realocado sob CFFIXED_USER_HOME.
| Porta / interface | Função |
|---|---|
TCP 2222 (configurável, ≥ 1024) | O servidor SSH incorporado, vínculo 0.0.0.0 por predefinição. |
TCP 443 de saída + turns:5349 | Apenas caminho de conta bromure.io. Alcançar a sua conta (diretório de dispositivos, rendezvous) e, quando nenhum caminho ponto a ponto direto pode ser construído, o relay TURN sobre TLS. Ambos têm de estar acessíveis a partir de cada dispositivo para o caminho de conta; sem relação com o caminho por endereço. |
| Convidado vsock 5010 | Relay de loopback sempre ativo em cada VM — o caminho para os encaminhamentos de porta e a entrega de retornos de chamada OAuth. |
| Convidado vsock 5830 | O fluxo browser-MCP do agente do espaço de trabalho, retransmitido para o painel do navegador do cliente nativo. |
Porta efémera, vínculo 0.0.0.0 | Encaminhador SOCKS5 por anfitrião (filtrado por pares para o loopback e a sub-rede de navegador 192.168.127.x). |
192.168.127.0/24 | A sub-rede de VM de navegador local fixada do cliente nativo. |
100.64.<n>.0/24 | Sub-redes de alias CGNAT atribuídas numa colisão de sub-rede de frota. |
As chaves UserDefaults relevantes (domínio io.bromure.agentic-coding) são remoteAccess.enabled, remoteAccess.port, remoteAccess.bindAddress, remoteAccess.passwordAuth, remoteAccess.pubkeyAuth, fatclient.tunnel.<host-UUID> e cloudflareTunnel.consented. As variáveis de ambiente de diagnóstico incluem BROMURE_OVERLAY_KEY (atalho do menu remoto), BROMURE_FATCLIENT_LOG (registo detalhado do cliente nativo) e BROMURE_FATCLIENT_UTUN (forçar a ativação da opção do túnel à escala do sistema — o comutador da barra de ferramentas é o caminho do produto). A referência completa da CLI, incluindo o encanamento oculto __forward, __forward-socks, __dial e __attach-window, está em Automatização e a CLI.