web-dev-qa-db-ja.com

トンネリングapt-getThrough SSH Works ...主に

Proxmox4.4でLinuxコンテナを実行しています。コンテナはDebianJessieに基づいています。バージョンの詳細は次のとおりです。

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トンネルを経由することです。そのため、パッケージ管理(apt-getなど)にSSHトンネルを使用しています。これはほとんど機能しているようですが、警告やエラーが発生することがあります。

これが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

updated/ 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 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.

最後に表示される警告とエラーを回避するにはどうすればよいですか?

2
Dave

HTTPプロトコルのHost:ヘッダーが原因で、このアプローチは機能しません。

通常の状況では、HTTPクライアント(この場合はapt-get)はヘッダーHost: ftp.debian.orgを送信します。これにより、サーバーが複数のドメインをホストしている場合に、ロードするWebサイトをサーバーに通知します。

apt-getHost: localhost:39860を送信させます。これは、リモートサーバー上に何も存在しない可能性があります。これがHTTP404 NotFoundエラーの説明です。


提案された解決策

ホストに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. service squid restartでSquidを起動または再起動します。
  4. 次のコマンドを使用して、インターネットに接続されたマシンからコンテナに接続します。

    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アクセスを1つのサイトのみに制限

4
Deltik