Блокировка доступа в Интернет для некоторых приложений с определенным Wi-Fi

Вы можете попробовать запустить xinput --test-xi2 --root, чтобы показать вам все события ввода по мере их возникновения, но они не будут отображать явную команду заставки, такую ​​как из xset s reset.

1
31.01.2020, 16:46
2 ответа

Задачу можно разделить на две части:

  1. определить, когда используется точка ограниченного доступа (привязка )

  2. определить, какие исходящие пакеты принадлежат приложениям с ограниченным доступом

Объединение этих двух параметров вместе идентифицирует пакеты, принадлежащие приложениям с ограниченным доступом, отправляемые с использованием точки ограниченного доступа (, чтобы отбрасывать такие пакеты ).


Подготовка

Некоторый клей до, а не после объяснений, так что печатать все по порядку просто работает.

Используйте две цепочки iptables :одну, выполняющую действие(blocksomeapps ), другую(tetheractivated)для ее вызова, которую можно легко сбросить:

iptables -N tetheractivated
iptables -N blocksomeapps
iptables -I OUTPUT -j tetheractivated

1. Точка доступа

Этот ответ предполагает, что только одна точка доступа используется в любой момент и что эта точка доступа использует уже известное имя сетевого интерфейса(wlan0). Он также предполагает, что wpa_supplicantбудет низкоуровневым демоном, обрабатывающим его. Не имеет значения, является ли он автономным или внутренним для NetworkManager, если его можно запросить с помощьюwpa_cliи его параметра-a(action ).

сценарий действияmyaction.sh:

#!/bin/sh

TETHERSSID='My Tethering'

case "$2" in
    'CONNECTED')
        ssid="$(wpa_cli -p "$WPA_CTRL_DIR" -i "$1" get_network "$WPA_ID" ssid)"
    # Note: ssid's value already comes with an added pair of double quotes around:
    # adding one as well
        if [ "$ssid" = \""$TETHERSSID"\" ]; then
           iptables -A tetheractivated -j blocksomeapps
        fi
    ;;
    'DISCONNECTED')
        iptables -F tetheractivated
    ;;
esac

Этот сценарий (, который должен быть исполняемым ), затем используется в качестве цикла событий, поддерживая выполнение этой программы:

wpa_cli -a myaction.sh

После этого цепочка iptables blocksomeapps появится в пути пакета при подключении к целевому SSID и будет удалена из пути пакета, когда (любой SSID )отключен.


2. Ограниченные приложения

С этим сложнее справиться. Существуют различные способы идентификации пакета, принадлежащего конкретному процессу, требующие в любом случае дополнительной подготовки. Некоторые методы требуют больше вещей, чем другие.

Некоторые примеры:

  • пакет может быть поставлен в очередь пользовательскому приложению, выполняющему дополнительные проверки (программа должна быть написана, возможно, на C или Python)
  • процессы с ограниченным доступом можно запускать от имени отдельного пользователя :с этим довольно легко иметь дело.
  • процессы с ограниченным доступом можно было запускать из их собственного выделенного сетевого пространства имен :после того, как это было сделано, с этим довольно легко справиться. Размещение их там в первую очередь (, включая настройку и возможный root-доступ, а затем обратно к пользовательскому доступу для их запуска ), может вызвать некоторые проблемы.

Вот довольно простой метод, найденный в этом Q/A:Заблокировать сетевой доступ процесса? Классифицировать пакеты из одной и той жесети _cls cgroup со значением, которое можно искать в iptables (в дополнение к основной цели :Traffic Controllertc).

Создайте определенную группу net _cls и присвойте ей определенный classid:

# mkdir -p /sys/fs/cgroup/net_cls/blocksomeapps
# echo 42 > /sys/fs/cgroup/net_cls/blocksomeapps/net_cls.classid

