我在 Docker 容器中运行一个实验性的 VPN 服务器。
我的docker-compose.yml
文件:
version: '3'
services:
dockovpn:
image: alekslitvinenk/openvpn
cap_add:
- NET_ADMIN
ports:
- 1194:1194/udp # Expose tcp if you defined HOST_TUN_PROTOCOL=tcp
environment:
HOST_ADDR: ${HOST_ADDR}
volumes:
- /var/lib/dockovpn:/opt/Dockovpn_data
restart: always
HOST_ADDR
我的 IP 地址在哪里?
我使用
sudo docker-compose up -d
命令,我可以从 Windows、Android 和 iOS 设备连接到 VPN。
没有client-to-client
选项server.conf
:
sudo docker exec -it dockovpn_dockovpn_1 bash
cd /opt/Dockovpn
cat config/server.conf
port 1194
proto %HOST_TUN_PROTOCOL%
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/MyReq.crt
key /etc/openvpn/MyReq.key
dh /etc/openvpn/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
duplicate-cn
keepalive 10 120
cipher AES-256-GCM
ncp-ciphers AES-256-GCM:AES-256-CBC
auth SHA512
persist-key
persist-tun
status openvpn-status.log
verb 4
tls-server
tls-version-min 1.2
tls-auth /etc/openvpn/ta.key 0
crl-verify /etc/openvpn/crl.pem
因此,根据OpenVPN 文档,客户端不应该互相看到对方,但实际上他们可以看到对方。例如,我可以通过远程桌面连接到 IP 地址为 10.8.0.14 等的远程 Windows 计算机...
如何解决这个问题?
编辑1
在scripts\start.sh中找到以下内容:
# Allow traffic on the TUN interface.
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
也许我最好删除iptables -A FORWARD -i tun0 -j ACCEPT
而不是添加iptables -A FORWARD -i tun0 -o tun0 -j REJECT
?
原因只有一个,不是 OpenVPN,而是你的操作系统路由数据包。如果没有
client-to-client
,OpenVPN 可以说以“简化路由”模式运行;它将来自 VPN 的所有内容转发到操作系统,并将来自操作系统的所有内容转发到 VPN。在您的例子中,当数据包来自一个客户端时,它会被交给操作系统,然后从接口中显示出来
tun
。操作系统会考虑其路由表,发现目的地位于tun
数据包来源的同一接口后面,并将数据包转发到那里,从而将数据包返回给 OpenVPN。从 OpenVPN 的角度来看,这不是客户端到客户端的通信,而是客户端到操作系统和操作系统到客户端的通信。但是操作系统转发受其路由表、规则和防火墙的约束。您可以在容器内配置防火墙来防止这种情况。在 iptables 术语中,它将类似于
iptables -A FORWARD -i tun0 -o tun0 -j REJECT
(调整 tun 接口名称,或使用tun+
,这是一种通配符)。附注:停止使用
duplicate-cn
选项。您可以完美地运行 VPN CA(使用 easy-rsa,很简单)并为每个客户端生成专用证书/密钥对;这样做。将它与ifconfig-pool-persist
和放在一起也是(几乎)毫无意义的crl-verify
。