LINUX.ORG.RU
ФорумAdmin

Iptables. Проброс порта из локальной сети OpebVPN наружу в Docker.

 


1

1

Здравствуйте уважаемые товарищи.

Поднял OpenVPN Server в контейнере Docker на заморском VPS. Хочу свою домашнюю машину сделать временно web сервером. Для этого нужно прогнать трафик по 80 порту от OVPN клиента к серверу и выплюнуть из контейнера наружу. В Docker контейнере открыты 80 и 1194. По IP:1194 подключаюсь OVPN клиентом. IP:80 разумеется открыт для подключений браузера.

В Docker контейнере установлен iptable и заданы следующие правила:

133.33.33.33 - Внешний IP. 10.0.0.1 - IP OPVN сервера. 10.0.0.3 - IP OVPN клиента с web сервером на борту.

#iptables -t nat -A POSTROUTING -p tcp -m tcp -s 10.0.0.3 --sport 80 -j SNAT --to-source 133.33.33.33:80

#iptables -t nat -A PREROUTING -p tcp -m tcp -d 133.33.33.33 --dport 80 -j DNAT --to-destination 10.0.0.3:80

Запуливаюсь в контейнер

#docker exec -it bd512fed30f9 /bin/bash

Смотрим что творится в IP

#ip r
default via 172.24.0.1 dev eth0 
10.0.0.0/24 via 10.0.0.2 dev tun0 
10.0.0.2 dev tun0 proto kernel scope link src 10.0.0.1 
172.24.0.0/16 dev eth0 proto kernel scope link src 172.24.0.2

Смотрим что творится в IPTABLES

#iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             133.33.33.33        tcp dpt:80 to:10.0.0.3:80

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER_OUTPUT  all  --  anywhere             127.0.0.11          

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER_POSTROUTING  all  --  anywhere             127.0.0.11          
SNAT       tcp  --  10.0.0.3          anywhere             tcp spt:80 to:133.33.33.33:80

Chain DOCKER_OUTPUT (1 references)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             127.0.0.11           tcp dpt:53 to:127.0.0.11:43111
DNAT       udp  --  anywhere             127.0.0.11           udp dpt:53 to:127.0.0.11:40486

Chain DOCKER_POSTROUTING (1 references)
target     prot opt source               destination         
SNAT       tcp  --  127.0.0.11           anywhere             tcp spt:43111 to::53
SNAT       udp  --  127.0.0.11           anywhere             udp spt:40486 to::53

Проблема заключается в том что не получается настроить переадресацию именно в Docker. Прошу помощи Гуру.

Зачем это правило?

#iptables -t nat -A POSTROUTING -p tcp -m tcp -s 10.0.0.3 --sport 80 -j SNAT --to-source 133.33.33.33:80

Почему правила показываете без счётчиков, чтобы ванговали, доходят ли до них пакеты?

Тунель вобще работает, tcpdump что-то показывает при заходе браузером?

не получается настроить переадресацию именно в Docker

ну настраивайте без Docker.

mky ★★★★★ ()
Ответ на: комментарий от mky

Разумеется тунель работает в Docker контейнере. C другого OVPN клиента спокойно подключаюсь к 10.0.0.3:80 браузером или curl.

Не рассматриваю перенапавление трафика из вне в интранет по порту без Docker. Таковы условия задачи.

#cat docker-compose.yml

version: '2'

services:
  server:
    build: .
    command: run
    privileged: true
    ports:
     - 80:80
     - 1194:1194
    volumes:
     - ./openvpn:/etc/openvpn
#netstat -lptn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      631/sshd            
tcp6       0      0 :::443                  :::*                    LISTEN      1674/docker-proxy
tcp6       0      0 :::587                  :::*                    LISTEN      1674/docker-proxy   
tcp6       0      0 :::143                  :::*                    LISTEN      1686/docker-proxy   
tcp6       0      0 :::80                   :::*                    LISTEN      1610/docker-proxy   
tcp6       0      0 :::22                   :::*                    LISTEN      631/sshd            
tcp6       0      0 :::25                   :::*                    LISTEN      1696/docker-proxy   
tcp6       0      0 :::993                  :::*                    LISTEN      1664/docker-proxy   
tcp6       0      0 :::1194                 :::*                    LISTEN      3612/docker-proxy  
monster33 ()

Ну вроде логично. 133.33.33.33 к докеру не имеет отношения у вас там адрес 172.24.0.2. Пропишите на хосте роутинг до 10.0.0.0/24, dnat и возможно ещё snat зависит от того что там сейчас прописано.

anc ★★★★★ ()
Ответ на: комментарий от anc

Тема закрыта.

Оказалось всё значительно проще когда разобрался с NAT в Docker. Всем спасибо за внимание, хоть и не получил тут помощи…

monster33 ()
Ответ на: комментарий от monster33

Double NAT, ну что же, тоже вариант, я вам предложил менее костыльный. А то что вы как я понял применили, даже не стал предлагать.

anc ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.