基本的にはクライアント側、ユーザ側それぞれに管理者権限が必要なのですが、サーバとクライアントの両方で事前に tap/tun インターフェースさえ立ち上がっていれば、クライアント側にサーバ側のルート権限を渡さず、ユーザがssh で接続したときに tap/tun デバイス経由で通信できることを確認しました。
linux では tap deviceの場合、具体的に以下のようになります。
インターフェースの立ち上げは一々記述するのは面倒なので、例えばDebian netinstの場合、以下のようにすると良いでしょう。
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.com2024/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 トンネルを張れます。まだチューニングは必要そうですが、とりあえず通信はできました。今回は以上です。それでは。
コメント
コメントを投稿