iptables правило, чтобы разблокировать доступ в Интернет и снова заблокировать его через 3600 секунд

awk -F'|' '$1 > 20 { system("/path/to/another/script.sh "$2 }' < file.text

Это говорит awk разделить ввод на поля на основе символа вертикальной черты. Любое первое поле, значение которого больше 20, инициирует системный вызов... чего угодно. Имейте в виду, что аргумент (здесь $2, но это может быть $0 или любое другое вычисление, которое вы делаете в awk ), передается сценарию через вызов оболочки, поэтому, если эти значения могут содержать специальные символы оболочки -, внимательно цитируйте. Я сошлюсь на один из ответов Стефана для примера того, как это сделать:

awk 'function escape(s) {
       gsub(/'\''/,"&\\\\&&",s)
       return "'\''" s "'\''"
     }
     { system("/path/to/another/script.sh" escape($2)) }'
4
11.05.2020, 05:16
3 ответа

Вы также можете использовать ipset. Это немного сложнее, но тайм-аут будет полностью обрабатываться ядром. Одним из преимуществ является то, что вы можете продлить тайм-аут, не беспокоясь об отмене каких-либо команд в очереди.

Создайте набор и добавьте соответствующие правила iptables:

ipset create son_allowed hash:net timeout 3600
iptables -A OUTPUT -m owner --uid-owner son -m set --match-set son_allowed dst -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner son -j REJECT

Сценарий разблокировки теперь должен только добавить все IP-адреса в набор:

ipset add son_allowed 0.0.0.0/1 -exist
ipset add son_allowed 128.0.0.0/1 -exist

(Примечание :К сожалению, 0.0.0.0/0нельзя добавить к набору типа хэш :net, поэтому необходимы две записи. Вы также можете настроить время ожидания здесь, добавив опцию timeout SECONDS.)

Если вы используете IPv6, создайте еще один ipset с флагом family inet6, добавьте для него правило iptables и в сценарии разблокировки добавьте ::/1и 8000::/1в набор.

0
28.04.2021, 23:15

Вы можете использоватьat:

sudo at next hour -f myiptablesscript

где myiptablescriptбыла команда для отключения доступа, или в одной строке как что-то вроде

sudo at next hour -f /dev/stdin <<< "iptables -A OUTPUT -m owner --uid-owner son -j REJECT"

Вы можете объединить разблокировку и блокировку в двухстрочный -скрипт:

#!/bin/bash
iptables -D OUTPUT -m owner --uid-owner son -j REJECT
at next hour -f /dev/stdin <<< "iptables -A OUTPUT -m owner --uid-owner son -j REJECT"

Если вы сохраните этот скрипт как unblockinternetс разрешением на выполнение, вы вызовете его как

sudo./unblockinternet

что немедленно удалит блокирующее правило; и поставить в очередь его восстановление, чтобы оно произошло через час.

5
28.04.2021, 23:15

Если у вас есть systemd, вы можете написать небольшой файл модуля, скажем, /etc/systemd/system/unblockinternet.service, содержащий

[Unit]
Description=unblock internet 1 hour
[Service]
Type=simple
ExecStartPre=/usr/sbin/iptables...
ExecStart=/usr/bin/sleep 3600
ExecStop=/usr/bin/iptables...

Чтобы запустить его, введите systemctl restart unblockinternet, и он попросит вас пройти аутентификацию как root.

4
28.04.2021, 23:15

Теги

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