我正在尝试制作一个运行 OpenVPN 服务器的反向代理,以便将客户端上的某些端口公开到互联网。在此阶段,我只想让反向代理访问托管在 docker 中的 Web 服务器,以防反向代理受到攻击。
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
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
docker-compose
version: '2'
services:
myapp:
restart: always
image: app:latest
ports:
- "80:80"
服务器可以毫无问题地访问此 Web 服务器
~$ 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
但是服务器以某种方式绕过了这些防火墙规则并可以访问 Web 服务器!
我认为它可能是 docker,因为我可以看到它在 iptables 中添加了许多规则。
最后,如果这是愚蠢/错误的事情,那也是公平的,但请让我知道为什么以及我应该怎么做
编辑:
我发现使用我的docker配置会产生不同的结果
这将使 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"
因此,很明显,docker 绑定到 0.0.0.0 正在做一些事情。但我仍然不知道如何在不修改每个 docker 配置的情况下修复此问题。
答案1
我得出的解决方案是,在 docker 中,当您绑定到端口 80 时,它会绑定到 0.0.0.0,其中包括 tun0。当您创建容器时,Docker 会动态修改 iptable 规则,这些规则优先于您的 ufw 规则。
为了解决这个问题,请将端口绑定到只能看到您的网络服务器的网络。
在我的情况下,我绑定到 127.0.0.1:80(环回),然后我的服务器在 tun0 上无法访问。如果您需要它在特定网络上可访问,您可以添加它,例如 192.168.1.10:80(本地网络)
我读到过,你可以在 /etc/docker/daemon.json 文件中修改默认 ip,但我尝试过,但没有成功。如果成功,你可以阻止 0.0.0.0 成为默认 ip。