OpenVPNがTCPポートとUDPポートを同時に受信できるようにする方法

OpenVPNがTCPポートとUDPポートを同時に受信できるようにする方法

あちこち探してみたら唯一発見したのは「はい、OpenVPN は TCP 経由の接続をサポートしています。」しかし、openvpnサーバーが両方のプロトコルに対して同じポートでリッスンするように強制する方法が見つかりませんでした。とても古いガイドを見つけました。タブインタフェースの作成または、同じ構成で別のサーバーインスタンスを同時に実行することをお勧めします。前者は単純なことをするには複雑すぎるように見えますが、後者は時代に遅れているようです。

ベストアンサー1

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

2つの良いオプションがあります。

  1. openvpn には 2 つの Tap インターフェイスを使用します。 2つのopenvpnサーバープロセスがあり、各タップインターフェースごとに1つずつ、1つはUDPを受信し、もう1つはTCPを受信する必要があります。サーバーはこれら2つのTapインターフェースを接続します。

  2. 2 つの tun インターフェイスを使用します。これはブリッジできないため、TCPとUDPクライアント間でIPスペースを共有するには、learn-address次のスクリプトを使用する必要があります。http://thomas.gouverneur.name/2014/02/openvpn-listen-on-tcp-and-udp-with-tun/(ただし、この特定のスクリプトは/ tmpシンボリックリンク攻撃に対して脆弱であるため、これを使用する場合は/ tmpのログを削除してください。)

3番目のオプションは、2つのopenvpnインスタンスのみを実行し、2つのインスタンスに別々のクライアントIPスペースを割り当てることです(たとえば、同じ/ 24サブネット内の1つの/ 25)これにより、ブリッジングとアドレススクリプトを学ぶ必要がなくなります。

編集:そのような学習アドレススクリプトが直接必要だったので、1つを書きました。公開ドメインに投稿しました。

#!/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

スクリプトはstderrに書き込まれ、最終的にopenvpnログに表示されます。

おすすめ記事