Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

ひょんなことから、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が問題なくたちました。
あまり需要はないかもしれませんが、覚書として公開しておきます。

hirohiro77
インフラ屋さんやってます。構成の設計とか、仮想サーバのお守とか、システムのマイナーアップデートとか、監視など。 [[ また、このサイトにおける掲載内容はあくまで私自身の見解であり、私の所属団体・企業における立場、戦略、意見を代表するものではありません ]]
opt
"INNOVATION AGENCY" を標榜するインターネット広告代理店。エンジニア組織 "Opt Techonologies" を中心にアドテクetc...に取り組んでいます。
https://opt-technologies.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした