我四处搜寻,唯一发现的是“是的,OpenVPN 支持通过 TCP 的连接”,但我还没有找到任何方法来强制 openvpn 服务器同时侦听两种协议的同一端口。我找到了一些非常古老的指南创建分接接口,或建议同时运行具有相同配置的另一个服务器实例。对于简单的事情来说,前者看起来太复杂,而后者似乎已经过时了。
答案1
同一个 openvpn 进程不能同时监听 UDP 和 TCP 套接字。
您有两个不错的选择:
为 openvpn 使用两个 Tap 接口。有两个openvpn服务器进程,每个tap接口一个;一个应该侦听 UDP,另一个应该侦听 TCP。在服务器上桥接这两个 Tap 接口。
使用两个tun接口。这些无法桥接,因此如果您想在 TCP 和 UDP 客户端之间共享 IP 空间,则需要使用
learn-address
类似以下脚本的脚本http://thomas.gouverneur.name/2014/02/openvpn-listen-on-tcp-and-udp-with-tun/(但是,此特定脚本容易受到 /tmp 符号链接攻击,因此如果使用它,请删除对 /tmp 的日志记录)。
第三个选项是仅运行两个 openvpn 实例,并为两个实例分配单独的客户端 IP 空间(例如,每个实例来自相同 /24 子网的一个 /25)。这避免了桥接以及对学习地址脚本的需要。
编辑:因为我自己需要这样一个学习地址脚本,所以我写了一个。我将其置于公共领域。
#!/bin/sh
#
# This script allows an openvpn server with several openvpn instances that
# use tun interfaces to share client IP space by adjusting the routing table
# to create entries towards specific clients as needed
action="$1"
addr="$2"
cn="$3" # not used, but it's there; you could e.g. log it
case "$action" in
add)
echo "sudo ip ro add $addr/32 dev $dev" >&2
sudo ip ro change $addr/32 dev $dev || sudo ip ro add $addr/32 dev $dev # if a route already existed, add will fail but change should work, and vice versa
;;
delete)
# even if a client connects to one OpenVPN instance first, then reconnects to the other before the first connection times out, the "add" case above sets up the correct route; it may thus not be necessary to delete routes, ever
# echo "sudo ip ro del $addr/32 dev $dev" >&2
# sudo ip ro del $addr/32 dev $dev
# exit 0 # ignore errors
;;
update)
echo "sudo ip ro change $addr/32 dev $dev" >&2
sudo ip ro change $addr/32 dev $dev \
|| exec sudo ip ro add $addr/32 dev $dev # 'change' can fail with ENOENT, in which case we must 'add'
;;
esac
该脚本记录到 stderr,最终应该出现在 openvpn 日志中。
答案2
如果您希望 OpenVPN 服务器侦听 TCP 端口而不是 UDP 端口,请使用
proto tcp
而不是proto udp
(如果您希望 OpenVPN 同时侦听 UDP 和 TCP 端口,则必须运行两个单独的 OpenVPN 实例)。
您的意思是该页面已过时吗?
我认为你可以运行两个 OpenVPN 服务器(一个用于 TCP,一个用于 UDP),用一个 TUN 桥接它们,然后连接 TUN。