[РЕШЕНО] Подскажите с настройкой iptables для определенного пользователя

Всем доброго дня.
Задался вопросом настройки iptables для конкретного локального пользователя. Т. е. чтобы этот пользователь мог открывать только определенные сайты из белого списка и больше ничего, причем всех остальных пользователей системы это вообще никак не касалось. Такое возможно средствами iptables?
Мои поиски привели меня к выводу что настроить iptables только для отдельного пользователя нельзя. Так ли это?
Вот какой конфиг получился:
# Сброс правил iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
iptables -t security -F
iptables -t security -X

# Блокировать все входящие и транзитные пакеты

iptables -P INPUT DROP
iptables -P FORWARD DROP

# Разрешить ICMP

iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

# Разрешить loopback

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Разрешить входящие соединения, запрошенные с локального компьютера

iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT

# Домены разрешенных сайтов (через пробел):

WL="mail.ru yandex.ru google.com"

# Для пользователя:

user="guest"

# Разрешить исходящие соединения на разрешенные сайты только указанному пользователю

for i in $WL; do
	iptables -A OUTPUT -s $i -m !owner --uid-owner $user -j DROP
done

# Запретить указанному пользователю все кроме разрешенных сайтов

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

# Разрешить все исходящие запросы

iptables -P OUTPUT ACCEPT
Этот конфиг работоспособен?
Нужна ли последняя строка?
Будут ли корректно отрабатывать правила при указании доменов вместо ip-адресов при использовании правил:
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
И можно ли все-таки настроить iptables чтобы указанному пользователю были запрещены все входящие соединения кроме ответных с разрешенных сайтов? При этом оставляя открытыми все входящие соединения остальным пользователям?
www.linux32.ru - новости и статьи о Linux
man iptables-extensions
   owner
This module attempts to match various characteristics of the packet creator, for locally
generated packets. This match is only valid in the OUTPUT and POSTROUTING chains. For‐
warded packets do not have any socket associated with them. Packets from kernel threads do
have a socket, but usually no owner.
Тут написано прямо, что модуль owner работает только с локальными исходящими пакетами, то есть теми, которые отправляет пользователь. Только у таких пакетов есть принадлежность к определённому пользователю, остальные пакеты "ничейные".
Соответственно, запретить или разрешить в зависимости от пользователя можно только исходящие, а не входящие. Однако, речь идёт именно об отдельных пакетах, а не соединениях. Поскольку iptables позволяет ставить метки на соединения, в принципе, можно реализовать блокировку второго и последующих пакетов входящего соединения, если на него отвечает определённый пользователь. Заблокировать первый пакет входящего соединения только для заданного пользователя средствами именно iptables не получится, здесь надо использовать другие механизмы.

Если вы хотите ввести негативное правило по владельцу пакета, то есть срабатывающее на всех, кроме него, восклицательный знак ставится перед --uid-owner, а не перед -m owner:
-A OUTPUT -m owner ! --uid-owner bad_user -j ACCEPT

Также у вас не выйдет использовать в iptables имена хостов, потому что у пакетов их просто нет, есть только IP-адреса отправителя и получателя. Поскольку у одного имени хоста может оказаться больше одного IP-адреса, вам придётся заранее преобразовать список хостов в список IP, а потом уже генерировать правила по IP.

Использовать в скрипте, генерирующем правила для iptables, многократный вызов этой команды не рекомендуется, потому что каждая команда iptables вызывает пересборку и применение всех правил в таблице. Загрузка сотни-другой правил таким способом может занимать порядка минуты даже на мощном сервере.
Вместо этого имеет смысл с помощью команд echo отправить все правила на стандартный вывод, и перенаправить всё вместе на ввод команды iptables-restore
Natrio, спасибо.
Жаль что iptables.rules не понимает переменные... придется записывать каждый адрес вручную.
Не получается пока настроить так чтобы все было заблокировано кроме одного какого-нибудь сайта (для примера).
Если
OUTPUT DROP
и
-A OUTPUT -s 94.100.180.200 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
то на сайт 94.100.180.200 (mail.ru) не заходит все-равно.
Нужно помимо ip этого сайта разрешать вручную еще и ip DNS-сервера? Или нужно разрешать весь путь до требуемого сайта?
Если так, то пути брать из traceroute?
Тогда по traceroute вопрос: что делать с неответившими узлами (* в выводе) и какимим ключами указать traceroute чтобы он вывел все адреса на пути к сайту вместо звездочек?
Вообще, применяется ли iptables в подобных ситуациях? И для ограничения доступа в сеть какому-либо одному пользователю нужно использовать другие инструменты? Какие тогда?
www.linux32.ru - новости и статьи о Linux
Правильно, что на 94.100.180.200 не заходит, потому что вы в правиле определили его как source, а он для вас является, наоборот, destination.
А вообще, если у пользователя физический доступ к этому компьютеру, то все эти ваши iptables он сможет рано или поздно обойти. Если речь о компьютерах в локальной сети, для которых ваш комп является шлюзом в инет, то ни о каких -m owner речь идти не может, а правила надо писать для цепочки FORWARD.
Что бы удовлетворить свое желание ограничивать доступ к определенным URL отдельным пользователям, я бы посоветовал рассмотреть вариант с http-прокси. Например, Squid - безумно гибкий и расширяемый.
Пробовал уже указывать -d вместо -s, все равно не открывается сайт. Уже чисто из интереса хочу заставить эту конструкцию работать. Но, похоже придется изучать сквид.
Может быть дело в неуказывании мной портов и протоколов? Их нужно обязательно указывать?
www.linux32.ru - новости и статьи о Linux
Подниму тему.
Путем чтения манов всеже разобрался с задачей. Описал все в своем блоге, если кому интересно вот ссылка.
www.linux32.ru - новости и статьи о Linux
 
Зарегистрироваться или войдите чтобы оставить сообщение.