Ubuntu 14.04を16.04にアップグレードした後、iptablesモジュールはロードされません。

Ubuntu 14.04を16.04にアップグレードした後、iptablesモジュールはロードされません。

したがって、私はsystemdについて少し不利な意見にもかかわらず、Ubuntu 16.04に機会を与えることにしました。

アップグレード後、以前の継続的なOpenVPN接続は機能しなくなりました。幸いなことに、システムログは根本的な原因を見つけるのに非常に役立ちます。

openvpn-up: + /sbin/iptables -t nat -D POSTROUTING -o tun0 -s 192.168.x.x -j SNAT --to-source 10.x.x.x
openvpn-up: modprobe: ERROR: could not insert 'ip_tables': Operation not permitted
openvpn-up: iptables v1.6.0: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
openvpn-up: Perhaps iptables or your kernel needs to be upgraded.
openvpn-up: + /sbin/iptables -t nat -A POSTROUTING -o tun0 -s 192.168.x.x -j SNAT --to-source 10.x.x.x
openvpn-up: modprobe: ERROR: could not insert 'ip_tables': Operation not permitted
openvpn-up: iptables v1.6.0: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
ovpn-conn[613]: WARNING: Failed running command (--up/--down): external program exited with error status: 3
openvpn-up: Perhaps iptables or your kernel needs to be upgraded.
ovpn-conn[613]: Exiting due to fatal error

注:これは、openvpn-upスクリプトの2行目/etc/openvpn/openvpn-up.sh(行を読む:)のコメントを外すことによって生成されますexec &> >(logger -s -t openvpn-up) && set -x

何らかの理由でモジュールをロードできませんip_tables。カーネルモジュールがすべて存在することを確認したら、次のように試してみapt-get install --reinstall linux-image-$(uname -r)ましたが、ロードされ、システムログにも表示されましたmodprobe ip_tableslsmod

kernel: [  446.293882] ip_tables: (C) 2000-2006 Netfilter Core Team

もちろん、systemctl restart openvpn後で実行すると接続が開いているように見え、出力はiptables-save適切なSNATルールが追加されたことを証明します。

私のもの推測するOpenVPNデバイスは、それを使用するのに十分な権限がない一部のユーザーmodprobeのコンテキストで実行されます。

しかし私はこの疑いを確認できなかった。実際、結果はsystemctl cat openvpn私を混乱させます。

# systemctl cat [email protected]
# /lib/systemd/system/[email protected]
[Unit]
Description=OpenVPN connection to %i
PartOf=openvpn.service
ReloadPropagatedFrom=openvpn.service
Before=systemd-user-sessions.service
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO

[Service]
PrivateTmp=true
KillMode=mixed
Type=forking
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid
PIDFile=/run/openvpn/%i.pid
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/etc/openvpn
ProtectSystem=yes
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP_AUDIT_WRITE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw

[Install]
WantedBy=multi-user.target

お持ちですか?能力insmod/を正常に呼び出すには、スクリプトを有効にする必要がありますかmodprobeCAP_SYS_ADMINやや粗雑に見えるので、追加するのを避けたいです。またはip_tablesモジュールをロードする.conf唯一の方法は/etc/modprobe.d

本質的に私が要求するのはUbuntu 16.04です。いいえ14.04からアップグレードするとこれは完了しますか?つまり、標準とは何か(そして仕様)どうすればいいですか?最後に、特定のデバイスがどのユーザーコンテキストで実行されているか(またはより正確にはどの機能で)確認するにはどうすればよいですか。

ベストアンサー1

すべてのsystemdディレクティブのドキュメントを見つけることができますman system.directives。そこCapabilityBoundingSet=から私はman systemd.exec

man 7 capabilitiesこれにより、さまざまな機能を文書化できる場所ができました。そこから「モジュール」を検索し、次の機能を見つけました。必要な機能のようです。

CAP_SYS_MODULEはカーネルモジュールをロードおよびアンロードします。

この機能がデフォルトで含まれていない理由はわかりません。 OpenVPNの一般的なユースケースでは必要ないかもしれません。

この機能をパッケージのシステム構成に追加する最小限の方法は、「単位挿入」を使用することです。このファイルを生成します。

/etc/systemd/system/[email protected]/add-module-loading.conf

この内容で:

[Service]
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP_AUDIT_WRITE CAP_SYS_MODULE

これは既存の機能を利用してサービスを拡張しますCAP_SYS_MODULE

躊躇でしたsystemdが、好きなものがたくさん見つかりました。このtimerシステムは、20年のクローンシステムのための歓迎されたアップデートです。

おすすめ記事