Я использую контейнер Linux под Proxmox 4.4. Контейнер основан на Debian Jessie. Вот особенности версии:

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

Этот контейнер изолирован. Единственный выход - через туннель SSH. Итак, я использую туннель SSH для управления пакетами (apt-get и т.д.). Похоже, это в основном работает, но иногда я получаю некоторые предупреждения / ошибки.

Вот оригинальный /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

Вот что обновил /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

Вот как я создаю SSH-туннель:

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

Вот что происходит, когда я выполняю обновление apt-get:

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.

Как мне лучше обойти предупреждения и ошибки, показанные в конце?

1 ответ1

2

Ваш подход не работает из-за заголовка Host: протокола HTTP.

В обычных условиях HTTP-клиент (в данном случае apt-get) отправляет заголовок Host: ftp.debian.org , который позволяет серверу узнать, какой веб-сайт следует загрузить, если на сервере размещено несколько доменов.

Вы сделали make apt-get send Host: localhost:39860 , который, скорее всего, окажется на удаленном сервере. Это объясняет ваши ошибки HTTP 404 Not Found.


Предлагаемая резолюция

Разместите HTTP-прокси на вашем хосте и сделайте его доступным для вашего контейнера через переадресацию порта SSH.

  1. Установите Squid на свой компьютер, подключенный к Интернету. Ubuntu/Debian: sudo apt install squid
  2. Запишите эту конфигурацию в /etc/squid/squid.conf:

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

    Замените XXX.XXX.XXX.XXX на IP-адрес вашего контейнера.

  3. Запустите или перезапустите Squid с помощью service squid restart .
  4. Подключитесь к вашему контейнеру с компьютера, подключенного к Интернету, с помощью этой команды:

    ssh -L8080:localhost:8080 myRemoteUserName@myRemoteHostname
    

    Замените myRemoteUserName@myRemoteHostname на учетные данные для входа в ваш контейнер.

  5. Внутри контейнера создайте новый файл /etc/apt/apt.conf.d/80proxy со следующим содержимым:

    Acquire::http::Proxy "http://localhost:8080/";
    
  6. Пока соединение с шага # 4 установлено, менеджер пакетов apt вашего контейнера теперь может делать удаленные запросы.

Если вам нужно добавить ограничения сайта на ваш прокси, проверьте Ограничение доступа Squid только к одному сайту.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .