Как я могу заблокировать порт 6379 для внешнего трафика в Ubuntu?


8

Я хочу заблокировать доступ к порту 6379 на моем сервере, но я все еще хочу подключиться к нему внутренне. Приложение Redis-сервера работает на этом порту, и я хочу подключиться к нему только локально (127.0.0.1). Как я могу это сделать?

Ответы:


11

Для этого вам необходимо убедиться, что ваши правила IPTables настроены правильно. Ubuntu обычно оставляет свои серверы широко открытыми по умолчанию, поэтому я до сих пор не рекомендую использовать их в качестве серверов, если вы уже недостаточно хорошо знаете, как это сделать правильно.

Я представляю, что ты iptables -L -nvвыглядишь примерно так, да?

# iptables -L -nv
Chain INPUT (policy ACCEPT 4M packets, 9M bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 8M packets, 4M bytes)
 pkts bytes target     prot opt in     out     source               destination

Он пуст и широко открыт. Ubuntu IPTables HowTo, вероятно, очень поможет в этом. ( https://help.ubuntu.com/community/IptablesHowTo )

Я рекомендую что-то вроде этого, чтобы разрешить SSH на любом интерфейсе и tcp 6379 любой интерфейс, кроме того, который вам не нужен:

*filter
:INPUT DROP [92:16679]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [203:36556]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 6379 -j ACCEPT
-A INPUT -i lo -p udp -m udp --dport 6379 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
COMMIT

Затем вы должны сохранить этот файл в /etc/iptables.rules.

Очевидно, что любые другие порты, которые вы специально хотите открыть, должны быть добавлены.

Примечание: я добавил конкретные 6379 строк для ясности. Нижний ACCEPT прямо перед COMMIT фактически позволил бы это, потому что все петлевые соединения должны быть разрешены в системе Linux для правильной работы.

Вы также захотите поместить правила в файл / etc / network / interfaces, чтобы они были добавлены при запуске интерфейса, а не позднее в процессе загрузки. Рекомендуется добавить что-то вроде этого:

auto eth0
iface eth0 inet dhcp
  pre-up iptables-restore < /etc/iptables.rules

Редактировать: чтобы загрузить эту конфигурацию изначально, вам нужно выполнить команду iptables-restore, на которую есть ссылка выше:

iptables-restore < /etc/iptables.rules

Я предполагаю, что это откроет порт 6379 для всей сети, верно? Что я должен сделать, чтобы открыть это только для 127.0.0.1?
Стив Родриг,

Нет, потому что по умолчанию используется правило DROP. Если у него нет явного правила ПРИНЯТЬ, он блокируется DROP по умолчанию рядом с: INPUT вверху.
Магеллан

Лично я считаю, что правило ACCEPT по умолчанию является просто преступным при "серверном" развертывании. Но это не удивительно, поскольку Ubuntu - это прежде всего дистрибутив для настольных компьютеров.
Магеллан

Хорошо, я просто сделал именно то, что вы просили, но похоже, что я все еще могу подключиться к порту 6379 снаружи. Должен ли я перезагрузить сервер или что-то?
Стив Родриг

1
Да, но я не особо беспокоюсь о счетчиках, и это работает для меня. Не стесняйтесь редактировать ответ, чтобы соответствовать более строгому процессу.
Магеллан

3

Ну, я бы предложил использовать «несложный брандмауэр» (ufw), который также рекомендуется каноническим. Чтение и запись iptables слишком сложны для случайных задач блокировки портов.

Смотрите здесь: https://wiki.ubuntu.com/UncomplicatedFirewall


1
В старых версиях UFW не было возможности применять правила к выбранным портам, это было все или ничего. А профессиональные системные администраторы должны привыкнуть понимать, что делают их настройки iptables и как работают цепочки.
Магеллан

2

Что-то вроде

iptables -A INPUT -s 0.0.0.0  -i eth0 --protocol tcp --dport 6379 -j DROP

Должно сработать.


Это дает мне эту ошибку: iptables v1.4.4: неизвестная опция `--dport '
Стив Родриг

Можете ли вы повторить с новой командой? Я добавил части --protocol и -i (адаптироваться к вашему интерфейсу), теперь они должны работать.
Кедаре

Проблема, с которой я столкнулся, заключается в том, что он не сохраняет данные при перезагрузке, если не выполняются другие необходимые команды, и предполагается, что существует только 1 интерфейс без обратной связи.
Магеллан

Я бы рекомендовал использовать оператор отрицания: -i! вот
Магеллан

Адриан: ты имеешь в виду, что если я перезагружу сервер, эта модификация больше не будет активной?
Стив Родриг

0

Для более новых версий Redis вы можете использовать bind 127.0.0.1в redis.confсделать это непосредственно без дополнительной настройки Iptables

увидеть эту статью

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.