КОНТЕКСТ:
Я хотел иметь сценарий оболочки, который блокировал бы весь входящий / исходящий трафик на мой компьютер, ЕСЛИ Я решил, что хочу использовать браузер или какое-то другое приложение, в этом случае я бы вызвал его, и запускались только эти приложения.
Я исследовал предыдущие сценарии, сделанные умными людьми (ссылки на источники в конце), а также потратил время на то, чтобы научиться использовать iptables самостоятельно (все еще работая над этим фронтом).
Вот результат проделанной работы:
РЕЗУЛЬТАТЫ:
перед запуском сценария оболочки создается группа с именем internet :
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
после выполнения всего вышеприведенного сценария следующая команда откроет терминал, который будет частью internet
группы, и, следовательно, любое приложение (например, firefox), которое было открыто этим терминалом, будет иметь доступ в интернет, в то время как все другие INPUT/ ВЫХОД будет остановлен
sudo -g internet -s
ВОПРОС:
Предыдущая логика в порядке? В настоящее время я работаю над тестированием всех функций, устанавливая программное обеспечение для мониторинга сети (nethogs), тестирую каждую строку кода и проверяю, соответствует ли результат ожидаемым, НО в то же время я только начал изучать iptables 2 дня назад, поэтому, хотя исходные коды написаны опытными программистами, я не уверен на 100% в своей способности собрать все это вместе для получения желаемого результата. Спасибо всем, кто нашел время, чтобы прочитать все это и принять участие в обсуждении !!!
источники:
https://plus.google.com/+TobyKurien/posts/YZhZJCZmGgm https://serverfault.com/questions/429400/iptables-rule-to-allow-all-outbound-locally-originating-traffic
PS: Спасибо @dirkt за ранее оказанную помощь в понимании многих фундаментальных концепций iptables, а также за ответы на некоторые мои вопросы, касающиеся исходного кода.
ОБНОВИТЬ:
Так что после запуска кода, похоже, что-то не так. Что происходит следующим образом. Я запускаю скрипт оболочки:
bash myscript
Я получаю 2 ошибки следующим образом:
ip6tables v1.6.0: хост / сеть
127.0.0.1
не найден Попробуйте 'ip6tables -h' или 'ip6tables --help' для получения дополнительной информации.ip6tables v1.6.0: хост / сеть
198.168.0.1
не найден Попробуйте «ip6tables -h» или «ip6tables --help» для получения дополнительной информации.
но все остальное работало хорошо, и когда я делал sudo iptables -L
я подтвердил, что все остальные правила действуют. После этого я попробовал следующее:
- Запустите Firefox, дважды щелкнув значок. Результат был, как и ожидалось, сразу же я получил ошибку Server not found , что было хорошим признаком
- После этого я запустил команду
sudo -g internet -s
в терминале, а затемfirefox
. ТЕПЕРЬ ... когда я пытался загрузить сайт, он не показывал мне, что Сервер не найден , но он продолжал загружаться в течение длительного периода времени, очень долго. Это наводит меня на мысль, что, возможно, ответ на запрос был отправлен, НО вход был заблокирован.
Если кто-нибудь знает, почему это может происходить, я хотел бы знать ваши отзывы!