У меня есть сервер с двумя работающими док-контейнерами. Одним из них является интерфейс небольшого приложения, обслуживаемого 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 для ограничения доступа, но после долгих исследований я ничего не смог найти.

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

1 ответ1

1

Так как вы "ПРИНИМАЕТЕ" "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>

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