Tunneling apt-get Através do SSH Works… Principalmente

0

Estou executando um contêiner Linux no Proxmox 4.4. O contêiner é baseado no Debian Jessie. Aqui estão os detalhes da versão:

root@myHostName:/home/myUserName# uname -a
Linux myHostName 4.4.35-1-pve #1 SMP Fri Dec 9 11:09:55 CET 2016 x86_64 GNU/Linux
root@myHostName:/home/myUserName# cat /etc/debian_version
8.6
root@myHostName:/home/myUserName# cat /etc/issue
Debian GNU/Linux 8 \n \l

Este contêiner é isolado. Sua única saída é através de um túnel SSH. E assim, estou usando um túnel SSH para gerenciamento de pacotes (apt-get, etc.). Isso parece estar funcionando principalmente, mas eu recebo alguns avisos / erros ocasionais.

Aqui está o original /etc/apt/sources.list:

deb http://ftp.debian.org/debian jessie main contrib
deb http://ftp.debian.org/debian jessie-updates main contrib
deb http://security.debian.org jessie/updates main contrib

Aqui está o que atualizou /etc/apt/sources.list:

deb http://localhost:39860/debian jessie main contrib
deb http://localhost:39860/debian jessie-updates main contrib
deb http://localhost:39861 jessie/updates main contrib

Veja como eu crio o túnel SSH:

ssh -N -L39860:ftp.debian.org:80 -L39861:security.debian.org:80 myRemoteUserName@myRemoteHostname

Aqui está o que acontece quando executo o apt-get update :

root@myHostName:/home/myUserName# apt-get update
Ign http://localhost:39860 jessie InRelease
Hit http://localhost:39860 jessie-updates InRelease
Ign http://localhost:39861 jessie/updates InRelease
Hit http://localhost:39860 jessie Release.gpg
Get:1 http://localhost:39860 jessie-updates/main amd64 Packages/DiffIndex [8392 B]
Hit http://localhost:39860 jessie-updates/contrib amd64 Packages
Hit http://localhost:39860 jessie-updates/contrib Translation-en
Get:2 http://localhost:39860 jessie-updates/main Translation-en/DiffIndex [3196 B]
Ign http://localhost:39861 jessie/updates Release.gpg
Hit http://localhost:39860 jessie Release
Ign http://localhost:39861 jessie/updates Release
Hit http://localhost:39860 jessie/main amd64 Packages
Hit http://localhost:39860 jessie/contrib amd64 Packages
Hit http://localhost:39860 jessie/contrib Translation-en
Hit http://localhost:39860 jessie/main Translation-en
Err http://localhost:39861 jessie/updates/main amd64 Packages
  404  Not Found [IP: ::1 39861]
Err http://localhost:39861 jessie/updates/contrib amd64 Packages
  404  Not Found [IP: ::1 39861]
Ign http://localhost:39861 jessie/updates/contrib Translation-en
Ign http://localhost:39861 jessie/updates/main Translation-en
Fetched 11.6 kB in 9s (1279 B/s)
W: Failed to fetch http://localhost:39861/dists/jessie/updates/main/binary-amd64/Packages  404  Not Found [IP: ::1 39861]

W: Failed to fetch http://localhost:39861/dists/jessie/updates/contrib/binary-amd64/Packages  404  Not Found [IP: ::1 39861]

E: Some index files failed to download. They have been ignored, or old ones used instead.

Como posso entender melhor os avisos e erros mostrados no final?

    
por Dave 06.07.2017 / 15:01

1 resposta

2

Sua abordagem não funciona devido ao cabeçalho Host: do protocolo HTTP.

Em circunstâncias normais, o cliente HTTP (nesse caso, apt-get ) envia o cabeçalho Host: ftp.debian.org , que permite ao servidor saber qual site carregar, caso o servidor esteja hospedando vários domínios.

O que você fez é tornar apt-get send Host: localhost:39860 , o que provavelmente acaba não sendo nada no servidor remoto. Isso explica seus erros HTTP 404 não encontrados.

Resolução proposta

Coloque um proxy HTTP em seu host e disponibilize-o para seu contêiner por meio do encaminhamento de porta SSH.

  1. Instale o Squid na sua máquina conectada à Internet. Ubuntu / Debian: sudo apt install squid
  2. Escreva esta configuração em /etc/squid/squid.conf :

    http_port 8080
    
    acl container src XXX.XXX.XXX.XXX/32
    http_access allow container
    

    Substitua XXX.XXX.XXX.XXX pelo endereço IP do seu contêiner.

  3. Inicie ou reinicie o Squid com service squid restart .
  4. Conecte-se ao seu contêiner da sua máquina conectada à Internet com este comando:

    ssh -L8080:localhost:8080 myRemoteUserName@myRemoteHostname
    

    Substitua myRemoteUserName@myRemoteHostname pelas credenciais de login para seu contêiner.

  5. Dentro do contêiner, crie um novo arquivo chamado /etc/apt/apt.conf.d/80proxy com o seguinte conteúdo:

    Acquire::http::Proxy "http://localhost:8080/";
    
  6. Desde que a conexão da etapa 4 esteja ativa, o gerenciador de pacotes apt do seu contêiner agora pode fazer solicitações remotas.

Se você precisar adicionar restrições de site ao seu proxy, confira Restringir o acesso ao Squid a apenas um site .

    
por 06.07.2017 / 16:57