Пересилання контейнерного порту Docker з 8002 до 443 не працює


0

Я не дуже знайомий з iptables та всіма нюансами різних правил. Я зараз в процесі навчання, але мені потрібно це прискорити, тому я тут прошу.

Я запускаю контейнер WebLogic всередині Docker на екземплярі AWS EC2. Контейнер працює з використанням docker run -d -p 8002:8002 weblogic. Я не будував зображення, тому є деякі речі, які повинні залишитися. Мені потрібен сервер WebLogic, щоб він був доступним зовні з порту 443 через мережеві обмеження, навіть якщо він побудований для доступу через порт 8002.

Я спробував різні правила iptables, але жодне з них не успішно пересилає. Контейнер все ще доступний на 8002 навіть при наявності правил пересилання 8002 -> 443.

Запуск RHEL 7.3і Dockerfile побудований для iptables, а не firewalld. Деякі з цих речей я не контролюю, тому мені доводиться працювати з тим, що маю.

Одна з команд iptables, яку я спробував:

iptables -t nat -A OUTPUT -p tcp --dport 8002 -j DNAT --to-destination 127.0.0.1:443

Примітка: я знаю бігати service iptables save. Я можу перевірити існування правил за допомогою iptables -S.

EDIT: Ось мої правила iptables на даний момент

-P INPUT ACCEPT  
-P FORWARD ACCEPT  
-P OUTPUT ACCEPT  
-N DOCKER  
-N DOCKER-ISOLATION  
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  
-A INPUT -p icmp -j ACCEPT  
-A INPUT -i lo -j ACCEPT  
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT  
-A INPUT -j REJECT --reject-with icmp-host-prohibited  
-A FORWARD -j DOCKER-ISOLATION  
-A FORWARD -o docker0 -j DOCKER  
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT  
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT  
-A FORWARD -i docker0 -o docker0 -j ACCEPT  
-A FORWARD -j REJECT --reject-with icmp-host-prohibited  
-A FORWARD -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT  
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8002 -j  ACCEPT  
-A DOCKER-ISOLATION -j RETURN

Відповіді:


3

Не слід змінювати внутрішньо працюючий порт контейнера без відновлення Dockerзображення. EXPOSEкоманда на Dockerfileрівні відповідає за відкриття порту контейнера. Ви можете перевірити відкриті порти контейнерів за допомогою команди

docker inspect <image-name>

Як йдеться в документації, weblogicсервер працює TCP/8002за замовчуванням. Отже, я припускаю, що ви хочете, щоб ваш контейнер був доступний 443, вам потрібно ввести:

docker run -d -p 443:8002 weblogic

Це просто NAT-s TCP/443(на рівні хоста) -> TCP/8002(рівень простору імен контейнерів). Ви також можете це побачити iptables.

iptables -t nat -L

Це буде видно з:

docker ps 

Ви побачите такий текст: 0.0.0.0:443->127.0.0.1:8002

Наступний крок. Вам потрібно додати iptablesправило брандмауера ( конкретно), щоб дозволити рух трафіку TCP/443.

Тому:

iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT

З цим ви налаштуєте брандмауер вашої системи, щоб дозволити трафік TCP/443.

Ще одна річ відсутня. Вам потрібно налаштувати групу безпеки, пов’язану з EC2, щоб дозволити з'єднання TCP/443.

Пам'ятайте, що таке розгортання не можна розглядати як готове до виробництва. Він пропускає багато речей, починаючи з управління безпекою та сертифікатами, закінчуючи автоматичним перезапуском служби.

Список літератури:


Потрібно протестувати у виробничому середовищі, але, здається, працює. Дуже дякую.
Грег

1
@Greg Подивіться, будь ласка, на мою редакцію. Ви не можете ставитися до цього розгортання як зчитування виробництва.

Належним чином відзначено. Я мушу уточнити, що це як наполовину виробництво, наполовину розробка та поверх загартованої ОС. У будь-якому разі я буду працювати з людьми з безпеки мережі, щоб вирішити їхні проблеми. Цінується.
Грег
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.