1. 記事一覧 >
  2. ブログ記事
Unix/Linux
category logo

いろいろなproxy - curl,apt,git,npm,pip,Next.jsのfetch,yum,dnf,composer,pkg

(更新) (公開)

はじめに

以下の図のように、インターネットに直接出られない環境があるとき、Proxyサーバーを使います。ProxyサーバーのSquid、各コマンドのProxy設定、オプションをすぐに忘れて、そのたびに個別にググっていますので、ここにまとめて書きたいと思います。

※説明簡略化のため、Squidは 認証無し のとりあえず動けば良いという設定です。これを使う前提になります。組織によっては、セキュリティ上問題あるかもしれませんので、本格運用の際は慎重に設定してください。


【目次】

Squidインストール
全体のProxy
curl
apt
git
npm
pip
Next.jsのfetch
yum
dnf
phpのcopy
composer-setup.php
composer
pkg(FreeBSD)


root権限で作業していますので、全てsudoは省略しています。

Squidインストール

【検証環境】

Raspberry Pi OS(Raspberry 4 本体)

/etc/debian_version:10.9

lsb_release -a:Raspbian GNU/Linux 10 (buster)

uname -a:Linux raspberrypi 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l GNU/Linux

Squid(スクウィッド)はプロキシ (Proxy) サーバー、ウェブキャッシュサーバーなどに利用されるフリーソフトウェアです。
今回、プロキシサーバーとして、これを利用する前提になります。認証設定は、無しです。http://, https:// 以外は未検証です。


apt updateでパッケージリストを更新します。

# apt update
Do you want to accept these changes and continue updating from this repository? [y/N]y

※以降基本的にyのため、-yを付けます。
 -y は、? [y/N]: のようなときに自動的に y とするオプションです。


apt upgradeでパッケージを更新し、Squidをインストールします。
apt updateapt upgradeは環境によっては必要ありません。

# apt upgrade -y
# apt install squid -y

Squidの設定を作成します。

# mv /etc/squid/squid.conf /etc/squid/squid.conf.org
# vi /etc/squid/squid.conf
# 接続クライアントのネットワークを指定(ご自身の環境に応じて変更が必要です)
acl localnet src 192.168.1.0/24 

# SSL(HTTPS)接続時に 443 ポート以外の CONNECT を拒否
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports

# 接続先として指定されているポート以外を拒否
acl Safe_ports port 80    # http
acl Safe_ports port 21    # ftp
acl Safe_ports port 443   # https
acl Safe_ports port 70    # gopher
acl Safe_ports port 210   # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280   # http-mgmt
acl Safe_ports port 488   # gss-http
acl Safe_ports port 591   # filemaker
acl Safe_ports port 777   # multiling http
http_access deny !Safe_ports

# ローカルネットワークからのアクセスを許可
http_access allow localnet

# 自身からのアクセスを許可
http_access allow localhost

# キャッシュしないよう設定
no_cache deny all

# Squid が使用するポート
http_port 3128

# core 出力場所の設定
coredump_dir /var/spool/squid

# QueryStringの記録
strip_query_terms off

# ログの保存先と形式(Apache風)
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User-Agent}>h" %Ss:%Sh
access_log /var/log/squid/access.log combined

なお、設定は、こちらの参考記事ほぼそのままです。
【ラズベリーパイ4】Squidでプロキシサーバを自作する方法 https://algorithm.joho.info/raspberry-pi/squid-raspberry-pi/


Squidを再起動します。

# systemctl restart squid

⇒何も出力されなければ、成功です。


以降、このプロキシサーバーを 192.168.0.158:3128 として進めていきます。


全体のProxy

※FreeBSDの場合は、pkg(FreeBSD)を参照してください。

【検証環境】

Ubuntu 20.04.2

# vi /etc/environment
http_proxy="http://192.168.0.158:3128"
HTTP_PROXY="http://192.168.0.158:3128"
https_proxy="http://192.168.0.158:3128"
HTTPS_PROXY="http://192.168.0.158:3128"
ftp_proxy="ftp://192.168.0.158:3128"
FTP_PROXY="ftp://192.168.0.158:3128"
no_proxy=".example.co.jp,.test.local,server1.example.com,server2.example.com"

no_proxy=は、プロキシサーバーを通したくない通信先です。

一度ログアウトしてログインしないと反映されません。もしくは、rootの場合、exitsu -で反映されます。


一時的な場合

export http_proxy="http://192.168.0.158:3128"
export HTTP_PROXY="http://192.168.0.158:3128"
export https_proxy="http://192.168.0.158:3128"
export HTTPS_PROXY="http://192.168.0.158:3128"
export ftp_proxy="ftp://192.168.0.158:3128"
export FTP_PROXY="ftp://192.168.0.158:3128"
export no_proxy=".example.co.jp,.test.local,server1.example.com,server2.example.com"

動作確認

# curl --head https://www.yahoo.co.jp/
HTTP/1.1 200 Connection established
(略 以降も同様に略)

curl

