リモートをTCP/UDPプロキシにしてローカルで受信する
前提
自宅から外部へは接続できる。
外部から自宅へは接続できない。
固定IPアドレスがない、もしくはあっても外部からのアクセスが禁止されている。
リモートホストに固定IPアドレスのサーバーを立てることはできる。
リモートホストで指定のポートを待ち受けて、受信したら自宅のローカルホストに接続させたい。
問題
TCP であれば OpenSSH のリモートフォワードで可能。
普通使わないとされているが、このケースでは使わないと実現できない。
自宅からリモートホストに対して SSH リモートフォワードで接続する。
1ポートだけならよいが、複数のポートを扱う場合、ssh セッションが複数になってしまう。
UDP の場合、適切なリピーターが存在しない。
stone は単体では受信してから送信先に送信するだけになっている。送信先にアクセスできなければならない。
nc や socat で、SSH リモートフォワードされたポートに送り込むことはできる。ただし、UDP を TCPに変換すると、パケットの区切りが保証されないため、期待通りに動かない。
OpenSSH による tun デバイスでのトンネリング (採用)
https://www.unixuser.org/~euske/doc/openssh/openssh-vpn.html
パケットは正しく透過する。
ssh は1セッションだけでよい。
stone でトンネルにつなぐ。
以下、大袈裟すぎる
OpenVPN
SoftEther
ローカル(自宅)ホストを home、リモートホストを remote とする。
管理ユーザーは両方 admin としておく。(root ではない sudoer)
remote の sshd の設定
/etc/ssh/sshd_config
PermitRootLogin forced-commands-only
PermitTunnel yes
PermitTunnel は point-to-point でいいかも。
point-to-point だと L3 tunnel (tun) のみ。yes だと L2 tunnel (tap) も許可される。
sshd_config を直接編集したくない場合は sshd_config.d に *.conf で置いてもよい。(Ubuntuの場合)
sshd の再起動
systemctl restart sshd
alice 側で root ユーザーで接続用のSSH鍵を作る。自動接続とするのでパスフレーズは付けない。
sudo ssh-keygen -t ed25519 -C "alice@home" -N "" -f ~root/.ssh/bob-vpn_id_ed25519
bob に公開鍵を転送
sudo scp -i ~admin/.ssh/id_ed25519 ~root/.ssh/bob-vpn_id_ed25519.pub admin@bob:.
bob の root の ~/.ssh/authorized_keys にSSH鍵の公開鍵を追加
sudo cat ~admin/bob-vpn_id_ed25519.pub >>~root/.ssh/authorized_keys
まず、暫定的に command に echo を付ける。
code:bob:~root/.ssh/authorized_keys
command="echo Hello" ssh-ed25519 AAAAC3NzaC1lZDI1NT...
alice の config に bob へのアクセス方法を書く。まだトンネルの設定は書かない。
code:alice:~root/.ssh/config
Host bob-vpn
Hostname bob
IdentityFile ~/.ssh/bob-vpn_id_ed25519
疎通確認
alice 側のサービスの作成