5

Как заблокировать пользователю доступ к Интернету под Linux?

Я пытаюсь следующее:

iptables -A OUTPUT -p tcp --dport 80,443 -m owner --uid-owner $USERNAME -j DROP

Это правильный синтаксис или команда?

3 ответа3

4

И затем я делаю ssh myhost.somewhere.onthe.internet.example.com -D 12345 , указываю моему браузеру использовать SOCKS proxy localhost:12345 , и я продолжаю свой веселый путь.

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

iptables -A OUTPUT -m owner --uid-owner $USERNAME -j DROP

Обратите внимание, что может потребоваться доступ к определенным сетевым ресурсам (например, к общим сетевым ресурсам), поэтому вам может потребоваться внести их в белый список (или, возможно, в белый список блока локальной сети).

0

Эта команда блокирует доступ пользователя только к World Wide Web, а не ко всему Интернету.

Кроме того, он должен работать, предполагая, что он запущен на той же машине, на которой работает $USERNAME .

0

Прежде всего

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .