スキップしてメイン コンテンツに移動

クライアント側にサーバ側のルート権限を渡さずにssh tunnel session を張る

基本的にはクライアント側、ユーザ側それぞれに管理者権限が必要なのですが、サーバとクライアントの両方で事前に tap/tun インターフェースさえ立ち上がっていれば、クライアント側にサーバ側のルート権限を渡さず、ユーザがssh で接続したときに tap/tun デバイス経由で通信できることを確認しました。
linux では tap deviceの場合、具体的に以下のようになります。
# on both side edit /etc/ssh/sshd_config
PermitTunnel yes

# on both side as root
ip tuntap add dev tap0 mode tap
ip link set tap0 up

# on server side as root
ip addr add 192.168.100.1/24 dev tap0

# on client side as root
ip addr add 192.168.100.2/24 dev tap0

# on client side as user
ssh -4 -Nf -v -T -c chacha20-poly1305@openssh.com -oCompression=no -oTunnel=ethernet -o ServerAliveInterval=10 -o TCPKeepAlive=yes -w 0:0 server.example.com 
2024/12/30追記:-w 0:0の記述はoptionの後に持ってこないと、tapデバイスが NO-CARRIERのままになりますので、記述順に注意してください。
インターフェースの立ち上げは一々記述するのは面倒なので、例えばDebian netinstの場合、以下のようにすると良いでしょう。
# on server side
# /etc/network/interfaces.d/tap0
auto tap0
iface tap0 inet static
  address 192.168.100.1
  netmask 255.255.255.0
  pre-up ip tuntap add dev tap0 mode tap

# on client side
# /etc/network/interfaces.d/tap0
#auto tap0
iface tap0 inet static
  address 192.168.100.2
  netmask 255.255.255.0
  pre-up ip tuntap add dev tap0 mode tap
  post-up sudo -u user1000 ssh -4 -Nf -v -T -c chacha20-poly1305@openssh.com -oCompression=no -oTunnel=ethernet -o ServerAliveInterval=10 -o TCPKeepAlive=yes -w 0:0 server.example.com

# on server side run commands blow as root or restart networking (1st op.)
ifup tap0

# on client side run commands blow as root or restart networking (2nd op.)
ifup tap0

# on client side
# /etc/rc.local (chmod +x)

#!/bin/bash
sleep 2
ifup tap0
これで クライアント側にサーバ側のルート権限を渡したくない場合でも、ssh トンネルを張れます。まだチューニングは必要そうですが、とりあえず通信はできました。今回は以上です。それでは。

コメント