【検証環境】

Ubuntu 20.04.2

環境変数:○

○の意味:環境変数を設定した場合、オプションや設定無しでもプロキシへ通信が行くという意味です。例えば、curlの場合、-xまたは、--proxyオプション無しでもプロキシサーバーが使われます。


# curl --head https://www.yahoo.co.jp/ -x http://192.168.0.158:3128
HTTP/1.1 200 Connection established

# curl --head https://www.yahoo.co.jp/ --proxy http://192.168.0.158:3128
HTTP/1.1 200 Connection established

apt

【検証環境】

Ubuntu 20.04.2

環境変数:○


# vi /etc/apt/apt.conf.d/apt.conf
Acquire::http::proxy "http://192.168.0.158:3128";
Acquire::https::proxy "http://192.168.0.158:3128";
Acquire::ftp::proxy "ftp://192.168.0.158:3128";

動作確認

# which curl

# apt install curl
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libcurl4
(略)
Fetched 396 kB in 7s (55.2 kB/s)
(Reading database ... 147843 files and directories currently installed.)
Preparing to unpack .../libcurl4_7.68.0-1ubuntu2.6_amd64.deb ...
(略)
# which curl
/usr/bin/curl

環境によっては、事前にapt updateが必要かもしれません。


git

【検証環境】

Ubuntu 20.04.2

環境変数:○


# git config --global http.proxy http://192.168.0.158:3128
# git config --global https.proxy http://192.168.0.158:3128

動作確認

# git config --global --list 
http.proxy=http://192.168.0.158:3128
https.proxy=http://192.168.0.158:3128
# git clone https://github.com/itc-lab/itc-blog.git
Cloning into 'itc-blog'...
remote: Enumerating objects: 517, done.
remote: Counting objects: 100% (517/517), done.
remote: Compressing objects: 100% (343/343), done.
(略)

Proxy設定解除

# git config --global --unset http.proxy
# git config --global --unset https.proxy
# git config --global --list

npm

【検証環境】

CentOS 7.6.1810

環境変数:○


# npm -g config set proxy http://192.168.0.158:3128
# npm -g config set https-proxy http://192.168.0.158:3128

動作確認

# npm -g config list | grep proxy
https-proxy = "http://192.168.0.158:3128/"
proxy = "http://192.168.0.158:3128/"
# npm install -g yarn

> yarn@1.22.11 preinstall /usr/local/lib/node_modules/yarn
> :; (node ./preinstall.js > /dev/null 2>&1 || true)

/usr/local/bin/yarn -> /usr/local/lib/node_modules/yarn/bin/yarn.js
/usr/local/bin/yarnpkg -> /usr/local/lib/node_modules/yarn/bin/yarn.js
+ yarn@1.22.11
added 1 package in 7.238s

Proxy設定解除

# npm -g config delete proxy
# npm -g config delete https-proxy
# npm -g config list | grep proxy

pip

【検証環境】

Raspberry Pi Desktop OS

Debian GNU/Linux 10 (buster)

環境変数:○


# pip install wiringpi --proxy http://192.168.0.158:3128
Collecting wiringpi
  Using cached wiringpi-2.60.1.tar.gz (130 kB)
Building wheels for collected packages: wiringpi
  Building wheel for wiringpi (setup.py) ... done
  Created wheel for wiringpi: filename=wiringpi-2.60.1-cp38-cp38-linux_x86_64.whl size=333652 sha256=52a39cf1be009f9c8dc61d6e7624446eb91755cf5fd6a702b5184064646832e8
  Stored in directory: /root/.cache/pip/wheels/9e/28/68/323be0608c36361080a9172fcf56395eda64e45315c4d2de40
Successfully built wiringpi
Installing collected packages: wiringpi
Successfully installed wiringpi-2.60.1

Next.jsのfetch

【検証環境】

CentOS 7.6.1810

npm view next version: 11.1.0

環境変数:×


このブログ、ビルド時にNext.jsのfetchでmicroCMSとtwitterのAPIをGETしているのですが、環境変数、npmをproxy設定してもfetch関数は、proxyを使わず、明示的に実装する必要がありました。


$ cd itc-blog
$ npm install https-proxy-agent

ソースコード実装変更

  const key = {
    headers: header,
  };
  const total_count_data: ContentRootObject = await fetch(
    `${process.env.API_URL}contents/?limit=0`,
    key
  )
    .then((res) => res.json())
    .catch(() => null);


環境変数https_proxyを読み取るように変更

import { HttpsProxyAgent } from 'https-proxy-agent';
  const proxy = process.env.https_proxy;
  const key = proxy
    ? {
        headers: header,
        agent: new HttpsProxyAgent(proxy),
      }
    : {
        headers: header,
      };
  const total_count_data: ContentRootObject = await fetch(
    `${process.env.API_URL}contents/?limit=0`,
    key
  )
    .then((res) => res.json())
    .catch(() => null);

yum

【検証環境】

CentOS 7.6.1810

環境変数:○


# vi /etc/yum.conf

