Как заблокировать пользователю доступ к Интернету под Linux?
Я пытаюсь следующее:
iptables -A OUTPUT -p tcp --dport 80,443 -m owner --uid-owner $USERNAME -j DROP
Это правильный синтаксис или команда?
И затем я делаю ssh myhost.somewhere.onthe.internet.example.com -D 12345
, указываю моему браузеру использовать SOCKS proxy localhost:12345
, и я продолжаю свой веселый путь.
Другими словами, внесение в черный список определенных портов недостаточно; Вы можете заблокировать весь доступ к сети:
iptables -A OUTPUT -m owner --uid-owner $USERNAME -j DROP
Обратите внимание, что может потребоваться доступ к определенным сетевым ресурсам (например, к общим сетевым ресурсам), поэтому вам может потребоваться внести их в белый список (или, возможно, в белый список блока локальной сети).
Эта команда блокирует доступ пользователя только к World Wide Web, а не ко всему Интернету.
Кроме того, он должен работать, предполагая, что он запущен на той же машине, на которой работает $USERNAME
.
Прежде всего
iptables
- это правильная команда для выполнения работы. Но в целом вы должны использовать разумное количество команд для создания полной таблицы. 1 команда - это одно изменение таблицы.
Чтобы узнать, какие таблицы уже существуют, и политику по умолчанию, если не найдено ни одного правила, используйте iptables -L
. Обычно он написал бы bash-скрипт, содержащий все настройки iptables. Где, сначала вы промываете все цепи, а затем все сразу вставляете. Это сделано для того, чтобы не потерять отслеживание того, что входит и выходит.
Также проверьте реализацию init, если есть сценарии инициализации, чтобы сделать ваши изменения постоянными в течение циклов питания. (Обычно ваши таблицы теряются после перезагрузки).
Просто создайте сценарий, включающий все ваши команды iptables:
#!/bin/bash
# Flush all chains
iptables -F
#Set defaults policies
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
# Don't block localhost traffic
iptables -A INPUT -i lo -j ACCEPT
# Don't re-evaluate already accepted connections
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#Allowed incomming tcp ports
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT # SSH
# Add watherver you wish to allow more
Смотрите эту статью для получения дополнительных советов по стандартным правилам iptable.
Теперь, чтобы ответить на ваш вопрос
Сначала нам нужно было убедиться, что у вас установлен базовый брандмауэр. Теперь вы можете добавить свое правило к вашему сценарию, чтобы оно вступило в силу. Пожалуйста, примите во внимание предложения от других ответов: пользователь может легко обойти два заблокированных порта с прокси или альтернативными портами.
Кроме того, ваш синтаксис был неверным. --dport может использовать только один порт. Для этого вам нужно использовать многопортовый модуль или объединить несколько правил.
Однако блокировка всех исходящих соединений для этого пользователя приведет к сбою многих приложений, поскольку они зависят от соединения lo, расположенного по адресу localhost или 127.0.0.1. (Например, если вы используете KDM/KDE, ваша система зависает при входе в систему.)
Поэтому вам нужно исключить сетевой интерфейс lo из вашего правила. Если вы все же хотите разрешить пользователю доступ только к определенным службам, просто создайте правило перед правилом DROP, разрешающим эти порты. Я бы предложил следующее:
# Don't re-evaluate already ACCEPTed connections:
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Allow an outgoing connection, like SSH
iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner $USERNAME -j ACCEPT
# Drop anything else that not on localhost
iptables -A OUTPUT ! -o lo -m owner --uid-owner $USERNAME -j DROP