通过 SSH 隧道传输 apt-get 大部分情况下是可行的

通过 SSH 隧道传输 apt-get 大部分情况下是可行的

我在 Proxmox 4.4 下运行 Linux 容器。该容器基于 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

由于 HTTP 协议的标头,您的方法不起作用Host:

正常情况下,HTTP 客户端(在本例中为apt-get)会发送标头Host: ftp.debian.org,让服务器知道要加载哪个网站,以防服务器托管多个域。

您所做的是发送apt-getHost: localhost:39860但远程服务器上可能没有任何结果。这解释了您的 HTTP 404 Not Found 错误。


拟议决议

在您的主机上放置一个 HTTP 代理,并通过 SSH 端口转发使其可供您的容器使用。

  1. 安装乌贼在连接互联网的机器上。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. 使用以下命令从连接 Internet 的机器连接到您的容器:

    ssh -R8080:localhost:8080 myRemoteUserName@myRemoteHostname
    

    myRemoteUserName@myRemoteHostname用您的容器的登录凭据替换。

  5. 在容器内,创建一个名为的新文件,/etc/apt/apt.conf.d/80proxy其内容如下:

    Acquire::http::Proxy "http://localhost:8080/";
    
  6. 只要步骤#4中的连接已建立,容器的apt包管理器现在就可以发出远程请求。

如果你需要为代理添加站点限制,请查看限制 Squid 仅访问一个站点

相关内容