以下を追記 ※[main]のセクション

proxy=http://192.168.0.158:3128

動作確認

# which python3
/usr/bin/which: no python3 in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
# yum install python3
読み込んだプラグイン:fastestmirror, langpacks
Determining fastest mirrors
epel/x86_64/metalink              | 7.2 kB  00:00:00
 * base: ftp-srv2.kddilabs.jp
(略)
総ダウンロード容量: 9.3 M
インストール容量: 47 M
Is this ok [y/d/N]:y
(略)
# which python3
/bin/python3

dnf

【検証環境】

CentOS 8.3.2011

環境変数:○


# vi /etc/dnf/dnf.conf

以下を追記 ※[main]のセクション

proxy=http://192.168.0.158:3128

動作確認

# which php
/usr/bin/which: no php in (/home/admin/.local/bin:/home/admin/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
# dnf install php
CentOS Linux 8 - AppStream  89% [===================================================================-        ] 399 kB/s | 7.9 MB     00:02 ETA
(略)
# which php
/usr/bin/php

phpのcopy

【検証環境】

CentOS 8.3.2011

PHP 7.2.24

環境変数:×


# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
PHP Warning:  copy(): php_network_getaddresses: getaddrinfo failed: Name or service not known in Command line code on line 1
PHP Warning:  copy(https://getcomposer.org/installer): failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known in Command line code on line 1

とエラーになるので、stream_context_create(['http' => ['proxy' => 'tcp://192.168.0.158:3128']])を追加

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php', stream_context_create(['http' => ['proxy' => 'tcp://192.168.0.158:3128']]));"

⇒composer-setup.phpがカレントフォルダに置かれればOK


composer-setup.php

【検証環境】

CentOS 8.3.2011

PHP 7.2.24

環境変数:○


# php composer-setup.php
All settings correct for using Composer
Downloading...
The "https://getcomposer.org/versions" file could not be downloaded: php_network_getaddresses: getaddrinfo failed: Name or service not known
failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known
Retrying...
The "https://getcomposer.org/versions" file could not be downloaded: php_network_getaddresses: getaddrinfo failed: Name or service not known
failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known
Retrying...
The "https://getcomposer.org/versions" file could not be downloaded: php_network_getaddresses: getaddrinfo failed: Name or service not known
failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known
The download failed repeatedly, aborting.

とエラーになるので、環境変数をセットして実行

# https_proxy=http://192.168.0.158:3128 php composer-setup.php
All settings correct for using Composer
Downloading...

Composer (version 2.1.6) successfully installed to: /home/admin/composer.phar
Use it: php composer.phar

composer

【検証環境】

CentOS 8.3.2011

PHP 7.2.24

環境変数:○


# HTTP_PROXY="http://192.168.0.158:3128" HTTPS_PROXY="http://192.168.0.158:3128" composer install
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking monolog/monolog (1.0.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing monolog/monolog (1.0.2): Extracting archive
Generating autoload files

pkg(FreeBSD)

【検証環境】

FreeBSD 13.0-RELEASE

環境変数:○


FreeBSDとLinuxの環境変数の設定方法は、異なります。
FreeBSDの場合、以下です。


ログインシェル=csh, tcshの場合

# echo $SHELL
/bin/csh
# setenv HTTP_PROXY http://192.168.0.158:3128
# setenv HTTPS_PROXY http://192.168.0.158:3128

ログインシェル=csh, tcshの場合の設定

# vi /etc/csh.cshrc

以下を追記

setenv HTTP_PROXY http://192.168.0.158:3128
setenv HTTPS_PROXY http://192.168.0.158:3128

※一度exitしてログインしなおすか、source /etc/csh.cshrcコマンドで有効化します。


ログインシェル=shの場合

# echo $SHELL
/bin/sh
# HTTP_PROXY=http://192.168.0.158:3128
# HTTPS_PROXY=http://192.168.0.158:3128
# export HTTP_PROXY
# export HTTPS_PROXY

ログインシェル=shの場合の設定

# vi /etc/profile

以下を追記

HTTP_PROXY=http://192.168.0.158:3128
HTTPS_PROXY=http://192.168.0.158:3128
export HTTP_PROXY
export HTTPS_PROXY

※一度exitしてログインしなおす必要があります。


pkgのProxy設定

pkg自体は既にインストール済みとします。(プロキシを使う場合、上記の環境変数をセットしてインストールできます。)

# vi /usr/local/etc/pkg.conf

以下を追記

pkg_env : {
    http_proxy: "http://192.168.0.158:3128"
    https_proxy: "http://192.168.0.158:3128"
}

動作確認

# pkg install curl
Updating FreeBSD repository catalogue...
Fetching meta.conf: 100%    163 B   0.2kB/s    00:01
Fetching packagesite.txz: 100%    6 MiB   3.3MB/s    00:02
Processing entries: 100%
FreeBSD repository update completed. 30742 packages processed.
(略)
# which curl
/usr/local/bin/curl

loading...