如何使OpenVPN侦听TCP和UDP端口


13

我到处搜索,发现的唯一结果是“是的,OpenVPN支持通过TCP的连接”,但是我还没有找到任何方法来强迫openvpn服务器同时侦听两个协议的相同端口。我发现了一些有关创建Tap接口的旧指南,或建议同时运行具有相同配置的服务器的另一个实例。前者看起来太简单了,而后者看起来已经过时了。

Answers:


11

相同的openvpn进程无法同时侦听UDP和TCP套接字。

您有两个不错的选择:

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

  2. 使用两个tun接口。这些无法桥接,因此,如果要在TCP和UDP客户端之间共享IP空间,则需要使用learn-address类似http://thomas.gouverneur.name/2014/02/openvpn-的脚本在tcp-and-udp-with-tun /上监听(但是,此特定脚本容易受到/ tmp symlink攻击,因此,如果使用它,则删除对/ 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
                exec sudo ip ro add $addr/32 dev $dev
                ;;
        delete)
                echo "sudo ip ro del $addr/32 dev $dev" >&2
                sudo ip ro del $addr/32
                exit 0 # ignore errors
                ;;
        update)
                echo "sudo ip ro change $addr/32 dev $dev" >&2
                exec sudo ip ro change $addr/32 dev $dev
                ;;
esac

该脚本记录到stderr,该脚本应最终出现在openvpn日志中。


4

如果希望OpenVPN服务器在TCP端口而不是UDP端口上进行侦听,请使用proto tcp代替proto udp(如果您希望OpenVPN在UDP和TCP端口上进行侦听,则必须运行两个单独的OpenVPN实例)。

您是说这个页面已经过时了吗?

我认为您可以运行两台OpenVPN服务器(一台用于TCP,一台用于UDP),将每台服务器与一个TUN桥接,然后连接TUN。


1
tun接口没有MAC层,因此不能成为网桥的成员。如果要桥接,则需要使用tap接口。
安德拉斯·科恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.