OpenVPNがTCPポートとUDPポートの両方をリッスンするようにする方法


13

私は周りを検索しましたが、見つかったのは「はい、OpenVPNはTCP経由の接続をサポートしているということだけですが、openvpnサーバーに両方のプロトコルの同じポートを同時にリッスンするよう強制する方法は見つかりませんでした。 。タップインターフェイスの作成、または同じ構成で同時に実行されるサーバーの別のインスタンスを推奨することについて、非常に古いガイドをいくつか見つけました。前者は単純なものには複雑すぎるように見え、後者は時代遅れのようです。

回答:


11

同じopenvpnプロセスは、UDPソケットとTCPソケットを同時にリッスンできません。

2つの適切なオプションがあります。

  1. openvpnには2つのタップインターフェイスを使用します。2つのopenvpnサーバープロセスがあり、各タップインターフェイスに1つです。1つはUDPでリッスンし、もう1つはTCPでリッスンする必要があります。サーバー上のこれらの2つのタップインターフェイスをブリッジします。

  2. 2つのtunインターフェースを使用します。これらはブリッジできないため、TCPクライアントとUDPクライアント間でIPスペースを共有する場合はlearn-addresshttp://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ログに記録されます。


4

OpenVPNサーバーでUDPポートではproto tcpなくTCPポートをリッスンする場合は、代わりに使用しproto udpます(OpenVPNでUDPポートとTCPポートの両方をリッスンする場合は、2つの別々のOpenVPNインスタンスを実行する必要があります)。

このページは古いということですか?

2つのOpenVPNサーバー(TCP用とUDP用)を実行して、それぞれをTUNでブリッジし、TUNを接続できると思います。


1
tunインターフェイスにはMAC層がないため、ブリッジのメンバーにすることはできません。ブリッジが必要な場合は、tapインターフェースを使用する必要があります。
アンドラーシュKornシェル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.