У меня есть виртуальная машина (Ubuntu 12.04.4 LTS) с mongodb (2.0.4), которую я хочу ограничить с помощью iptables только принятием SSH (вход / выход) и ничего больше. Вот как выглядит мой сценарий установки для настройки правил:
#!/bin/sh
# DROP everything
iptables -F
iptables -X
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
# input
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -j ACCEPT # accept all ports for local conns
# output
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT # ssh
Но с активированными этими правилами я не могу подключиться к mongodb локально.
ubuntu ~ $ mongo
MongoDB shell version: 2.0.4
connecting to: test
Fri Mar 28 09:40:40 Error: couldn't connect to server 127.0.0.1 shell/mongo.js:84
exception: connect failed
Без них нормально работает. Есть ли какой-то особый случай брандмауэра, который нужно учитывать при развертывании mongodb?
Я попытался установить mysql, и он отлично работает для локальных подключений. SSH работает как ожидалось (может подключаться снаружи и внутри).
После установки правила iptables выглядят так:
ubuntu ~ $ sudo iptables -nvL
Chain INPUT (policy DROP 8 packets, 1015 bytes)
pkts bytes target prot opt in out source destination
449 108K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT all -- * * 127.0.0.1 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
32 2048 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 27 packets, 6712 bytes)
pkts bytes target prot opt in out source destination
379 175K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Я заметил, что если я добавлю правило ВЫВОДА для порта 27017 mongodb (tcp, разрешены все направления), оно работает. Полагаю, это как-то связано с выводом? Но почему mongodb не разрешает принимать локальное соединение из-за исходящего трафика от хоста ?!
Соединение состоит из исходного IP: порта и целевого IP: порта. Пакеты от исходного IP-адреса: порт должен пройти цепочку OUTPUT. Это происходит, даже когда вы подключаетесь к интерфейсу обратной связи, так как вы обнаружили, что вам необходимо разрешить исходящие подключения к 127.0.0.1.
Не блокировать интерфейс обратной петли - это нормально, поскольку многие службы используют его, и это может вызвать проблемы.