Вы можете попробовать запустить xinput --test-xi2 --root
, чтобы показать вам все события ввода по мере их возникновения, но они не будут отображать явную команду заставки, такую как из xset s reset
.
Задачу можно разделить на две части:
определить, когда используется точка ограниченного доступа (привязка )
определить, какие исходящие пакеты принадлежат приложениям с ограниченным доступом
Объединение этих двух параметров вместе идентифицирует пакеты, принадлежащие приложениям с ограниченным доступом, отправляемые с использованием точки ограниченного доступа (, чтобы отбрасывать такие пакеты ).
Некоторый клей до, а не после объяснений, так что печатать все по порядку просто работает.
Используйте две цепочки iptables :одну, выполняющую действие(blocksomeapps ), другую(tetheractivated)для ее вызова, которую можно легко сбросить:
iptables -N tetheractivated
iptables -N blocksomeapps
iptables -I OUTPUT -j tetheractivated
Этот ответ предполагает, что только одна точка доступа используется в любой момент и что эта точка доступа использует уже известное имя сетевого интерфейса(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 )отключен.
С этим сложнее справиться. Существуют различные способы идентификации пакета, принадлежащего конкретному процессу, требующие в любом случае дополнительной подготовки. Некоторые методы требуют больше вещей, чем другие.
Некоторые примеры:
Вот довольно простой метод, найденный в этом 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 не будет заблокирован.
myaction.sh
будет недостаточно (, потому что знание SSID, к которому мы подключились, ничего не дает о сетевом уровне, который еще даже не настроен ). ip netns
, только потому, что оба накладывают ограничения на использование cgroups (дляip netns
:как ip netns exec...
перемонтирует /sys/
, дерево /sys/fs/cgroup
становится недоступным, и его нельзя смонтировать дважды ). tetheractivated
можно вставить после обычного правила ESTABLISHED
с отслеживанием состояния для снижения нагрузки, но тогда уже установленные потоки не будут отбрасываться, что может поддерживать их работу в течение некоторого времени в зависимости от приложения. Это может помочь с помощьюconntrack
(-D
или-F
). tc
(и егоcgroupфильтр )можно использовать для применения жестких ограничений пропускной способности. Просто помните, что в то время как исходящий трафик находится под полным контролем, входящий трафик не становится :после получения пакета (и связывается с тем же потоком, что и предыдущий исходящий ), даже если он был отброшен, данные уже были потрачены.Есть два случая:
Случай 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.