CUBE SUGAR CONTAINER

技術系のこと書きます。

インターネットに疎通のないマシンに SSH Remote Port Forwarding + Squid で Web にアクセスさせる

インターネットに直接つながっていないマシンというのは意外とよくある。 とはいえ、そういったマシンでも当然のことながらセットアップ等の作業は必要になる。 その際、作業に必要なファイルは大抵の場合に SCP などで転送することになると思う。 とはいえ、もしマシンから直接 Web につながれば楽ができるはず。 今回は、そういった状況で SSH Remote Port Forwarding と Squid (Web プロキシのソフトウェア) を使って Web への疎通を提供する方法を試してみる。 なお、提供できるのはあくまで HTTP/HTTPS 等に限られ、ICMP や UDP といったプロトコルは通らない。

構成について

最初に、ざっくりとした構成図を以下に示す。 インターネットにつながらないマシンは SSH Server を想定する。 そして、SSH Client がインターネットにつながるマシンで、SSH Server に接続しに行く。 SSH Client のマシンでは Squid を 8080 ポートで起動している。 今回の主眼は、SSH Client のマシンの 8080 ポートを Remote Port Forwarding で SSH Server にも見えるようにするところ。 SSH Server は自身の 8080 ポートを Web プロキシとして利用することで、Web への疎通が手に入る。

f:id:momijiame:20190616102958p:plain

使った環境について

続いては、今回の検証に使った環境について説明する。

インターネットにつながっているマシン (SSH Client) としては、以下の通り macOS のマシンを用意した。

$ sw_vers    
ProductName:    Mac OS X
ProductVersion: 10.14.5
BuildVersion:   18F132

このマシンは、次のようにインターネットに疎通がある。

$ ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=56 time=9.156 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=30.316 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=18.479 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 9.156/19.317/30.316/8.659 ms

そして、インターネットにつながっていないマシン (SSH Server) は、以下の通り Ubuntu 18.04 LTS のマシンを用意した。 このマシンは VirtualBox を使って先ほどの macOS 上で仮想マシンとして稼働させている。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
$ uname -r
4.15.0-51-generic

こちらは以下のようにインターネットに疎通がない。 かろうじて 192.168.33.0/24 のネットワークを経由して前述した macOS のマシンと疎通がある。

$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:42:06:7b brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe42:67b/64 scope link 
       valid_lft forever preferred_lft forever
$ ip route show
192.168.33.0/24 dev enp0s8 proto kernel scope link src 192.168.33.10 
$ ping -c 3 8.8.8.8
connect: Network is unreachable

なお、このマシンは Vagrant + VirtualBox を使って仮想マシンとして用意した。 前述した macOS 上で稼働している。 ただし SSH については vagrant コマンドを使う代わりに、次のようにしてログインしている。

$ ssh -i .vagrant/machines/default/virtualbox/private_key \
  -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
  -l vagrant 192.168.33.10

Web プロキシをインストールする

ここからは、実際に SSH Server のマシンに Web への疎通を提供するまでに必要な作業について記載していく。 まずは SSH Client 側のマシンに Squid (Web プロキシ) をインストールする。

使っているのが macOS なので Homebrew を使うと楽にインストールできる。

$ brew install squid

コンフィグを編集する場合には、初期状態のものをコピーしてバックアップしておく。

$ cp $(brew --prefix)/etc/squid.conf{,.bak}

今回はコンフィグの編集例として、使うポートをよく利用される 8080 に変更してみる。

$ sed -i -e "
  s:^http_port.*$:http_port 8080:
" $(brew --prefix)/etc/squid.conf
$ grep http_port $(brew --prefix)/etc/squid.conf      
http_port 8080

あと、念のため次のようにしてどのような ACL が入っているのか、あらかじめ確認しておいた方が良いと思う。 オープンプロキシになってると危険なので。 とはいえ、おそらくデフォルトでプライベートアドレスからのアクセスしか認めないようになっているはず。

$ grep acl $(brew --prefix)/etc/squid.conf
$ grep deny $(brew --prefix)/etc/squid.conf

Squid のサービスを開始する。

$ brew services start squid

次のように 8080 ポートを Listen していれば良い。

$ lsof -i:8080 | grep -i squid
squid     58763 amedama   14u  IPv6 0x4e9127c629e616d5      0t0  TCP *:http-alt (LISTEN)

Remote Port Forwarding で Web プロキシを利用する

続いては SSH Server 側の作業に入る。

やることは単純で、次のように SSH するときに -R オプションで Remote Port Forwarding する。 以下では自身の 8080 ポートをリモートの localhost:8080 で見られるようにしている。

$ ssh -i .vagrant/machines/default/virtualbox/private_key \
      -R 8080:localhost:8080 \
      -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
      -l vagrant 192.168.33.10

ログインしたらポートを localhost:8080 で Listen していることを確認しておこう。

$ ss -tlnp | grep 8080
LISTEN   0         128               127.0.0.1:8080             0.0.0.0:*       
LISTEN   0         128                   [::1]:8080                [::]:*       

これで localhost:8080 経由で Web プロキシが使えるようになった。 あとは一般的なプロキシを使うのと同じ。 例えば環境変数に設定を入れておこう。

$ export http_proxy=http://localhost:8080
$ export https_proxy=$http_proxy

試しに wget を使って Ubuntu のイメージファイルのハッシュファイルを取得してみよう。

$ wget http://ftp.riken.jp/Linux/ubuntu-releases/bionic/SHA256SUMS

次のように、ちゃんと取得できれば上手くいっている。

$ cat SHA256SUMS 
22580b9f3b186cc66818e60f44c46f795d708a1ad86b9225c458413b638459c4 *ubuntu-18.04.2-desktop-amd64.iso
ea6ccb5b57813908c006f42f7ac8eaa4fc603883a2d07876cf9ed74610ba2f53 *ubuntu-18.04.2-live-server-amd64.iso

いじょう。

Squid Proxy Server 3.1: Beginner's Guide (English Edition)

Squid Proxy Server 3.1: Beginner's Guide (English Edition)

Squid: The Definitive Guide: The Definitive Guide (Definitive Guides) (English Edition)

Squid: The Definitive Guide: The Definitive Guide (Definitive Guides) (English Edition)