我四处搜索,我发现的唯一一件事是“是的,OpenVPN 支持通过 TCP 的连接”,但我没有找到任何方法来强制 openvpn 服务器同时侦听两种协议的相同端口. 我发现了一些关于创建 tap 接口的非常旧的指南,或者建议同时运行具有相同配置的另一个服务器实例。前者对于简单的事情来说看起来太复杂了,而后者似乎已经过时了。
And*_*orn 13
同一个 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
Run Code Online (Sandbox Code Playgroud)
这个脚本会记录到 stderr,它应该会出现在 openvpn 日志中。
如果您希望 OpenVPN 服务器侦听 TCP 端口而不是 UDP 端口,请使用
proto tcp代替proto udp(如果您希望 OpenVPN 同时侦听 UDP 和 TCP 端口,则必须运行两个单独的 OpenVPN 实例)。
你的意思是这个页面已经过时了?
我认为您可以运行两台 OpenVPN 服务器(一台用于 TCP,一台用于 UDP)用一个 TUN 桥接它们,然后连接 TUN。
| 归档时间: |
|
| 查看次数: |
25933 次 |
| 最近记录: |