시스템 단위 파일에서 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을 통해 호출하면 스크립트가 루트로 실행되고 있습니다.

답변1

수행하는 데 필요한 최소 기능 은 and iptables입니다 (적어도 내 RHEL 인스턴스에서 테스트했지만 이는 일반적인 현상이어야 합니다). 이것이 왜 필요한지 설명하기 위해 빠른 검색에서 관련 항목을 찾을 수 없지만 가장 잘 알려진 추측은 iptables가 원시 소켓을 사용하여 레이어 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

특정 규칙에는 추가 기능이 필요할 수 있지만 제공된 정보에 따르면 더 이상 자세히 알아볼 수 없습니다.

관련 정보