Я пытаюсь сделать обратный прокси-сервер, на котором запущен 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 по умолчанию.