Как закрыть доступ в интернет определенному приложению в Linux.

Иногда ради прикладных задач может возникнуть потребность в недопущении определенного приложения в интернет или сеть в целом. Безусловно, для реализации подобных задач можно пользоваться SELinux или AppArmor, но они требуют достаточно сложной для новичка настройки и часто игра не стоит свеч. В этой статье я расскажу, как всего за несколько минут решить подобную задачу используя iptables. При этом нам не придется ставить какой-либо софт. Пример подходит для любого дистрибутива Linux.

После завершения манипуляций, изложенных ниже, мы получим возможность запускать любое приложение без сети:

1
nolan ping -c 4 8.8.8.8

или без интернета:

1
noinet ping -c 4 8.8.8.8

Для начала мы создадим две группы noinet и nolan:

1
2
sudo groupadd noinet
sudo groupadd nolan

Добавим в группы текущего пользователя:

1
2
sudo gpasswd -a `id -un` noinet
sudo gpasswd -a `id -un` nolan

Теперь воспользуемся возможностями iptables. Напишем два скрипта, которые будут стартовать вместе с ОС:

1
sudo nano /etc/network/if-pre-up.d/noinet_rule
#!/bin/bash
iptables -A OUTPUT -d 10.0.0.0/8 -m owner --gid-owner noinet -j ACCEPT
iptables -A OUTPUT -d 172.16.0.0/12 -m owner --gid-owner noinet -j ACCEPT
iptables -A OUTPUT -d 192.168.0.0/16 -m owner --gid-owner noinet -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner noinet -j DROP
1
sudo nano /etc/network/if-pre-up.d/nolan_rule
#!/bin/bash
iptables -A OUTPUT -m owner --gid-owner noinet -j DROP

Сделаем скрипты исполняемыми:

1
2
sudo chmod +x /etc/network/if-pre-up.d/noinet_rule
sudo chmod +x /etc/network/if-pre-up.d/nolan_rule

Настало время сделать пару скриптов, которые будут запускать наши приложения с привилегиями этих групп:

1
sudo nano /usr/local/bin/noinet
#!/bin/bash
sg noinet "$*"
1
sudo nano /usr/local/bin/nolan
1
2
#!/bin/bash
sg noinet "$*"

Сделаем скрипты исполняемыми:

1
2
sudo chmod +x /usr/local/bin/noinet
sudo chmod +x /usr/local/bin/nolan

Дабы не перезагружать ОС, выполним скрипты iptables:

1
2
sudo /etc/network/if-pre-up.d/noinet_rule
sudo /etc/network/if-pre-up.d/nolan_rule

Теперь для запуска приложения без сети достаточно добавить nolan. Без интернета — noinet.

Проверим работоспособность:

1
2
3
4
5
6
ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=60 time=1.29 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=60 time=1.52 ms
64 bytes from 8.8.8.8: icmp_req=3 ttl=60 time=1.15 ms
64 bytes from 8.8.8.8: icmp_req=4 ttl=60 time=1.50 ms
1
2
3
4
5
6
noinet ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted

С сетью все будет по аналогии.

На этом все. Спасибо за внимание, до новых встреч!


Смотрите также

comments powered by Disqus