IPTABLES: блокировка порта только для внешних пользователей

449
Ed de Almeida

У меня есть сервер с двумя работающими док-контейнерами. Одним из них является интерфейс небольшого приложения, которое подается вместе с http-server. Это приложение использовало API выборки Javascript для извлечения данных из очень простой базы данных, основанной на модуле json-server Node.js, который работает в другом контейнере.

Бывает, что json-serverпорт 3000 становится доступным для внешнего пользователя, т. Е. Если кто-то указывает на браузер http://example.com:3000, мои данные будут доступны без фильтрации и представления, предоставляемых внешним интерфейсом. Это не то, что я хочу.

Я хотел бы заблокировать порт 3000 во внешнем мире, в то же время позволяя другому контейнеру докера получать данные, как обычно. Я думаю, что это может быть сделано на основе ИС, но я не знаю, как это сделать.

Это моя текущая конфигурация Iptables, в основном созданная самим Docker в качестве стандарта.

Chain INPUT (policy ACCEPT) target prot opt source destination   Chain FORWARD (policy DROP) target prot opt source destination  DOCKER-USER all -- anywhere anywhere  DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere  ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED DOCKER all -- anywhere anywhere  ACCEPT all -- anywhere anywhere  ACCEPT all -- anywhere anywhere   Chain OUTPUT (policy ACCEPT) target prot opt source destination   Chain DOCKER (1 references) target prot opt source destination  ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:http-alt ACCEPT tcp -- anywhere 172.17.0.3 tcp dpt:3000  Chain DOCKER-ISOLATION-STAGE-1 (1 references) target prot opt source destination  DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere  RETURN all -- anywhere anywhere   Chain DOCKER-ISOLATION-STAGE-2 (1 references) target prot opt source destination  DROP all -- anywhere anywhere  RETURN all -- anywhere anywhere   Chain DOCKER-USER (1 references) target prot opt source destination  RETURN all -- anywhere anywhere  

В приведенной выше конфигурации IP 172.17.0.2 - это мое приложение, а 172.17.0.3 - это IP-адрес контейнера моей базы данных.

Контейнер внешнего интерфейса запускается с

docker run -p 80:8080 --name=frontend -d mtr/frontend 

а второй с

docker run -p 3000:3000 --name=database -d mtr/database 

Я также рассмотрел возможность использования Docker для ограничения доступа, но после многих исследований я ничего не смог найти.

Любые предложения о том, как я могу это сделать?

0

1 ответ на вопрос

1
bcs78

Так как вы «ПРИНИМАЕТЕ» «tcp» соединения из «где угодно» с хостом «172.17.0.3» на «tcp» порту «dpt: 3000», и я предполагаю, что есть также правило DNAT, которое перенаправляет все входящие соединения в «you-public» -ip-адрес: от 3000 "до" 172.17.0.3:3000 "(см. iptables -t nat -L --line-numbers), который считается нормальным.

Удалите правило DNAT из таблицы NAT.

iptables -t nat -D PREROUTING <the-dnat-rule-number>