프로세스에 대한 인터넷 액세스를 차단하고 프로세스가 계속 실행되는 동안 차단을 해제할 수 있습니까?
답변1
대답은 "상황에 따라 다르다"이다.
애플리케이션이 알려진 원격 서비스 세트에 액세스합니까, 아니면 특정(고유) 포트 세트를 사용합니까? 두 경우 모두 이러한 원격 주소나 포트에 대한 액세스만 차단하는 규칙을 만들 수 있습니다.
자신의 네트워크 네임스페이스에서 프로세스를 시작하는 경우(아마도 외부 세계에 액세스하기 위해 가장함) 애플리케이션별 규칙을 생성하는 것은 매우 쉽습니다. 왜냐하면 (a) 네임스페이스-로컬 넷필터 규칙을 생성할 수 있고 (b) 글로벌 넷필터를 생성할 수 있기 때문입니다. IP 또는 장치별로 애플리케이션 네임스페이스를 참조하는 규칙입니다. 자체 네트워크 네임스페이스 내에서 프로세스를 실행하는 가장 일반적인 방법은 Docker 또는 Podman과 같은 컨테이너 런타임을 사용하는 것입니다. 그러나 Linux 시스템에서 이미 사용 가능하거나
unshare
를 사용하여 수동으로 수행 할 수도 있습니다.ip
수동으로 설정하는 것은 까다로울 수 있습니다.애플리케이션이 특정 사용자 또는 그룹 ID로 실행 중인 경우 iptables
owner
모듈을 사용하여 이러한 조건을 사용하여 일치시킬 수 있습니다.
답변2
이를 달성하기 위해 cgroup2 및 iptables를 사용할 수 있습니다. firefox
프로세스에 대한 모든 네트워크 액세스(루프백 포함)를 차단한다고 가정해 보겠습니다 .
# CGROUP_MOUNT_POINT=/sys/fs/cgroup
create cgroup
# mkdir $CGROUP_MOUNT_POINT/disable-network
add iptables rule to disable network access from cgroup
# iptables -A OUTPUT -m cgroup --path disable-network/ -j REJECT
add firefox processes to created cgroup
# for pid in $(pidof firefox); do echo $pid > $CGROUP_MOUNT_POINT/disable-network/cgroup.procs; done
remove firefox processes from cgroup, moving them to root cgroup
# for pid in $(pidof firefox); do echo $pid > $CGROUP_MOUNT_POINT/cgroup.procs; done
그러나 몇 가지 함정이 있습니다. cgroup을 수동으로 관리하는 것은 어렵고 기존 소켓은 새 cgroup과 연결되지 않습니다. systemd를 사용하고 슬라이싱 및 systemd-run
영구 iptables 규칙을 사용하여 cgroup을 관리하는 것을 선호할 수 있습니다 .
답변3
모든 프로세스에 적용되는 것은 아니지만 컴퓨터에서 네트워킹을 끄고 언제든지 다시 가져올 수 있습니다. 그러나 이는 실행 중인 모든 응용 프로그램에 적용됩니다.
예를 들어 네트워크 카드 eth0
(유선 네트워크의 기본 이름) 를 중지하고 시작할 수 있습니다.
# ifconfig eth0 down
# ifconfig eth0 up
또는 모든 네트워크 인터페이스를 동시에:
# /etc/init.d/network stop
# /etc/init.d/network start
- or depending on OS that can be
# service network stop
# service network start
물론 이러한 명령에는 루트 액세스가 필요하므로 루트 액세스로 전환하거나 sudo
.