Определите целевые процессы (потоков, которые должны быть включены ), и добавьте их в группу (, записав в tasksодин pid (или tid )за раз. Это может быть колоритно, если процессы сильно меняются, поэтому лучше делать это во время запуска приложения. Конечно, когда это сделано, дети автоматически остаются в той же группе.

Пример с firefox (, который использует несколько потоков в нескольких процессах, поэтомуpgrepтребуется --lightweightдля вывода всех идентификаторов потоков):

# for i in $(pgrep --lightweight -f firefox); do echo $i > /sys/fs/cgroup/net_cls/blocksomeapps/tasks; done

(pid/tid, который необходимо удалить из этой группы, должен быть записан в родительскую группу/sys/fs/cgroup/net_cls/tasks)

Добавить правило блокировки в пустую цепочку blocksomeapps , подготовленную ранее:

# iptables -A blocksomeapps -m cgroup --cgroup 42 -j DROP

Чтобы блокировать только пакеты, проходящие через wlan0, используйте вместо этого:

# iptables -A blocksomeapps -o wlan0 -m cgroup --cgroup 42 -j DROP

, но затем косвенная активность, генерируемая этими приложениями, например запросы DNS к локальному демону кэширования DNS,может по-прежнему генерировать некоторый трафик данных, поскольку, например, демон кэширования DNS не будет заблокирован.


Примечания:

  • Часть SSID может быть улучшена (и иметь дело с несколькими одновременными точками доступа )путем включения где-то проверки маршрута, но это быстро станет очень сложным. Простого скрипта myaction.shбудет недостаточно (, потому что знание SSID, к которому мы подключились, ничего не дает о сетевом уровне, который еще даже не настроен ).
  • В настоящее время контрольные группы уже смонтированы и настроены, возможно, с помощью systemd или cgmanager. Это выходит за рамки вопросов и ответов, чтобы настроить это, если оно недоступно.
  • cgroups v1 постепенно заменяются cgroups v2, поэтому когда-нибудь этот ответ следует адаптировать к v2.
  • Также этот метод, вероятно, будет несовместимым (или, по крайней мере, трудным для использования )с контейнерами или сетевыми пространствами имен, созданными с помощью ip netns, только потому, что оба накладывают ограничения на использование cgroups (дляip netns:как ip netns exec...перемонтирует /sys/, дерево /sys/fs/cgroupстановится недоступным, и его нельзя смонтировать дважды ).
  • Все исходящие пакеты пересекают совпадениеcgroup . tetheractivatedможно вставить после обычного правила ESTABLISHEDс отслеживанием состояния для снижения нагрузки, но тогда уже установленные потоки не будут отбрасываться, что может поддерживать их работу в течение некоторого времени в зависимости от приложения. Это может помочь с помощьюconntrack(-Dили-F).
  • Вместо блокировки трафика с помощью iptables(или nftables)tc(и егоcgroupфильтр )можно использовать для применения жестких ограничений пропускной способности. Просто помните, что в то время как исходящий трафик находится под полным контролем, входящий трафик не становится :после получения пакета (и связывается с тем же потоком, что и предыдущий исходящий ), даже если он был отброшен, данные уже были потрачены.
2
28.04.2021, 23:25

Есть два случая:

Случай 1

Вы хотите запретить доступ только для некоторых приложений

Здесь вы можете использовать кое-что из iptables. Вам необходимо знать протокол (TCP/UDP ), который использует ваше приложение. Затем вы можете заблокировать его:

sudo iptables -A OUTPUT -p tcp --dport 80 -j DROP

Это предотвратит доступ любого приложения к TCP-порту 80. К сожалению, это не работает, если ваше приложение не имеет собственного протокола и использует, например, HTTP, тогда вы также заблокируете законный трафик.

Случай 2

Если вы хотите, чтобы доступ к Интернету имели только некоторые приложения, вы можете внести их в белый список:

sudo iptables -A OUTPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -P OUTPUT DROP

Это разрешит доступ только к TCP-порту 80. Конечно, вы можете добавить больше правил, например, для порта 80. Но имейте в виду, что все остальные исходящие пакеты (, за исключением кольцевого трафика ), будут заблокированы.

Эта конфигурация не сохраняется после перезагрузки. Вы можете попробовать iptables -, чтобы исправить это. Также это не блокирует трафик IPv6, вам нужно ввести те же команды, но заменить iptables на ip6tables для фильтрации IPv6.

0
28.04.2021, 23:25

Теги

Похожие вопросы