Edited at

sshdとautosshだけでSocks5 Proxyをつくる


はじめに

ひょんなことから、Socks Proxy Serverが必要になった。が用意できる環境が非力すぎて、danteなど、まともなSocks Serverを立てるリソースがない状態だった。

常設の必要はないので、sshdのdynamic forwardingを使えばいいじゃないか。というわけで、さっそく作ってみることにした。

あと、sshの接続を維持するためのautosshをつかえば切断されても自動でつながるよね。

ついでにsystemdに組み込めば簡易サービスになるよね。

という考えからautosshとsystemdのスクリプトを使うことにする


必要なツールを入れる(ここでは環境はRaspberry PI Zero + Raspbianを使っている)

sudo apt install -y autossh


実行ユーザの作成と秘密鍵・公開鍵ペア、フィンガープリントの作成

$ sudo /usr/sbin/useradd --groups sudo -m autossh

$ sudo passwd autossh

新しい UNIX パスワードを入力してください: 任意[ENTER]
新しい UNIX パスワードを再入力してください: 任意[ENTER]
passwd: パスワードは正しく更新されました

$ su - autossh
$ ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/autossh/.ssh/id_rsa): [ENTER]
Created directory '/home/autossh/.ssh'.
Enter passphrase (empty for no passphrase): [ENTER]
Enter same passphrase again:
Your identification has been saved in /home/autossh/.ssh/id_rsa.
Your public key has been saved in /home/autossh/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:KTyDMS738W29S8rSGPPCkfBiZR804IAWeH/MRIdS6CA autossh@raspberrypi
The key's randomart image is:
+---[RSA 2048]----+
| ..o.++o. |
| E = ooo.o |
| +o+ =.. . |
| . =+ *.. |
| . + **So . |
| o .o**... |
| ..o.Bo o |
| =ooo . |
| oo o. |
+----[SHA256]-----+

$ cp .ssh/id_rsa.pub .ssh/authorized_keys
$ ssh -i .ssh/id_rsa autossh@127.0.0.1

The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:9coF7Xf+7ir1v911xevWGK3OoS9wgY1Gq9KTm68taE4.
Are you sure you want to continue connecting (yes/no)? yes [ENTER]

$ exit

Connection to 127.0.0.1 closed.

$ exit


起動制御のためのスクリプトを書く

受付ポートは1080で受けるように設定

sudo vim /etc/systemd/system/autossh.service

中身はこんな感じに


/etc/systemd/system/autossh.service

[Unit]

Description=Autossh Socks5 Service
After=network.target

[Service]
User=autossh
ExecStart=/usr/bin/autossh -M 0 -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" autossh@127.0.0.1 -D 0.0.0.0:1080 -i /home/autossh/.ssh/id_rsa

[Install]
WantedBy=multi-user.target



テスト

早速動かしてみる。特に鍵ファイルのパーミッションに問題がなければすんなり動くはず

$ sudo systemctl enable autossh.service

Created symlink /etc/systemd/system/multi-user.target.wants/autossh.service → /etc/systemd/system/autossh.service.

$ sudo systemctl start autossh.service

$ sudo systemctl status autossh.service

● autossh.service - Autossh Socks5 Service
Loaded: loaded (/etc/systemd/system/autossh.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-08-13 22:19:11 JST; 26min ago
Main PID: 7924 (autossh)
CGroup: /system.slice/autossh.service
tq7924 /usr/lib/autossh/autossh -M 0 -N -q -o ServerAliveInterval 60 -o ServerAliveCountMax 3 root@127.0.0.1 -D 0.0.0.0:1080 -i /root/.ssh/id_rsa
mq7927 /usr/bin/ssh -N -q -o ServerAliveInterval 60 -o ServerAliveCountMax 3 -D 0.0.0.0:1080 -i /root/.ssh/id_rsa root@127.0.0.1

8月 13 22:19:11 raspberrypi systemd[1]: Started Autossh Socks5 Service.
8月 13 22:19:11 raspberrypi autossh[7924]: port set to 0, monitoring disabled
8月 13 22:19:11 raspberrypi autossh[7924]: starting ssh (count 1)
8月 13 22:19:11 raspberrypi autossh[7924]: ssh child pid is 7927

$ netstat -antp |grep 1080
tcp 0 0 0.0.0.0:1080 0.0.0.0:* LISTEN 7927/ssh

問題なく動作している、試しにcurlでリクエスト投げてみる

$ curl --socks5 localhost:1080 example.com

<!doctype html>
<html>
<head>
<title>Example Domain</title>
~略~
</div>
</body>
</html>

つぎにFireFoxブラウザでSocks Proxyだけ設定してアクセスしてみる(RasPiは192.168.11.100)

image.png

問題なく動く。


さいごに

sshdでsocks5 proxyが簡単に作ることができた。が、この作りだとログなどが取れないので、sshdのログに細工して、syslogあたりに出さないとちょっとアレです。アップデート時の簡易的な用途に限定すれば、これでいい気もします…

何はともあれ、sshdとautosshでproxyが問題なくたちました。

あまり需要はないかもしれませんが、覚書として公開しておきます。