단일 프로세스에 대해 (나가는) 네트워크 액세스를 차단할 수 있습니까?
답변1
Linux 2.6.24+(2.6.29 이전에는 실험적인 것으로 간주됨)의 경우 이를 위해 네트워크 네임스페이스를 사용할 수 있습니다. CONFIG_NET_NS=y
kernel() 및 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
다른 네임스페이스를 입력하세요.
다음 예제는 ping
PID 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입니다.
- 생성, 확인새 그룹;필요한 사용자를 그룹에 추가합니다:
- 만들다:
groupadd no-internet
- 확인됨:
grep no-internet /etc/group
- 사용자 추가:
useradd -g no-internet username
참고: 기존 사용자를 수정하려면usermod -a -G no-internet userName
다음을 실행해야 합니다.sudo groups userName
- 만들다:
- 만들다스크립트경로에 추가하고 실행 가능하게 만드세요.
- 만들다:
nano /home/username/.local/bin/no-internet
- 실행 가능 파일:
chmod 755 /home/username/.local/bin/no-internet
- 콘텐츠:
#!/bin/bash
sg no-internet "$@"
- 다음에 추가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,
}
하지만 이 방법을 사용하면 액세스가 허용되는 파일 목록도 생성해야 하며 전체 프로세스가 약간 복잡할 수 있습니다. 그리고여기에서 도움말 문서를 참조하세요.