가용성이 높은 인메모리 캐시 서비스를 구현하려고 합니다. 시작은 실행 중인 인스턴스에서 데이터가 시드될 때까지 들어오는 연결을 차단해야 합니다. 그런데 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 start
iptables 명령이 실행되는 곳) 그리고 덮어쓰는 파일에는 다음이 포함됩니다.
[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을 통해 호출하면 스크립트가 루트로 실행되고 있습니다.
답변1
수행하는 데 필요한 최소 기능 은 and iptables
입니다 (적어도 내 RHEL 인스턴스에서 테스트했지만 이는 일반적인 현상이어야 합니다). 이것이 왜 필요한지 설명하기 위해 빠른 검색에서 관련 항목을 찾을 수 없지만 가장 잘 알려진 추측은 iptables가 원시 소켓을 사용하여 레이어 2에서 발생하는 모든 필터링을 처리한다는 것입니다.CAP_NET_RAW
CAP_NET_ADMIN
CAP_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
특정 규칙에는 추가 기능이 필요할 수 있지만 제공된 정보에 따르면 더 이상 자세히 알아볼 수 없습니다.