Назад | Перейти на главную страницу

OpenVPN блокирует трафик сервера на стороне клиента

Я пытаюсь сделать обратный прокси-сервер, на котором запущен OpenVPN Server, чтобы открыть некоторые порты клиента в Интернете. Я хочу только предоставить обратному прокси-серверу доступ к веб-серверу, размещенному в докере, на этом этапе только на тот случай, если обратный прокси-сервер будет скомпрометирован.

server.conf (обратный прокси)

port 1194
proto udp
dev tun
user nobody
group nogroup
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 1.0.0.1"
push "route add 10.8.0.0/24 10.8.0.1"
crl-verify crl.pem
ca ca.crt
cert a.crt
key a.key
tls-auth tls-auth.key 0
dh dh.pem
auth SHA256
cipher AES-128-CBC
tls-server
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
status openvpn.log
verb 3

client.conf

client
proto udp
remote xxx.xx.xxx.xxx 1194
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name a name
auth SHA256
auth-nocache
cipher AES-128-CBC
tls-client
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
verb 3

докер-сочинять

version: '2'

services:
  myapp:
    restart: always
    image: app:latest
    ports:
    - "80:80"

Сервер может получить доступ к этому веб-серверу без проблем

~$ wget 10.8.0.2
--2018-05-07 13:20:55--  http://10.8.0.2/
Connecting to 10.8.0.2:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: 'index.html' 
2018-05-07 13:20:57 (87.0 KB/s) - 'index.html' saved [134302]

Тогда я попытался заблокировать его, используя ufw

~$ sudo ufw deny in on tun0 to any port 80
~$ sudo ufw deny out on tun0 to any port 80
~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
Anywhere                   ALLOW IN    192.168.1.0/24            
80 on tun0                 DENY IN     Anywhere
80                         DENY OUT    Anywhere on tun0  

Но сервер каким-то образом обходит эти правила брандмауэра и может получить доступ к веб-серверу!

Я думаю, что это может быть докер, потому что я вижу, что он добавил много правил в iptables.

Наконец, если это глупо / неправильно, это тоже справедливо, но, пожалуйста, дайте мне знать, почему и что я должен делать вместо этого

РЕДАКТИРОВАТЬ:

Я обнаружил, что игра с моей конфигурацией докера дает разные результаты

это останавливает работу wget

version: '2'

services:
  myapp:
    restart: always
    image: app:latest
    ports:
    - "127.0.0.1:80:80"

это снова позволяет, и он все еще проходит через мой брандмауэр выше

version: '2'

services:
  myapp:
    restart: always
    image: app:latest
    ports:
    - "127.0.0.1:80:80"
    - "10.8.0.2:80:80"

так что его очевидная привязка докера к 0.0.0.0 что-то делает. Но я до сих пор не знаю, как это исправить, не изменяя все мои конфигурации докеров.

Я пришел к выводу, что в докере, когда вы привязываетесь к порту 80, он привязывается к 0.0.0.0, который включает tun0. Docker динамически изменяет правила iptable при создании контейнера, и эти правила имеют приоритет над вашими правилами ufw.

Чтобы обойти эту проблему, привяжите порты к сетям, которые должны видеть только ваш веб-сервер.

В моем случае я привязался к 127.0.0.1:80 (loopback), и тогда мой сервер был недоступен на tun0. Если вам нужно, чтобы он был доступен в определенной сети, вы можете просто добавить его, например 192.168.1.10:80 (локальная сеть)

Я читал, что вы можете изменить ip по умолчанию в файле /etc/docker/daemon.json, но я попытался это сделать, и это не сработало. Если бы это сработало, вы могли бы запретить 0.0.0.0 потенциально быть ip по умолчанию.