如何让 OpenVPN 同时监听 TCP 和 UDP 端口

如何让 OpenVPN 同时监听 TCP 和 UDP 端口

我四处搜寻,唯一发现的是“是的,OpenVPN 支持通过 TCP 的连接”,但我还没有找到任何方法来强制 openvpn 服务器同时侦听两种协议的同一端口。我找到了一些非常古老的指南创建分接接口,或建议同时运行具有相同配置的另一个服务器实例。对于简单的事情来说,前者看起来太复杂,而后者似乎已经过时了。

答案1

同一个 openvpn 进程不能同时监听 UDP 和 TCP 套接字。

您有两个不错的选择:

  1. 为 openvpn 使用两个 Tap 接口。有两个openvpn服务器进程,每个tap接口一个;一个应该侦听 UDP,另一个应该侦听 TCP。在服务器上桥接这两个 Tap 接口。

  2. 使用两个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。

相关内容