私は周りを検索しましたが、見つかったのは「はい、OpenVPNはTCP経由の接続をサポートしている」ということだけですが、openvpnサーバーに両方のプロトコルの同じポートを同時にリッスンするよう強制する方法は見つかりませんでした。 。タップインターフェイスの作成、または同じ構成で同時に実行されるサーバーの別のインスタンスを推奨することについて、非常に古いガイドをいくつか見つけました。前者は単純なものには複雑すぎるように見え、後者は時代遅れのようです。
私は周りを検索しましたが、見つかったのは「はい、OpenVPNはTCP経由の接続をサポートしている」ということだけですが、openvpnサーバーに両方のプロトコルの同じポートを同時にリッスンするよう強制する方法は見つかりませんでした。 。タップインターフェイスの作成、または同じ構成で同時に実行されるサーバーの別のインスタンスを推奨することについて、非常に古いガイドをいくつか見つけました。前者は単純なものには複雑すぎるように見え、後者は時代遅れのようです。
回答:
同じopenvpnプロセスは、UDPソケットとTCPソケットを同時にリッスンできません。
2つの適切なオプションがあります。
openvpnには2つのタップインターフェイスを使用します。2つのopenvpnサーバープロセスがあり、各タップインターフェイスに1つです。1つはUDPでリッスンし、もう1つはTCPでリッスンする必要があります。サーバー上のこれらの2つのタップインターフェイスをブリッジします。
2つのtunインターフェースを使用します。これらはブリッジできないため、TCPクライアントとUDPクライアント間でIPスペースを共有する場合はlearn-address
、http://thomas.gouverneur.name/2014/02/openvpn-にあるようなスクリプトを使用する必要があります。listen-on-tcp-and-udp-with-tun /(ただし、この特定のスクリプトは/ tmp symlink攻撃に対して脆弱であるため、/ tmpへのロギングを使用する場合は削除してください)。
3つ目のオプションは、2つのopenvpnインスタンスを実行し、別々のクライアントIPスペースを両方に割り当てることです(たとえば、同じ/ 24サブネットからそれぞれ1つ/ 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サーバーでUDPポートでは
proto tcp
なくTCPポートをリッスンする場合は、代わりに使用しproto udp
ます(OpenVPNでUDPポートとTCPポートの両方をリッスンする場合は、2つの別々のOpenVPNインスタンスを実行する必要があります)。
このページは古いということですか?
2つのOpenVPNサーバー(TCP用とUDP用)を実行して、それぞれをTUNでブリッジし、TUNを接続できると思います。
tun
インターフェイスにはMAC層がないため、ブリッジのメンバーにすることはできません。ブリッジが必要な場合は、tap
インターフェースを使用する必要があります。