客户端的 OpenVPN 阻止服务器流量

客户端的 OpenVPN 阻止服务器流量

我正在尝试制作一个运行 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。

相关内容