프로세스에 대한 네트워크 액세스를 차단하시겠습니까?

프로세스에 대한 네트워크 액세스를 차단하시겠습니까?

단일 프로세스에 대해 (나가는) 네트워크 액세스를 차단할 수 있습니까?

답변1

Linux 2.6.24+(2.6.29 이전에는 실험적인 것으로 간주됨)의 경우 이를 위해 네트워크 네임스페이스를 사용할 수 있습니다. CONFIG_NET_NS=ykernel() 및 util-linux에서 "Network Namespace"를 활성화하고 다음을 사용해야 합니다.unshare도구.

그런 다음 네트워크 액세스 없이 프로세스를 시작하는 것은 다음과 같이 간단합니다.

unshare -n program ...

그러면 프로세스에 대한 빈 네트워크 네임스페이스가 생성됩니다. 즉, 다음을 포함한 네트워크 인터페이스 없이 실행됩니다.루프백 없음. 다음 예에서는 현재 유효 사용자 및 그룹 ID가 수퍼유저 ID에 매핑된 경우에만 프로그램을 실행하기 위해 -r을 추가합니다(sudo 제외).

$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable

애플리케이션에 네트워크 인터페이스가 필요한 경우 새 네트워크 인터페이스를 설정할 수 있습니다.

$ unshare -n -- sh -c 'ip link set dev lo up; ping 127.0.0.1'
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0.066 ms

이렇게 하면 새로운현지의루프백. 즉, 생성된 프로세스는 호스트의 열린 포트에 액세스할 수 없습니다 127.0.0.1.


네임스페이스 내의 원래 네트워크에 액세스해야 하는 경우 다음을 사용할 수 있습니다.nsenter다른 네임스페이스를 입력하세요.

다음 예제는 pingPID 1에서 사용하는 네트워크 네임스페이스를 사용하여 실행됩니다( 지정 -t 1).

$ nsenter -n -t 1 -- ping -c4 example.com
PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=4 ttl=50 time=139 ms

--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 134.621/136.028/139.848/2.252 ms

답변2

Linux에는 다음과 같은 기능이 있습니다.네트워크 네임스페이스기본적으로 동일한 컴퓨터에 여러 네트워크 스택을 갖고 프로그램을 실행할 때 이를 프로그램에 할당할 수 있습니다. 이는 일반적으로 컨테이너에 사용되는 기능이지만 원하는 작업을 수행하는 데 사용할 수도 있습니다.

이것ip netns하위 명령이 이를 관리합니다. 아무것도 액세스할 수 없는 새 네트워크 네임스페이스를 만드는 것은 쉽습니다. 이는 새 네임스페이스의 기본 상태입니다.

root@host:~# ip netns add jail

이제 해당 네임스페이스로 전환하면 상당히 쉽게 구성할 수 있습니다. lo를 언급하고 싶을 수도 있으므로 여기에 있습니다.

root@host:~# ip netns exec jail /bin/bash
root@host:~# ip addr add 127.0.0.1/8 dev lo
root@host:~# ip link set dev lo up
root@host:~# exit

이제 네트워크 없이 명령을 실행하려면 감옥에서 실행하세요.

root@host:~# ip netns exec jail su user -c 'ping  8.8.8.8'
connect: Network is unreachable

요청 시 네트워크에 액세스할 수 없습니다. (별도의 네트워크 스택에 iptables규칙 등이 포함되어 있으므로 모든 종류의 흥미로운 작업을 수행할 수 있습니다.)

답변3

해결 방법 1: 공유 취소

공유 취소util-linux 패키지에서는 네트워크 없이 다른 네임스페이스에서 애플리케이션을 시작할 수 있지만 이를 위해서는 루트가 필요합니다. firejail의 솔루션은 거의 동일한 작업을 수행하지만 루트가 필요하지 않습니다.

unshare -r -n app-command

해결 방법 2: 방화 감옥:

지옥불응용 프로그램에 대한 네트워크 액세스를 차단하는 데 사용할 수 있으며 루트가 필요하지 않으며 모든 사용자가 이 혜택을 누릴 수 있습니다.

firejail --noprofile --net=none app-command

해결 방법 3: 시스템화

~부터시스템 v235또 다른 매우 간단한 옵션이 있습니다.

systemd-run --scope -p IPAddressDeny=any -p IPAddressAllow=localhost app-command

해결 방법 4: 방화벽:

예를 들어 방화벽을 사용할 수 있습니다.듀에인또는공개 내부고발자하지만 이러한 앱은 100% 효율적이지 않거나 개발 초기 단계에 있지 않습니다(2019년 현재 버그 등이 많음).

해결 방법 5: 커널 MAC:

커널 MAC은 방화벽으로 사용될 수 있습니다.토모요,셀링크그리고아파모어 이 솔루션은 안정성과 효율성(방화벽 솔루션) 측면에서 가장 우수하지만 대부분 설정이 다소 복잡합니다.

해결 방법 6: 프록시:

한 가지 해결책은 애플리케이션을 다음으로 프록시하는 것입니다.비어 있음/거짓대리인. 우리는 사용할 수 있습니다양말또는프록시 바인딩. 여기 몇 가지가 있습니다설정에 대한 세부정보

해결 방법 7: iptables:

또 다른 간단한 솔루션은 애플리케이션을 차단하도록 설정할 수 있는 iptables입니다.

  1. 생성, 확인새 그룹;필요한 사용자를 그룹에 추가합니다:
    • 만들다:groupadd no-internet
    • 확인됨:grep no-internet /etc/group
    • 사용자 추가:useradd -g no-internet username

      참고: 기존 사용자를 수정하려면 usermod -a -G no-internet userName 다음을 실행해야 합니다.sudo groups userName

  2. 만들다스크립트경로에 추가하고 실행 가능하게 만드세요.
  • 만들다:nano /home/username/.local/bin/no-internet
  • 실행 가능 파일:chmod 755 /home/username/.local/bin/no-internet
  • 콘텐츠:#!/bin/bash
                  sg no-internet "$@"

  1. 다음에 추가iptables 규칙그룹 삭제를 위한 네트워크 활동인터넷 없음:
    • iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP

      참고: 변경 사항을 영구적으로 적용하는 것을 잊지 마세요.재시작 후 자동 적용. 이를 수행할지 여부는 Linux 배포판에 따라 다릅니다.

   4. 예를 들어 Firefox에서 다음을 실행하여 확인하십시오. * `no-internet "firefox"`

   5. 예외를 설정하고 프로그램 접근을 허용하려는 경우지역 네트워크:

  • iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
  • iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
  • iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP

   6. 영구적으로 만드세요

   시작 시 iptables 규칙을 적용하는 한 가지 방법은 systemd를 사용하여 규칙을 서비스로 추가하는 것입니다.

cat /usr/lib/systemd/system/nonet.service
[Unit]
Description=Nonet group iptable update
After=network.target
After=xsession.target
After=iptables.service
After=shorewall.service

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/bin/bash /home/user/Scripts/Nonet.iptables.sh

답변4

예, 맞춤형 의류 프로필을 사용하면 됩니다.

/usr/bin/curl {
    ...

    # block ipv4 acces
    deny network inet,
    # ipv6 
    deny network inet6,
    # raw socket
    deny network raw,

}

하지만 이 방법을 사용하면 액세스가 허용되는 파일 목록도 생성해야 하며 전체 프로세스가 약간 복잡할 수 있습니다. 그리고여기에서 도움말 문서를 참조하세요.

관련 정보