オペレーティングシステム:Debian 11
パッケージ:OpenVPN 2.5.1
背景:
アップデート後、Openvpn-2.5 クライアントは動作しなくなります。IPルーティングroot権限が削除され、システムデバイスが権限のないユーザーとして実行されたら、インターフェイスを変更してOpenVPNサーバーがプッシュするパスを設定します。次の 2 つのスレッドの iproute 問題に関する議論に基づいています。
https://bugs.archlinux.org/task/68480
https://phabricator.vyos.net/T3805推奨される回避策は、別の.serviceファイルからユーザーおよびグループディレクティブを削除し、別
/etc/openvpn/openvpn.conf
の.serviceファイルに環境機能を追加することです。User=tunnel
Group=tunnel
すでに既存のOpenVPNサービスファイル([Eメール保護])/lib/systemd/system
したがって、新しいディレクトリを作成し、その中に.serviceファイルを含めます。/lib/systemd/system/[email protected]/override.conf
# separate service file containing User and group directives along with Ambient capabilities
[Service]
User=tunnel
Group=tunnel
SecureBits=keep-caps
ExecStartPre=/usr/bin/sudo --non-interactive /usr/sbin/openvpn --rmtun --dev tun0
ExecStartPre=/usr/bin/sudo --non-interactive /usr/sbin/openvpn --mktun --dev tun0 --dev-type tun --user tunnel --group tunnel
ExecStopPost=/usr/bin/sudo --non-interactive /usr/sbin/openvpn --rmtun --dev tun0
AmbientCapabilities=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE
次のコマンドを実行します。
sudo systemctl daemon-reload
sudo chown -R tunnel:tunnel /etc/openvpn /run/openvpn
sudo /usr/sbin/openvpn --rmtun --dev tun0
sudo /usr/sbin/openvpn --mktun --dev tun0 --dev-type tun --user tunnel --group tunnel
cd /etc/openvpn/
sudo -u tunnel openvpn /etc/openvpn/openvpn.conf
間違い
User=tunnel
権限のない人がtun0を開き、インターフェイスを変更してopenvpn接続を完了するための環境能力を持つことが予想されます。しかし、エラーが発生しました。
#Error after running sudo -u tunnel openvpn /etc/openvpn/openvpn.conf
2022-06-24 17:32:08 us=174691 TUN/TAP device tun0 opened
2022-06-24 17:32:08 us=174755 do_ifconfig, ipv4=1, ipv6=0
2022-06-24 17:32:08 us=174844 net_iface_mtu_set: mtu 1500 for tun0
2022-06-24 17:32:08 us=175005 sitnl_send: rtnl: generic error (-1): Operation not permitted
2022-06-24 17:32:08 us=175084 Linux can't set mtu (1500) on tun0
2022-06-24 17:32:08 us=175142 Exiting due to fatal error
効果的なソリューション
user=tunnel
しかし、capshを使用して、systemdサービスには何もせず、特権のOpenvpn実行可能ファイルに直接Ambient Capabilityを付与しました。
sudo /sbin/capsh --keep=1 --user='tunnel' --inh='cap_ipc_lock,cap_net_admin,cap_net_bind_service,cap_net_raw,cap_setgid,cap_setuid,cap_sys_chroot,cap_dac_override,cap_audit_write' --addamb='cap_ipc_lock,cap_net_admin,cap_net_bind_service,cap_net_raw,cap_setgid,cap_setuid,cap_sys_chroot,cap_dac_override,cap_audit_write' -- -c 'openvpn /etc/openvpn/openvpn.conf'
質問:
systemdではuser = tunnelの環境機能を設定できませんが、capshでは設定できるのはなぜですか? systemdで動作させる方法は?
答え1
sudo -u tunnel
環境能力がクリアされたようです。これを確認するには、最後の行の前に次の行を挿入してみてください。
/sbin/capsh --print
sudo -u tunnel /sbin/capsh --print
sudo -u tunnel openvpn /etc/openvpn/openvpn.conf