Смотрел руководство iptables 1.1.19, книгу "оптимизация и защита линукс сервера" и ещё несколько источников.
Везде пробрасывать порты до сервера, стоящего в DMZ предлагают приблизительно следующим образом:
(1) iptables -A PREROUTING -i $EXT_I -s $EXT_NET -d $EXT_IP -p tcp --dport 80 -j DNAT --to-destination $DMZ_HTTP_IP
(2) iptables -A FORWARD -i $EXT_I -s $EXT_NET -o $DMZ_I -d $DMZ_HTTP_IP -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A FORWARD -i $EXT_I -s $EXT_NET -o $DMZ_I -d $DMZ_HTTP_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $DMZ_I -s $DMZ_HTTP_IP -o $EXT_I -d $EXT_NET -m state --state ESTABLISHED,RELATED -j ACCEPT
где:
EXT_I -внешний интерфейс
EXT_NET - адреса внешней сети (если интернет, то этот параметр можно опустить)
EXT_IP - IP маршрутизатора на внешнем интерфейсе
DMZ_I - интерфейс, смотрящий в DMZ.
DMZ_HTTP_IP - адрес сервера в DMZ зоне
Всё это работает прекрасно (если я конечно нигде не ошибся).
Но с такой схемой проброса возможна (или невозможна?) примерно такая "атака", позволяющая выявить наличие DMZ.
Например:
EXT_I=eth0
EXT_NET=10.0.0.0/8
EXT_IP=10.0.0.1
DMZ_I=eth1
DMZ_NET=192.168.0.0/24
DMZ_HTTP_IP=192.168.0.10
Атакующий IP=10.0.0.20
Тогда для нормального доступа к DMZ_HTTP_IP должен прийти пакет с:
-s=10.0.0.20 -d=10.0.0.1 -p tcp --dport=80
пакет пройдёт через правило (1) и потом через правило (2).
Но ведь доступ получить можно и так:
На хосте 10.0.0.20 прописываем:
route add -net 192.168.0.0 netmask 255.255.255.0 gw 10.0.0.1 dev eth0(к примеру)
Тогда придёт такой пакет (-d адрес в принципе можно угадать перебором):
-s=10.0.0.20 -d 192.168.0.10 -p tcp --dport=80
Пакет не пройдёт через правило (1) т. к. -d не совпадает с EXT_IP но благополучно пройдёт через правило (2) и тем самым выдаст информацию о наличии DMZ.
Я пробовал проводить такой эксперимент на простенькой одноранговой сети (на интерфейсе EXT_I), всё замечательно получается.
В некоторых источниках вместо правила (2) предлагают использовать совсем простое правило без проверки --dport и state.
Для исправления ситуации как я понимаю можно использовать например такое доп. правило, но только до принятия решения о маршрутизации и до раскрытия NAT пакета:
iptables -t mangle -A PREROUTING -i $EXT_I -s $EXT_NET -d $EXT_IP -p tcp --dport 80 -j MARK --set-mark 1
А правило (2) изменить примерно на такое:
iptables -A FORWARD -m mark --mark 1 -j ACCEPT
Что вы об этом всём думаете?
Может можно как-нибудь более изящно решить эту проблему?
Ответ на:
комментарий
от MiracleMan
Ответ на:
комментарий
от ksicom
Ответ на:
комментарий
от MiracleMan
Ответ на:
комментарий
от sdio
Ответ на:
комментарий
от sdio
Ответ на:
комментарий
от ksicom
Ответ на:
комментарий
от sdio
Ответ на:
комментарий
от ksicom
Ответ на:
комментарий
от spirit
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум iptables nat (2010)
- Форум iptables - DNAT problem (2004)
- Форум iptables + squid = invalid URL (2013)
- Форум ftp && iptables (2007)
- Форум iptables (2017)
- Форум [iptables] 2-е сетки. NAT (2010)
- Форум нуб ставит iptables (2004)
- Форум Необычная проблема с passive ftp и iptables (2008)
- Форум iptables - не пускает (2002)
- Форум Правила iptables. Защита шлюза (2017)