2

Я использую серверный компьютер Ubuntu 14.04 в качестве основного домашнего маршрутизатора и брандмауэра. Он имеет DNS, DHCP и использует iptables для обеспечения безопасности. Iptables также действует как нац.

На eth0 у меня есть входящее интернет-соединение, а на eth1 у меня есть локальная сеть для обслуживания DNS и DHCP. Все клиенты (подключенные к eth1) должны иметь возможность делать что-либо исходящее как обычно. А на локальной сети у меня есть несколько машин, к которым я хочу подключиться снаружи, используя PREROUTING.

Однако в последнее время я обнаружил, что мой набор правил был определен с помощью ACCEPT на * фильтре INPUT без какого-либо DROP, определенного в конце. Поэтому я сейчас определил DROP при входящем. После обнаружения этого я немного обеспокоился и хочу дважды проверить весь набор правил, если я пропустил что-то большее.

Достаточно ли этого набора iptables для обеспечения безопасности? Как я понял из прочтения, можно сказать, что PREROUTING и FORWARD могут быть установлены в ACCEPT, так как он попадет в INPUT, если ничего не будет совпадать, и я получу DROPped по правилу по умолчанию. Это правильно?

*filter
:INPUT DROP
-A INPUT -i eth1 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 53 --sport 53 -m state --state NEW -j    ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

:FORWARD ACCEPT
-A FORWARD -i eth0 -j ACCEPT

:OUTPUT ACCEPT
COMMIT

*nat
:PREROUTING ACCEPT
-A PREROUTING -i eth0 -p tcp -m tcp -s x.x.x.x --dport 8466 -j DNAT --to-destination 192.168.0.149:8465
-A PREROUTING -i eth0 -p tcp -m tcp -s x.x.x.x --dport 5667 -j DNAT --to-destination 192.168.0.111:5666
-A PREROUTING -i eth0 -p tcp -m tcp -s x.x.x.x --dport 5666 -j DNAT --to-destination 192.168.0.201:5666
-A PREROUTING -i eth0 -p tcp -m tcp -s x.x.x.x --dport 2548 -j DNAT --to-destination 192.168.0.201:548
-A PREROUTING -i eth0 -p tcp -m multiport --dports 32400,32469 -j DNAT --to-destination 192.168.0.201

:INPUT ACCEPT

:OUTPUT ACCEPT

:POSTROUTING ACCEPT
-A POSTROUTING -o eth0 -j MASQUERADE

COMMIT

2 ответа2

0

Я должен противоречить предыдущему ответу. Эта настройка не является безопасной. В основном, делая

:FORWARD ACCEPT -A FORWARD -i eth0 -j ACCEPT

Вы разрешаете перенаправлять весь трафик извне. Таким образом, вам не нужны PREROUTING записи.

Так что если я злоумышленник в той же подсети, что и ваш общедоступный IP-адрес (кто-то использует тот же ISP в том же регионе). Если я подключаю машину напрямую к Интернет-провайдеру и получаю один из его общедоступных IP-адресов, я могу создать маршрут, например

ip route add 192.168.0.0/24 via <your_public_ip>

(Я могу получить ваш общедоступный IP-адрес, просто сканируя Интернет для других людей в моей подсети)

Тогда я могу сделать curl http://192.168.0.201:548 и ваш брандмауэр с радостью перенаправит этот запрос на ваш компьютер в вашей локальной сети. На самом деле я мог бы сканировать вашу сеть, выполнив:

nmap -sn -T4 192.168.0.0/24

И я бы получил список всех IP-адресов, запущенных и работающих в вашей сети.

Тогда для каждого я мог сделать:

nmap -sS -T4 192.168.0.201

И я бы получил список открытых портов. Я проверил это, создав 2 виртуальные машины и смоделировав маршрутизатор и клиентскую машину, на которой я работал на сервере Nginx. Мне удалось получить доступ со стороны "WAN" к серверу Nginx со стороны "LAN", хотя правила PREROUTING, разрешающего это, не было. Я также смог развернуть сторону "локальной сети", и только 1 ВМ работала :-)

