Iptables script, чтобы заблокировать весь доступ в Интернет, за исключением желаемых приложений

КОНТЕКСТ:

Я хотел иметь оболочку script, которая блокировала бы весь входящий/исходящий трафик на мой компьютер, ЕСЛИ я не хочу использовать браузер или какое-либо другое приложение, и в этом случае я бы вызвал его, и только эти приложения работать.

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

Вот результат выполненной работы:

Результаты:

до запуска оболочки script создается группа с именем Интернет:

sudo groupadd internet

Shell Script:

#!/bin/sh
#only allow apps run from "internet" group to run

# clear previous rules
sudo iptables -F

# accept packets for internet group
sudo iptables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo iptables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT

# also allow local connections
sudo iptables -A OUTPUT -p tcp -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d 192.168.0.1/24 -j ACCEPT

# reject packets for other users
sudo iptables -A OUTPUT -j REJECT

# same process for IPv6:
sudo ip6tables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p tcp -d 127.0.0.1 -j ACCEPT
sudo ip6tables -A OUTPUT -p tcp -d 192.168.0.1/24 -j ACCEPT
sudo ip6tables -A OUTPUT -j REJECT

это другая часть оболочки, над которой я сейчас работаю, а не на 100% уверен в:

#DROPS ALL INPUT and FORWARD
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP

#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#SAME REPEATED FOR IPv6
sudo ip6tables -A INPUT -j DROP
sudo ip6tables -A FORWARD -j DROP
sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

после выполнения всего script выше, следующая команда откроет терминал, который будет частью группы internet, и, следовательно, любое приложение (например, firefox, например), открытое этим терминалом, будет иметь интернет доступ, в то время как все остальные INPUT/OUTPUT будут остановлены

sudo -g internet -s

Вопрос:

Является ли предыдущая логика в порядке? В настоящее время я работаю над тестированием всех функций, устанавливая программное обеспечение сетевого мониторинга (nethogs), проверяя каждую строку кода и проверяя, соответствует ли результат, как ожидалось, НО > , я только начал узнав об iptables 2 дня назад, поэтому, несмотря на то, что исходники исходного кода сделаны опытными кодерами, я не уверен на 100% в своей способности собрать все вместе, чтобы получить желаемый результат. Спасибо всем, кто нашел время, чтобы прочитать все это и принять участие в обсуждении !!!

Источники:

https://plus.google.com/+TobyKurien/posts/YZhZJCZmGgm https://serverfault.com/info/429400/iptables-rule-to-allow-all-outbound-locally-originating-traffic

P.S.: Спасибо @dirkt за то, что помогли мне понять многие фундаментальные концепции iptables, а также ответить на некоторые из моих вопросов относительно исходного кода.


UPDATE:

Итак, после запуска кода, похоже, что-то не так. Что происходит, так это следующее. Я запустил оболочку Script:

bash myscript

Я получаю 2 ошибки следующим образом:

ip6tables v1.6.0: host/network 127.0.0.1 не найден Попробуйте `ip6tables -h 'или' ip6tables -help 'для получения дополнительной информации.

ip6tables v1.6.0: host/network 198.168.0.1 не найден Попробуйте `ip6tables -h 'или' ip6tables -help 'для получения дополнительной информации.

но все остальное работает хорошо, а при выполнении sudo iptables -L я подтвердил, что все остальные правила действуют. ПОСЛЕ, я пробовал следующее:

  • Запустите firefox вручную, дважды щелкнув значок. Результат был таким, как ожидалось, сразу же я получил ошибку Сервер не найден, что было хорошим знаком
  • После этого я запустил команду sudo -g internet -s в терминале, а затем firefox. СЕЙЧАС..., когда я пытался загрузить сайт, он не показывал мне, что сервер не найден, но он продолжает загружаться в течение длительного периода времени, очень долго. Это заставляет меня думать, что, возможно, выходной ответ был отправлен, НО вход блокировался.

Если кто-нибудь знает, почему это может произойти, я хотел бы знать ваши отзывы!

Ответ 1

Я только начал изучать iptables 2 дня назад, поэтому, хотя исходники исходного кода выполняются опытными кодерами, я не уверен на 100% в своей способности собрать все вместе, чтобы создать желаемый результат.

Кстати, я ищу одно и то же решение в одно и то же время и увидел ваш пост. Просто зарегистрируйтесь ТАК, надеюсь, это может помочь вам и другим. Я все еще учусь и открываю советы и советы:)

Несколько изменений кода. Мне нужно открыть весь порт для локальных подключений, чтобы он работал. Также изменено 192.168.0.1/24 до 192.168.0.0/16. Этот диапазон допускал включение wifi/usb-троса.

# also allow local connections
#TODO. Use log to see which port are actually needed.
sudo iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -d 192.168.0.0/16 -j ACCEPT

Является ли предыдущая логика в порядке?

Измените порядок для этого кода.

#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#DROPS ALL INPUT and FORWARD 
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP

Также добавьте этот код поверх предыдущего кода. Они берутся из брандмауэра по умолчанию. Первоначально он содержал конкретный интерфейс.

sudo iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 67 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 67 -j ACCEPT

Я получаю 2 ошибки следующим образом:

ip6tables v1.6.0: host/network 127.0.0.1 не найден. Попробуйте `ip6tables -h 'или' ip6tables -help 'для получения дополнительной информации.

     

ip6tables v1.6.0: host/network 198.168.0.1 не найден. Попробуйте `ip6tables -h 'или' ip6tables -help 'для получения дополнительной информации.

Возможно, потому, что вы используете IP4-адрес. Изменение 127.0.0.1 до: 1/128 и 198.168.0.1 до fe80::/10. Не могу много помочь в IPv6. Я понятия не имею, как это работает, и я не думаю, что использую IPv6 вообще.

Завершить Script:

#!/bin/sh
#only allow apps run from "internet" group to run

# clear previous rules
sudo iptables -F

# accept packets for internet group
sudo iptables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo iptables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT
#Some application need more port. Such as ping.
sudo iptables -A OUTPUT -p icmp -m owner --gid-owner internet -j ACCEPT
#Less secure. Open all port.
#sudo iptables -A OUTPUT -m owner --gid-owner internet -j ACCEPT

# also allow local connections
#TODO. Use log to see which port are actually needed.
sudo iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -d 192.168.0.0/16 -j ACCEPT

# reject packets for other users
sudo iptables -A OUTPUT -j REJECT

#Taken from default rules.
sudo iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 67 -j ACCEPT
sudo iptables -A INPUT -p tcp -m tcp --dport 67 -j ACCEPT

#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#DROPS ALL INPUT and FORWARD
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP


#IPv6 Section

# Flush ip6tables too
sudo ip6tables -F

# same process for IPv6:
sudo ip6tables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -d ::1/128 -j ACCEPT
sudo ip6tables -A OUTPUT -d fe80::/10 -j ACCEPT
sudo ip6tables -A OUTPUT -j REJECT

sudo ip6tables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
sudo ip6tables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
sudo ip6tables -A INPUT -p udp -m udp --dport 67 -j ACCEPT
sudo ip6tables -A INPUT -p tcp -m tcp --dport 67 -j ACCEPT
sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -j DROP
sudo ip6tables -A FORWARD -j DROP