システム単位ファイルからiptablesを呼び出す方法は?

システム単位ファイルからiptablesを呼び出す方法は?

可用性の高いインメモリキャッシュサービスを実装しようとしています。起動は、実行中のインスタンスでデータがシードされるまで、着信接続をブロックする必要があります。しかし、CAP_NET_ADMINを設定してもiptablesルールは失敗します。"iptables v1.6.1: iptables テーブル 'filters' を初期化できません: 権限が拒否されました (ルートである必要があります)。"

私のカバレッジファイルは次のとおりです。

[Service]
Type=forking
ExecStart=
ExecStart=/etc/memcache/memcache-repl-start.sh start
ExecStop=/etc/memcache/memcache-repl-start.sh stop
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE CAP_NET_ADMIN

/etc/memcache/memcache-repl-start.sh startiptablesコマンドが実行される場所)そして上書きされるファイルには以下が含まれます。

[Unit]
Description=memcached daemon
After=network.target
Documentation=man:memcached(1)

[Service]
ExecStart=/usr/share/memcached/scripts/systemd-memcached-wrapper /etc/memcached.conf
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
PrivateDevices=true
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true
PIDFile=/var/run/memcached/memcached.pid
Restart=always

[Install]
WantedBy=multi-user.target

ユニットファイルからiptablesを呼び出すには?

修正する 次のようにすべてのオプションを無効にしても、iptablesはまだ失敗します。

MemoryDenyWriteExecute=false
ProtectKernelModules=false
ProtectKernelTunables=false
ProtectControlGroups=false
RestrictRealtime=false
RestrictNamespaces=false
PrivateTmp=false
ProtectSystem=false
NoNewPrivileges=false
PrivateDevices=false

コマンドラインから起動スクリプトを実行すると、期待どおりに機能します。確認しましたが、systemctlを介して呼び出すと、スクリプトはrootとして実行されています。

答え1

実行するために必要な最小限の機能はandiptablesです(少なくとも私のRHELインスタンスでテストしましたが、これは一般的な現象でなければなりません)。これがなぜ必要なのかを説明するためにクイック検索で関連項目を見つけることはできませんが、最もよく知られている推測は、iptablesがrawソケットを使用してレイヤ2で発生するすべてのフィルタリングを処理することです。CAP_NET_RAWCAP_NET_ADMINCAP_NET_RAW

つまり、オーバーレイファイル内で実行するスクリプトに追加機能が必要ない場合は、オーバーレイファイルは次のようになります。

[Service]
Type=forking
ExecStart=
ExecStart=/etc/memcache/memcache-repl-start.sh start
ExecStop=/etc/memcache/memcache-repl-start.sh stop
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE CAP_NET_ADMIN CAP_NET_RAW

特定のルールには追加機能が必要な場合がありますが、提供された情報によれば、これ以上詳細には理解できません。

関連情報