Что вам нужно сделать, это:

:FORWARD DROP -A FORWARD -i eth1 -o eth1 -j ACCEPT -A FORWARD -i eth1 -o eth0 -j ACCEPT -A FORWARD -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED,DNAT -j ACCEPT

Вышеуказанные правила будут отбрасывать все переадресации по умолчанию. Обратите внимание, что если вам нужно переадресация между другими интерфейсами, вам нужно будет добавить записи. Тогда другие правила делают:

  1. принять переадресацию со стороны локальной сети на сторону локальной сети (эта опция не обязательна, но у вас может быть некоторая настройка, которая требует этого Например, мой интерфейс локальной сети представляет собой сетевой мост, состоящий из нескольких интерфейсов, как коммутатор, поэтому мне нужно это правило)
  2. принять пересылку из локальной сети в глобальную сеть
  3. принимать пересылку из WAN в LAN только в том случае, если пакеты были приняты в PREROUTING и отправлены в целевое устройство DNAT, или если они получены от установленного соединения или связаны с ним (представьте, что пакеты ICMP связаны с соединением)

Однако другой ответ правильный: вы открываете DNS для Интернета, и это необычно. Кроме того, показ порта 22 и порта 80, возможно, не лучшая идея. Посмотрите в Интернете, есть много способов улучшить ваши настройки здесь, например, ограничение скорости и использование IPS (даже такого простого, как fail2ban) и особенно усиление SSH и переключение на HTTPS.

Отбрасывание пакетов из частного IP-пространства, вероятно, не является необходимым, но отбрасывание недействительных пакетов все еще является хорошей вещью. В любом случае, как только вы используете conntrack, это "помечает" пакеты invlid, так почему бы не использовать эту функцию и избегать маршрутизации пакетов, которые впоследствии будут отбрасываться вашим приложением. Просто убей их.

Последнее замечание: если вы не знаете, как протестировать свой собственный брандмауэр, вам следует подумать об использовании дистрибутива брандмауэра (например, ipfire, OPNsense и т.д.) Или хотя бы программного обеспечения на вашем компьютере с Linux, которое может сделать это из-за коробка (например, shorewall). У вас есть преимущества, заключающиеся в том, что вам будет проще получить безопасную настройку, однако, конечно, у нее есть недостаток, заключающийся в том, что вы не изучите iptables. Если вы хотите узнать iptables, сначала используйте реальную настройку брандмауэра для маршрутизатора на вашем "производственном маршрутизаторе". Поиграйте с iptables на машине или в настройке виртуальной машины, задайте здесь другие вопросы, например, о том, как протестировать и проверить брандмауэр. Как только вы это доказали, поместите его в "Prod". :-) Вот как я поступил, поэтому я лишь констатирую это как конструктивный совет.

0

Да, это правильно.

Одна странная вещь: у вас есть DNS-сервер, открытый для внешнего ??? Это открывает вашу локальную сеть для DNS DDoS-атак. Разве вы не хотите оставить свой DNS-сервер открытым внутри ? (-i eth1). Если вы оставите это открытым для внешнего мира, есть способы смягчить воздействие DNS DDos-атак, знаете ли вы о них?

Просто чтобы убедиться, что вы имеете в виду то, что говорите:

  1. Вы используете ssh-сервер и http-сервер (только на 80-м порту? Почему не порт 443?) на твоих воротах.

  2. Вы хотите, чтобы один IP-адрес имел доступ к портам 8466, 5667, 5666 и 2548.

  3. Вместо этого вы разрешаете каждому IP подключаться к портам 32400 и 32469.

(на случай, если вам интересно: здесь нет геймера).

Почему вы сбросили пакеты icmp ? Они выполняют полезные функции.

Вопреки общественному мнению, вам не нужно добавлять правила для отбрасывания искаженных пакетов и отбрасывания пакетов для частных, не маршрутизируемых IP-адресов. Другими словами, это достаточный набор правил: вы можете прочитать здесь, что говорят профессионалы о наборах правил iptables, особенно первый ответ.

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