Блокировка интернета в МОС при помощи iptables: различия между версиями
Dkirienko (обсуждение | вклад) м |
Dkirienko (обсуждение | вклад) |
||
(не показано 10 промежуточных версий этого же участника) | |||
Строка 2: | Строка 2: | ||
'''Эта статья относится только к МОС-12 и неприменима к МОС-10. В МОС-12 необходимо использовать аналогичную службу [[Блокировка интернета в МОС-12 при помощи nftables|nftables]].''' | |||
Типичной задачей при проведении олимпиад, тестирований, экзаменов и т.д. является ограничение доступа в интернет, оставив доступ к одному или нескольким сайтам. Рассмотрим решение этой задачи с использованием iptables - стандартных для Linux правил обработки сетевых пакетов. | Типичной задачей при проведении олимпиад, тестирований, экзаменов и т.д. является ограничение доступа в интернет, оставив доступ к одному или нескольким сайтам. Рассмотрим решение этой задачи с использованием iptables - стандартных для Linux правил обработки сетевых пакетов. | ||
Строка 31: | Строка 32: | ||
*Снаружи оставим доступ к данному компьютеру по SSH, чтобы сохранить возможность удалённого администрирования. SSH использует порт 22. | *Снаружи оставим доступ к данному компьютеру по SSH, чтобы сохранить возможность удалённого администрирования. SSH использует порт 22. | ||
*Также оставим возможность использования протокола ICMP для работы ping, например, чтобы можно было "пинговать" наш компьютер. | *Также оставим возможность использования протокола ICMP для работы ping, например, чтобы можно было "пинговать" наш компьютер. | ||
*Разрешим сетевые соединения с этим же компьютером (на адрес 127.0.0.1/8), что нужно для работы некоторых приложений. | |||
Определим адрес сайта olympiads.ru при помощи команды host. Обратите внимание, у одного доменного имени может быть несколько IP-адресов (как, например, у google.com), тогда нужно будет добавить все эти IP-адреса в конфиг. | Определим адрес сайта olympiads.ru при помощи команды host. Обратите внимание, у одного доменного имени может быть несколько IP-адресов (как, например, у google.com), тогда нужно будет добавить все эти IP-адреса в конфиг. | ||
Строка 39: | Строка 41: | ||
-P DROP | -P DROP | ||
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | ||
-s 127.0.0.1/8 -j ACCEPT | |||
-p tcp --dport 22 -j ACCEPT | -p tcp --dport 22 -j ACCEPT | ||
-p icmp -j ACCEPT | -p icmp -j ACCEPT | ||
Здесь первая строка "-P DROP" указывает политику обработки пакетов "по умолчанию" - входящие пакеты будут сброшены. Затем идёт набор правил, заканчивающихся действием "-j ACCEPT". Пакеты, удовлетворяющие этим правилам, будут приняты. Во второй строчке задаётся правило для принятия всех пакетов уже установленных соединений. В третьей | Здесь первая строка "-P DROP" указывает политику обработки пакетов "по умолчанию" - входящие пакеты будут сброшены. Затем идёт набор правил, заканчивающихся действием "-j ACCEPT". Пакеты, удовлетворяющие этим правилам, будут приняты. Во второй строчке задаётся правило для принятия всех пакетов уже установленных соединений. В третьей строке задано правило, разрешающее все пакеты, отправленные с этого же компьютера (опция -s задаёт источник (source) пакетов, с указанием адреса сети 127.0.0.1/8). Это разрешение нужно для корректной работы некоторых сред разработки (например, Wing IDE), которые взаимодействуют с отладчиком или интерпретатором посредством сетевых соединений. В четвёртой строке - правило для входящих пакетов, отправленных по протоколу tcp (опция -p tcp) на порт 22 (опция --dport 22 задаёт порт назначения (destination) пакета). Это правило мы оставим для возможности удалённого управления компьютером при помощи ssh. Пятая строка разрешает пакеты по протоколу icmp, то есть ping-запросы. | ||
Запишем в файл '''/etc/net/ifaces/default/fw/iptables/filter/OUTPUT''' следующий текст: | Запишем в файл '''/etc/net/ifaces/default/fw/iptables/filter/OUTPUT''' следующий текст: | ||
-P DROP | -P DROP | ||
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | ||
-d 127.0.0.1/8 -j ACCEPT | |||
-d 194.58.88.173 -j ACCEPT | -d 194.58.88.173 -j ACCEPT | ||
-p tcp --dport 53 -j ACCEPT | -p tcp --dport 53 -j ACCEPT | ||
-p udp --dport 53 -j ACCEPT | -p udp --dport 53 -j ACCEPT | ||
Здесь всё аналогично, в третьей строке мы разрешаем все исходящие пакеты на адрес 194.58.88.173. При необходимости открыть доступ к другим адресам добавьте аналогичные строчки. Можно также открыть | Здесь всё аналогично, в третьей строке разрешаем пакеты, отправляемые на этот же компьютер. В четвёртой строке мы разрешаем все исходящие пакеты на адрес 194.58.88.173 (опция -d задаёт адрес компьютера, на который отправляется пакет, или адрес сети). При необходимости открыть доступ к другим адресам добавьте аналогичные строчки. Можно также открыть доступ целиком к некоторой сети, например, -d 10.0.0.0/8 откроет доступ к группе локальных IP-адресов. В строках 5 и 6 откроем все исходящие соединения на порты 53 по протоколам tcp и udp для того, чтобы работала служба DNS. | ||
Если хочется реализовать блокировку по "чёрному списку", то | Если хочется реализовать блокировку по "чёрному списку", то есть заблокировать доступ к нескольким IP-адресам, оставив открытые все остальные, то можно это реализовать при помощи -P ACCEPT в качестве политики по умолчанию и действий -j DROP для тех адресов, которые нужно заблокировать. | ||
Если необходимо разрешить обнаруживать локальные сетевые ресурсы при помощи службы [[Avahi]] (например, включить ресолвинг имён из домена .local в IP-адреса), необходимо разрешить UDP-запросы на порт 5353. Подробней в статье [[Avahi]]. | |||
Для того, чтобы изменения вступили в силу, нужно перезагрузить компьютер или перезапустить поддержку сети: | Для того, чтобы изменения вступили в силу, нужно перезагрузить компьютер или перезапустить поддержку сети: | ||
# systemctl restart network | # systemctl restart network | ||
Если настройка выполняется удалённо, то может быть полезен скрипт, который выполняет все указанные выше действия. | Если настройка выполняется удалённо, то может быть полезен скрипт, который выполняет все указанные выше действия. Слова "END1" и "END2" в этом скрипте - это указатели на конец выводимого текста, они не будет записаны в данные файлы. | ||
#!/bin/bash | #!/bin/bash | ||
Строка 63: | Строка 68: | ||
# Записываем настройки в цепочку INPUT | # Записываем настройки в цепочку INPUT | ||
cat << | cat << END1 > /etc/net/ifaces/default/fw/iptables/filter/INPUT | ||
-P DROP | -P DROP | ||
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | ||
-d 127.0.0.1/8 -j ACCEPT | |||
-p tcp --dport 22 -j ACCEPT | -p tcp --dport 22 -j ACCEPT | ||
-p icmp -j ACCEPT | -p icmp -j ACCEPT | ||
END1 | |||
# Записываем настройки в цепочку OUTPUT | # Записываем настройки в цепочку OUTPUT | ||
cat << | cat << END2 > /etc/net/ifaces/default/fw/iptables/filter/OUTPUT | ||
-P DROP | -P DROP | ||
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | ||
-d 127.0.0.1/8 -j ACCEPT | |||
-d 194.58.88.173 -j ACCEPT | -d 194.58.88.173 -j ACCEPT | ||
-p tcp --dport 53 -j ACCEPT | -p tcp --dport 53 -j ACCEPT | ||
-p udp --dport 53 -j ACCEPT | -p udp --dport 53 -j ACCEPT | ||
END2 | |||
# Перезапускаем сеть | # Перезапускаем сеть | ||
systemctl restart network | systemctl restart network | ||
=== Отключение блокировки интернета === | === Отключение блокировки интернета=== | ||
Чтобы отключить блокировку, можно выполнить одно из двух действий. | Чтобы отключить блокировку, можно выполнить одно из двух действий. | ||
Строка 90: | Строка 96: | ||
Можно сделать командой | Можно сделать командой | ||
sed 's/^CONFIG_FW=.*/CONFIG_FW=no/' -i /etc/net/ifaces/default/options | sed 's/^CONFIG_FW=.*/CONFIG_FW=no/' -i /etc/net/ifaces/default/options | ||
Тогда у вас сохранятся файлы с цепочками INPUT и OUTPUT, и вы можете не меняя конфигурацию iptables просто включать или выключать работу iptables, меняя параметр CONFIG_FW в указанном файле. | Тогда у вас сохранятся файлы с цепочками INPUT и OUTPUT, и вы можете не меняя конфигурацию iptables просто включать или выключать работу iptables, меняя параметр CONFIG_FW в указанном файле. После применения изменений перезапустите компьютер (просто перезапустить сеть недостаточно, потому что перезапуск сети не отключает файрвол, а просто не настраивает его, поэтому сохраняются старые настройки). | ||
Второй способ. Не отключать фильтрацию как таковую, а просто очистить цепочки с правилами. Можно сделать командами | Второй способ. Не отключать фильтрацию как таковую, а просто очистить цепочки с правилами. Можно сделать командами | ||
echo -n > /etc/net/ifaces/default/fw/iptables/filter/INPUT | echo -n > /etc/net/ifaces/default/fw/iptables/filter/INPUT | ||
echo -n > /etc/net/ifaces/default/fw/iptables/filter/OUTPUT | echo -n > /etc/net/ifaces/default/fw/iptables/filter/OUTPUT | ||
В | В данном случае для применения новых правил достаточно просто перезапустить сеть командой systemctl restart network. | ||
systemctl restart network | |||
===Известные проблемы=== | |||
Перезапуск сети при помощи команды | |||
# systemctl restart network | |||
не позволяет отключить firewall, потому что при наличии опции CONFIG_FW=no скрипт просто не настраивает firewall, то есть установленные настройки не меняются (см. [https://www.altlinux.org/Etcnet_Firewall#%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0 статью о настройке firewall в etcnet]). Поэтому если вы хотите изменить правила или отключить фильтрацию, то нужно перезагрузить компьютер. | |||
В любой момент вы можете проверить содержимое текущих правил iptables при помощи команды | |||
# iptables-save | |||
Также рекомендуется вписать правила, разрешающие соединения на этот же компьютер (для сетевых адресов 127.0.0.1/8), так как некоторые программы (например, Wing IDE) используют подобные сетевые соединения и при их фильтрации они будут работать некорректно. | |||
[[Категория:МОС]] | [[Категория:МОС]] |
Текущая версия на 00:17, 13 ноября 2023
Эта статья относится только к МОС-12 и неприменима к МОС-10. В МОС-12 необходимо использовать аналогичную службу nftables.
Типичной задачей при проведении олимпиад, тестирований, экзаменов и т.д. является ограничение доступа в интернет, оставив доступ к одному или нескольким сайтам. Рассмотрим решение этой задачи с использованием iptables - стандартных для Linux правил обработки сетевых пакетов.
Достоинства использования iptables на рабочих станциях:
- Готовое решение, не требует установки дополнительного ПО.
- Не требует наличия маршрутизатора, прокси-сервера и т.д, может быть реализовано в любом компьютерном классе.
Недостатки использования iptables:
- Фильтрация производится на каждом компьютере, поэтому требуется настройка каждого компьютера (но может быть выполнена скриптами с использованием ssh).
- Фильтрация производится по IP-адресу, поэтому если разрешается доступ к какому-либо сайту, то будет открыт и доступ ко всем сайтам на том же IP-адресе.
- Если у сайта изменился IP-адрес, то необходимо обновить правило фильтрации.
Настройка блокировки интернета
Мы рассмотрим настройку iptables при помощи системы настройки etcnet. По умолчанию в М ОС сеть настраивается при помощи etcnet. Файлы настройки сети находятся в каталоге /etc/net.
Прежде всего необходимо включить файрвол в файле /etc/net/ifaces/default/options. Необходимо изменить значение параметра CONFIG_FW на yes:
CONFIG_FW=yes
После этого необходимо отредактировать файлы из каталога /etc/net/ifaces/default/fw/iptables/filter. В этих файлах задаются правила для фильтрации входящих пакетов (INPUT) и исходящих пакетов (OUTPUT), а также для пересылаемых пакетов (FORWARD).
Цепочка FORWARD понадобится для настройки фильтрации на сетевых шлюзах. Если компьютер используется в качестве сетевого шлюза, то проходящие через него пакеты обрабатываются в цепочке FORWARD, и используя эту цепочку можно настроить фильтрацию трафика, например, для отдельного компьютерного класса на шлюзе, через который проходят эти пакеты, но настройка межсетевых шлюзов не является предметом этой статьи. Поэтому здесь мы ограничимся только цепочками INPUT и OUTPUT.
Допустим, мы хотим применить следующие правила.
- Ограничить доступ к сети интернет только одним сайтом, например, olympiads.ru
- Также необходимо обеспечить работу службы DNS, чтобы браузер и система могли определить IP-адрес данного сайта. DNS использует порт 53.
- Снаружи оставим доступ к данному компьютеру по SSH, чтобы сохранить возможность удалённого администрирования. SSH использует порт 22.
- Также оставим возможность использования протокола ICMP для работы ping, например, чтобы можно было "пинговать" наш компьютер.
- Разрешим сетевые соединения с этим же компьютером (на адрес 127.0.0.1/8), что нужно для работы некоторых приложений.
Определим адрес сайта olympiads.ru при помощи команды host. Обратите внимание, у одного доменного имени может быть несколько IP-адресов (как, например, у google.com), тогда нужно будет добавить все эти IP-адреса в конфиг.
# host olympiads.ru olympiads.ru has address 194.58.88.173 olympiads.ru mail is handled by 10 mf1.nic.ru.
Запишем в файл /etc/net/ifaces/default/fw/iptables/filter/INPUT следующий текст:
-P DROP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -s 127.0.0.1/8 -j ACCEPT -p tcp --dport 22 -j ACCEPT -p icmp -j ACCEPT
Здесь первая строка "-P DROP" указывает политику обработки пакетов "по умолчанию" - входящие пакеты будут сброшены. Затем идёт набор правил, заканчивающихся действием "-j ACCEPT". Пакеты, удовлетворяющие этим правилам, будут приняты. Во второй строчке задаётся правило для принятия всех пакетов уже установленных соединений. В третьей строке задано правило, разрешающее все пакеты, отправленные с этого же компьютера (опция -s задаёт источник (source) пакетов, с указанием адреса сети 127.0.0.1/8). Это разрешение нужно для корректной работы некоторых сред разработки (например, Wing IDE), которые взаимодействуют с отладчиком или интерпретатором посредством сетевых соединений. В четвёртой строке - правило для входящих пакетов, отправленных по протоколу tcp (опция -p tcp) на порт 22 (опция --dport 22 задаёт порт назначения (destination) пакета). Это правило мы оставим для возможности удалённого управления компьютером при помощи ssh. Пятая строка разрешает пакеты по протоколу icmp, то есть ping-запросы.
Запишем в файл /etc/net/ifaces/default/fw/iptables/filter/OUTPUT следующий текст:
-P DROP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -d 127.0.0.1/8 -j ACCEPT -d 194.58.88.173 -j ACCEPT -p tcp --dport 53 -j ACCEPT -p udp --dport 53 -j ACCEPT
Здесь всё аналогично, в третьей строке разрешаем пакеты, отправляемые на этот же компьютер. В четвёртой строке мы разрешаем все исходящие пакеты на адрес 194.58.88.173 (опция -d задаёт адрес компьютера, на который отправляется пакет, или адрес сети). При необходимости открыть доступ к другим адресам добавьте аналогичные строчки. Можно также открыть доступ целиком к некоторой сети, например, -d 10.0.0.0/8 откроет доступ к группе локальных IP-адресов. В строках 5 и 6 откроем все исходящие соединения на порты 53 по протоколам tcp и udp для того, чтобы работала служба DNS.
Если хочется реализовать блокировку по "чёрному списку", то есть заблокировать доступ к нескольким IP-адресам, оставив открытые все остальные, то можно это реализовать при помощи -P ACCEPT в качестве политики по умолчанию и действий -j DROP для тех адресов, которые нужно заблокировать.
Если необходимо разрешить обнаруживать локальные сетевые ресурсы при помощи службы Avahi (например, включить ресолвинг имён из домена .local в IP-адреса), необходимо разрешить UDP-запросы на порт 5353. Подробней в статье Avahi.
Для того, чтобы изменения вступили в силу, нужно перезагрузить компьютер или перезапустить поддержку сети:
# systemctl restart network
Если настройка выполняется удалённо, то может быть полезен скрипт, который выполняет все указанные выше действия. Слова "END1" и "END2" в этом скрипте - это указатели на конец выводимого текста, они не будет записаны в данные файлы.
#!/bin/bash # Исправляем файл /etc/net/ifaces/default/options sed 's/^CONFIG_FW=.*/CONFIG_FW=yes/' -i /etc/net/ifaces/default/options # Записываем настройки в цепочку INPUT cat << END1 > /etc/net/ifaces/default/fw/iptables/filter/INPUT -P DROP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -d 127.0.0.1/8 -j ACCEPT -p tcp --dport 22 -j ACCEPT -p icmp -j ACCEPT END1 # Записываем настройки в цепочку OUTPUT cat << END2 > /etc/net/ifaces/default/fw/iptables/filter/OUTPUT -P DROP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -d 127.0.0.1/8 -j ACCEPT -d 194.58.88.173 -j ACCEPT -p tcp --dport 53 -j ACCEPT -p udp --dport 53 -j ACCEPT END2 # Перезапускаем сеть systemctl restart network
Отключение блокировки интернета
Чтобы отключить блокировку, можно выполнить одно из двух действий.
Первый способ. Записать в файл /etc/net/ifaces/default/options параметр CONFIG_FW=no
Можно сделать командой
sed 's/^CONFIG_FW=.*/CONFIG_FW=no/' -i /etc/net/ifaces/default/options
Тогда у вас сохранятся файлы с цепочками INPUT и OUTPUT, и вы можете не меняя конфигурацию iptables просто включать или выключать работу iptables, меняя параметр CONFIG_FW в указанном файле. После применения изменений перезапустите компьютер (просто перезапустить сеть недостаточно, потому что перезапуск сети не отключает файрвол, а просто не настраивает его, поэтому сохраняются старые настройки).
Второй способ. Не отключать фильтрацию как таковую, а просто очистить цепочки с правилами. Можно сделать командами
echo -n > /etc/net/ifaces/default/fw/iptables/filter/INPUT echo -n > /etc/net/ifaces/default/fw/iptables/filter/OUTPUT
В данном случае для применения новых правил достаточно просто перезапустить сеть командой systemctl restart network.
Известные проблемы
Перезапуск сети при помощи команды
# systemctl restart network
не позволяет отключить firewall, потому что при наличии опции CONFIG_FW=no скрипт просто не настраивает firewall, то есть установленные настройки не меняются (см. статью о настройке firewall в etcnet). Поэтому если вы хотите изменить правила или отключить фильтрацию, то нужно перезагрузить компьютер.
В любой момент вы можете проверить содержимое текущих правил iptables при помощи команды
# iptables-save
Также рекомендуется вписать правила, разрешающие соединения на этот же компьютер (для сетевых адресов 127.0.0.1/8), так как некоторые программы (например, Wing IDE) используют подобные сетевые соединения и при их фильтрации они будут работать некорректно.