![通过 SSH 隧道传输 apt-get 大部分情况下是可行的](https://linux22.com/image/1534922/%E9%80%9A%E8%BF%87%20SSH%20%E9%9A%A7%E9%81%93%E4%BC%A0%E8%BE%93%20apt-get%20%E5%A4%A7%E9%83%A8%E5%88%86%E6%83%85%E5%86%B5%E4%B8%8B%E6%98%AF%E5%8F%AF%E8%A1%8C%E7%9A%84.png)
我在 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-get
,Host: localhost:39860
但远程服务器上可能没有任何结果。这解释了您的 HTTP 404 Not Found 错误。
拟议决议
在您的主机上放置一个 HTTP 代理,并通过 SSH 端口转发使其可供您的容器使用。
- 安装乌贼在连接互联网的机器上。Ubuntu/Debian:
sudo apt install squid
将此配置写入
/etc/squid/squid.conf
:http_port 8080 acl container src XXX.XXX.XXX.XXX/32 http_access allow container
替换
XXX.XXX.XXX.XXX
为您的容器的 IP 地址。- 使用 启动或重启 Squid
service squid restart
。 使用以下命令从连接 Internet 的机器连接到您的容器:
ssh -R8080:localhost:8080 myRemoteUserName@myRemoteHostname
myRemoteUserName@myRemoteHostname
用您的容器的登录凭据替换。在容器内,创建一个名为的新文件,
/etc/apt/apt.conf.d/80proxy
其内容如下:Acquire::http::Proxy "http://localhost:8080/";
- 只要步骤#4中的连接已建立,容器的
apt
包管理器现在就可以发出远程请求。
如果你需要为代理添加站点限制,请查看限制 Squid 仅访问一个站点。