네트워크 네임스페이스(netns)를 사용하는 아키텍처가 있습니다. 일반 사용자가 이러한 네트워크에서 일부 작업을 수행할 수 있도록 허용하고 싶습니다.
netns-exec.sh
나는 다음에서 영감을 받아 스크립트를 작성할 수 있습니다 .이 게시물을 실행하는 데 사용되는 에는 다음이 sudo
포함됩니다.
ip netns exec $1 su $USER -c "$2"
내 sudoer 파일에 추가했습니다.
user ALL=(ALL) /path/to/netns-exec.sh
하지만 너무 추악해서 악몽을 꿀 수도 있을 것 같아요. 일반 사용자가 네임스페이스를 사용할 수 있도록 하는 더 나은 솔루션이 있습니까? 사용자를 유용한 그룹에 넣는 것이 가능합니까? 검색했지만 아무것도 찾지 못했습니다.
답변1
답변2
솔루션 1
"netns"라는 그룹을 추가하고 여기에 원하는 모든 사용자를 추가하세요. 그런 다음 root:netns에 소유권을 부여하고 그룹에 읽기/실행 기능을 부여합니다.
다시 말해서:
# New group netns
sudo groupadd --system netns
# Add root to "netns", not sure if needed
sudo usermod -aG netns root
# Do this for every needed user
sudo usermod -aG netns $UserName
# Change ownership to root, grant rw acces to group netns
sudo chown root:netns /path/to/netns-exec.sh
sudo chmod 633 /path/to/netns-exec.sh
솔루션 2
이 솔루션은 더 간단합니다. 다음과 같이 sudoers 파일을 편집해야 합니다.이 예.
user ALL=(ALL) /bin/ip netns
답변3
스크립트는 아니지만 루트가 아닌 사용자가 Linux 네트워크 네임스페이스 내에서 프로세스를 실행할 수 있도록 하는 매우 미니멀하고 편집증적인 C 프로그램을 작성했습니다.
소스 코드는 여기에 있습니다:netns-exec.c
답변4
개인적으로 일반 사용자가 다른 네트워크 네임스페이스에서 명령을 실행하도록 허용하는 것이 가능한지 모르겠지만 주석이 달린 이 쉘 스크립트가 귀하의 요구에 더 적합할 수 있습니다.
#!/bin/bash
# ip netns wrapper script, nns.
# Usage: nns nsname cmdline
case "${1}" in
do)
shift # remove "do"
NSNAME="${1}" # remember nsname
shift # remove nsname to get argument list for su -c
[ -z "${NSNAME}" -o -z "${1}" ] && exit 1 # if either nsname or arglist is empty - error out
echo ip netns exec "${NSNAME}" su "${SUDO_USER}" -c "${*}" # execute, ${*} merges separate arguments into single word for su/sh -c parsing. See with strace.
;;
*)
SCRIPTNAME="${0}" # remember script full path
exec sudo "${SCRIPTNAME}" do "${@}" # run it through sudo with elevated privileges
;;
esac
어딘가에 설치 /usr/bin
하고 사용자가 실행할 수 있도록 하세요.