В моем скрипте iptables я экспериментировал с написанием как можно более детальных правил. Я ограничиваю пользователей, которым разрешено использовать какие сервисы, частично для безопасности и частично для обучения.
Использование iptables v1.4.16.2 на Debian 6.0.6 с ядром 3.6.2.
Однако я столкнулся с проблемой, которую пока не совсем понимаю ...
исходящие порты для всех пользователей
Это прекрасно работает. У меня нет общих правил отслеживания состояния.
## Исходящий порт 81 $ IPTABLES -A OUTPUT -p tcp --dport 81 -m conntrack --ctstate НОВЫЙ, УСТАНОВЛЕННЫЙ -j ПРИНЯТЬ $ IPTABLES -A INPUT -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate УСТАНОВЛЕНО -j ПРИНЯТЬ
исходящие порты с соответствием пользователя
## исходящий порт 80 для учетной записи пользователя $ IPTABLES -A OUTPUT --match владелец --uid-владелец useraccount -p tcp --dport 80 -m conntrack --ctstate NEW, УСТАНОВЛЕНО --sport 1024: 65535 -j ПРИНЯТЬ $ IPTABLES -A INPUT -p tcp --sport 80 --dport 1024: 65535 -d $ MYIP -m conntrack --ctstate УСТАНОВЛЕНО -j ПРИНЯТЬ
Это позволяет использовать порт 80 только для учетной записи «useraccount», но такие правила для трафика TCP имеют проблемы.
## Исходящий журнал по умолчанию + правила блокировки $ IPTABLES -A OUTPUT -j LOG - log-префикс "BAD OUTGOING" --log-ip-options --log-tcp-options --log-uid $ IPTABLES -A OUTPUT -j DROP
Проблема
Выше работает, пользователь «useraccount» может получить файлы отлично. Другие пользователи системы не могут устанавливать исходящие соединения на порт 80.
useraccount @ host: $ wget http://cachefly.cachefly.net/10mb.test
Но wget выше оставляет x7 пропущенных записей в моем системном журнале:
18 октября 02:00:35 xxxx ядро: BAD OUTGOING IN = OUT = eth0 SRC = xx.xx.xx.xx DST = 205.234.175.175 LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 12170 DF PROTO = TCP SPT = 37792 DPT = 80 SEQ = 164520678 ACK = 3997126942 ОКНО = 979 RES = 0x00 ACK URGP = 0
Я не получаю эти отбрасывания для аналогичных правил с трафиком UDP. У меня уже есть правила, которые ограничивают, какие пользователи могут делать запросы DNS.
Кажется, что отброшенные исходящие ACK-пакеты поступают от учетной записи root (URGP = 0), чего я не понимаю. Даже когда я меняю useraccount на root.
Я полагаю, что пакеты ACK относятся к категории новых, поскольку conntrack начинает отслеживать соединения после 3-го шага трехстороннего рукопожатия, но почему их отбрасывают?
Можно ли безопасно игнорировать эти капли?
редактировать
Поэтому я часто вижу такие правила, которые хорошо работают для меня:
$ IPTABLES -A OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m состояние --state NEW, УСТАНОВЛЕНО -j ПРИНЯТЬ $ IPTABLES -A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m состояние - состояние УСТАНОВЛЕНО -j ПРИНЯТЬ
Я поменял местами «-m состояние --state» на «-m conntrack --ctstate», так как совпадение состояний явно устарело.
Лучше ли иметь общие правила отслеживания состояния? Разве приведенные выше правила не считаются правильными?
Для жесткого контроля над исходящими соединениями пользователей было бы что-то подобное лучше?
$ IPTABLES -A INPUT -m conntrack --ctstate УСТАНОВЛЕНО -j ПРИНЯТЬ $ IPTABLES -A OUTPUT -m conntrack --ctstate УСТАНОВЛЕНО -j ПРИНЯТЬ $ IPTABLES -A ВЫХОД -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m владелец --uid-владелец useraccount -j ПРИНЯТЬ $ IPTABLES -A ВЫХОД -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m владелец --uid-владелец otheraccount -j ПРИНЯТЬ