Как я могу запретить доступ в Интернет ко всем процессам, кроме избранных?

Иногда я вынужден использовать очень узкую полосу пропускания в сети с пропускной способностью 56 Кбит / с. На моем рабочем столе Ubuntu у меня слишком много программ, которые часто проверяют что-то в сети – и охота и отключение их по очереди действительно хлопотно.

Я хотел бы иметь некоторый инструмент, который запретил бы доступ в Интернет (любыми способами) к каждому процессу, за исключением, например, почтового клиента.

Это вообще возможно? Если да, то как?

Я полагаю, что одним из способов добиться этого является открыть другое сетевое устройство (например, /dev/tap1 ) и настроить его на маршрут в /dev/wlan0 (мое обычное интернет-устройство) и защищать все с помощью пользовательских правил iptables , которые могут быть включен и выключен. Но я не эксперт в iptables, так что решение сортировки, если только кто-то не дает мне конкретных инструкций, бесполезен.

Вы также можете использовать iptables для разрешения / ограничения портами udp / tcp на желаемых интерфейсах. Например, давайте представим правило в таблице filter в цепочке OUTPUT чтобы разрешить весь трафик на tcp / udp port 143 (IMAP).

 (sudo) iptables -A OUTPUT -o eth0 -p udp --destination-port 143 -j ACCEPT (sudo) iptables -A OUTPUT -o eth0 -p tcp --destination-port 143 -j ACCEPT (sudo) iptables -A OUTPUT -o eth0 -j DROP 

Я думаю, что IMAP переходит через TCP, но на всякий случай я ограничиваю также протокол UDP. В этом отношении я предполагаю, что ваш интерфейс к Интернету является eth0 . И ваш почтовый клиент использует протокол IMAP для подключения удаленного почтового сервера. Я просто попробовал это сам, и у меня есть только доступ к почтовому серверу. Помните, что порядок правил важен, иначе он не будет делать то, что вы ожидаете.

Редактировать # 1: как вы просили в комментарии. Чтобы восстановить интернет-трафик, просто удалите введенные вами правила. Вы можете сделать это следующим образом:

Долгий путь:

 (sudo) iptables -D OUTPUT -o eth0 -p udp --destination-port 143 -j ACCEPT (sudo) iptables -D OUTPUT -o eth0 -p tcp --destination-port 143 -j ACCEPT (sudo) iptables -D OUTPUT -o eth0 -j DROP 

Короткий путь:

 (sudo) iptables -nvL --line-numbers 

Выполняя приведенную выше команду, вы увидите перед каждым правилом соответствующее число, которое поможет вам удалить правила, используя этот номер, вместо того, чтобы переписать все правило. Пример вывода будет следующим:

 Chain OUTPUT (policy ACCEPT 73 packets, 8766 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT udp -- * eth0 0.0.0.0/0 0.0.0.0/0 udp dpt:143 

И затем, чтобы удалить правило, просто запустите эту команду:

 (sudo) iptables -D OUTPUT 1 

Короткий путь также рекомендуется, если вы не настроили правило, и вы действительно не знаете, как именно. Хотя вы можете восстановить правило из вывода iptables с параметрами -nvL .

Примечание. Это non-persistent способ использования iptables что означает, что вы не будете поддерживать правила при перезагрузке вашей системы. Если вы хотите, чтобы ваши правила были persistent самым простым способом является выполнение следующих действий:

 (sudo) iptables-save > /etc/iptables/rules.v4 

который сохраняет / выгружает ваши текущие правила в /etc/iptables/rules.v4 . Затем после перезагрузки iptables прочитает сохраненную конфигурацию из этих файлов. Для IPv6 вы используете этот другой файл rules.v6 . Имейте в виду, что это относится к Debian где вам нужно установить дополнительный пакет. Подробное объяснение см. В этом руководстве . Для Ubuntu я нашел это другое руководство . Для других систем вы можете просматривать Интернет, но принцип тот же: You dump your current rules to file and set up a script at boot time to apply those saved rules to the current iptables configuration.

Вы можете запускать свои процессы на нескольких виртуальных машинах. Затем вы можете убить сетевой доступ для некоторых виртуальных машин, но не других.