我到处搜索,发现的唯一结果是“是的,OpenVPN支持通过TCP的连接”,但是我还没有找到任何方法来强迫openvpn服务器同时侦听两个协议的相同端口。我发现了一些有关创建Tap接口的旧指南,或建议同时运行具有相同配置的服务器的另一个实例。前者看起来太简单了,而后者看起来已经过时了。
我到处搜索,发现的唯一结果是“是的,OpenVPN支持通过TCP的连接”,但是我还没有找到任何方法来强迫openvpn服务器同时侦听两个协议的相同端口。我发现了一些有关创建Tap接口的旧指南,或建议同时运行具有相同配置的服务器的另一个实例。前者看起来太简单了,而后者看起来已经过时了。
Answers:
相同的openvpn进程无法同时侦听UDP和TCP套接字。
您有两个不错的选择:
为openvpn使用两个Tap接口。有两个openvpn服务器进程,每个Tap接口一个。一个应该监听UDP,另一个监听TCP。在服务器上桥接这两个抽头接口。
使用两个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日志中。
如果希望OpenVPN服务器在TCP端口而不是UDP端口上进行侦听,请使用
proto tcp
代替proto udp
(如果您希望OpenVPN在UDP和TCP端口上进行侦听,则必须运行两个单独的OpenVPN实例)。
您是说这个页面已经过时了吗?
我认为您可以运行两台OpenVPN服务器(一台用于TCP,一台用于UDP),将每台服务器与一个TUN桥接,然后连接TUN。
tun
接口没有MAC层,因此不能成为网桥的成员。如果要桥接,则需要使用tap
接口。