web-dev-qa-db-ja.com

DNSを異なるポートにリダイレクトする方法

ドメイン「Arboristal.com」を所有しています。また、私はすべてのサブドメインをarboristal.comで個人的に所有しています。 lg.arboristalやft.arboristal.comなど。

私のDNS設定では、Arboristal.comは、現在WebサイトをホストしているWebホストに移動するように設定されています。

私の家では、3つのサーバーがすべて1つのパブリックIPアドレスで実行されています。 (71.82.237.27)

また、IPアドレスを指すArboristal.comの3つのサブドメインがあります。

3つのサーバーはそれぞれ独自のポート(25565、25566、25567)で実行されます

各サブドメインがIPアドレスの開いている各ポートを指すようにします。

残念ながら、サブドメインの1つを使用してこれらのサーバーの1つに接続しようとすると、ポートを入力したサーバーにのみ接続します。

私の状況:

それぞれ異なるポートで実行されている3つのサーバー。 (すべてポート転送され、サーバーとして動作)

Minecraftサーバー1(25565)

Minecraftサーバー2(25566)

Minecraftサーバー3(25567)

DNSプロバイダー(webs.com)で3つのサブドメインを実行しています

mc.arboristal.com

tekkit.arboristal.com

pvp.artboristal.com

Minecraftを使用してこれらの1つに接続すると、ポート25565を介して自動的に接続されます。つまり、どのURLに接続しようとしても、常にポート25565でIPに接続されます。ポートを手動で入力することもできますが、私はこれを可能な限り見栄えよくプロフェッショナルに保ちたいと思います。

だから、あなたは私の状況を知っているので、mc.arboristal.com、tekkit.arboristal.com、およびpvp.arboristal.comをすべてのポートを指定せずにすべて異なるポートの下で私のIPアドレスに移動できる方法はありますかユーザー側で接続するために提供されたURLに?

MX、A(これを使用してサーバーに接続する)、CNAME、およびTXTレコードをDNS設定に追加できます

サードパーティをDNSプロバイダーとして使用する必要がある場合は、ネームサーバーをDNS設定に追加することもできます。 (必要に応じて喜んで行います)

また、何かを設定する必要がある場合、192.168.0.1のルーターにフルアクセスできます。

先週インターネットが実際にどのように機能するかを学んだばかりなので、ここで何かが実際に可能かどうかはわかりません。また、インターネットが実際にどのように機能するかについての適切な情報もありません。インターネットに関して私が推測する可能性のある虚偽の情報はご容赦ください。

46
Swordstoo

SRV records を使用できます。

_service._proto.name. TTL class SRV priority weight port target.

Service:目的のサービスのシンボル名。

Proto:目的のサービスの転送プロトコル。これは通常、TCPまたはUDPのいずれかです。

Name:このレコードが有効で、ドットで終わるドメイン名。

TTL:標準DNS有効期間フィールド。

Class:標準DNSクラスフィールド(常にIN)。

Priority:ターゲットホストの優先順位。値が低いほど優先されることを意味します。

Weight:同じ優先度を持つレコードの相対的な重み。

ポート:サービスが検出されるTCPまたはUDPポート。

Target:サービスを提供するマシンの正規のホスト名で、ドットで終わります。

例:

_sip._tcp.example.com. 86400 IN SRV 0 5 5060 sipserver.example.com.

あなたが探していると思うのは、あなたの DNSホストファイル に次のようなものを追加することです。

_sip._tcp.arboristal.com. 86400 IN SRV 10 40 25565 mc.arboristal.com.
_sip._tcp.arboristal.com. 86400 IN SRV 10 30 25566 tekkit.arboristal.com.
_sip._tcp.arboristal.com. 86400 IN SRV 10 30 25567 pvp.arboristal.com.

余談ですが、サーバーを自分でホストするのではなく、ホスティング会社に行くことを強くお勧めします。自宅の接続(DDoSと帯域幅/接続速度)の問題を求めているだけですが、あなた次第です。

38
Winter

(私がこのようなことをしてからしばらく経ちました。盲目的にall以下の詳細が正しいと仮定しないでください。しかし、私はtoo恥ずかしいほど間違っていないことを願っています。 :))


前の回答で述べたように、Minecraftクライアント( 1.3.1以降 )は、サービス名_minecraftとプロトコル名_tcpを使用した SRVレコード ルックアップをサポートします。ゾーンファイルは次のようになります...

arboristal.com.                 86400 IN A   <your IP address>
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 20 25565 arboristal.com.
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 40 25566 arboristal.com.
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 40 25567 arboristal.com.

...次に、変更ログに示されているSRVレコード検索を実行するMinecraftクライアントは、ポート25565(20%の時間)よりも優先度(それぞれ40%の時間)でポート25566と25567を使用します。 notこれらのSRVレコードを見つけて尊重するMinecraftクライアントは、通常どおりポート25565を使用すると想定できます。


ただし、実際には Nginx などのロードバランサーを使用して行う方が「クリーンでプロフェッショナル」になると思います。 (私はそれを以前に使用したという理由だけでNginxを選択します。このタスクに特別に適していると主張しているわけではありません。何らかの理由でbadの選択でさえあるかもしれません。) DNSを台無しにして、同じ方法を使用して負荷分散anyサービスを使用できます。MinecraftのようなSRVレコードを検索して尊重するハードクライアント側の作業だけではありません。 Nginxの方法でこれを行うには、arboristal.comマシンでNginxを実行し、/etc/nginx/sites-enabled/arboristal.comで次のようなものを実行します。

upstream minecraft_servers {
    ip_hash;
    server 127.0.0.1:25566 weight=1;
    server 127.0.0.1:25567 weight=1;
    server 127.0.0.1:25568 weight=1;
}
server {
    listen 25565;
    proxy_pass minecraft_servers;
}

ここでは、サーバー側で(Nginxを介して)負荷分散を制御しているため、動作が悪いクライアントが他の2つのポートよりもポート25565を好むことを心配する必要はありません。実際、今ではallクライアントはarboristal.com:25565と通信します!しかし、そのポートのリスナーはMinecraftサーバーではなくなりました。 Nginxであり、すべてのトラフィックを密かに同じマシンの3つの他のポートにプロキシします。

クライアントのIPアドレス(ip_hash)のハッシュに基づいて負荷分散を行うため、クライアントが切断してから再接続した場合、以前と同じMinecraftサーバーに再接続される可能性が高くなります。 (これがMinecraftにとってどれほど重要であるか、SRV対応クライアントがこの側面に対処するためにどのようにプログラムされているかはわかりません。)

ポート25565でMinecraftサーバーを実行していたことに注意してください。ロードバランサーにポート25565を使用できるように、ポート25568に移動しました。

Nginxメソッドの不利な点は、Nginxがシステムのボトルネックになることです。 Nginxがダウンすると、3つのサーバーすべてが到達不能になります。システムの一部がその単一ポート25565のトラフィック量に追いつかない場合、3つのサーバーすべてが不安定になります。言うまでもなく、Nginxは、エコシステムにおける大きな新しい依存関係です。複雑な設定言語と巨大な攻撃対象領域を備えた別の巨大なソフトウェアを導入したくないかもしれません。私はそれを尊重することができます。

Nginxメソッドのadvantageの可能性は... Nginxがシステムのボトルネックになることです!特定のサイズを超えるパケットを拒否したり、ポート80のHTTP接続に静的なWebページで応答するなど、Nginx経由でグローバルポリシーを適用できます。また、インターネットからポート25566、25567、25568をファイアウォールで保護することもできます。ループバックインターフェイスを介してNginxがonlyと通信する必要があります。これにより、攻撃対象領域が多少減少します。

Nginxを使用すると、新しいMinecraftサーバーをバックエンドに簡単に追加できます。 server行を設定とservice nginx reloadに追加するだけです。古いポートベースのアプローチを使用すると、DNSプロバイダーに新しいSRVレコードを追加する必要があり(クライアントが変更を認識するまでに最大86400秒かかる可能性があります)、次にalsoを忘れないでくださいファイアウォール(/etc/iptables.rulesなど)を編集して、その新しいポートを介した外部トラフィックを許可します。

Nginxを使用すると、opsを変更するときにDNS TTLについて考える必要がなくなります。 3つのMinecraftサーバーを、異なるIPアドレスを持つ3つの異なる物理マシンに分割するとします。 Nginxを使用すると、server行の設定を変更することで完全に変更でき、これらの新しいマシンをファイアウォール内に保持できます(プライベートインターフェイスを介してNginxにのみ接続)。変更はすぐに有効になります。定義。一方、SRVレコードを使用すると、ゾーンファイルを次のように書き換える必要があります...

arboristal.com.                 86400 IN CNAME mc1.arboristal.com.
mc1.arboristal.com.             86400 IN A   <a new machine's IP address>
mc2.arboristal.com.             86400 IN A   <a new machine's IP address>
mc3.arboristal.com.             86400 IN A   <a new machine's IP address>
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 20 25565 mc1.arboristal.com.
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 40 25565 mc2.arboristal.com.
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 40 25565 mc3.arboristal.com.

...そして、3つの新しいマシンすべてを突っ込んでおく必要がありますoutsideファイアウォールがインターネットから接続を受信できるようにします。 Andクライアントが変更に気付くまで最大86400秒待つ必要があります。これはロールアウトプランの複雑さに影響する可能性があります。 Andarboristal.comで他のサービス(HTTPサーバーなど)を実行していた場合、そのCNAMEをどのように実行したかにより、それらをmc1.arboristal.comマシンに移動する必要があります。 SRVレコードを尊重せず、arboristal.com:25565に接続しようとしている架空のMinecraftクライアントの利益のためにのみ、これを行いました。


そのため、両方の方法(SRVレコードとNginxの負荷分散)は合理的であり、選択は個人の好みに依存すると思います。私はオプションを次のように風刺します:

  • SRVの記録:「機能するために必要なだけです。複雑になりたくありません。DNSプロバイダーを知っており、信頼しています。」
  • Nginx:「arboristal.comが世界を支配するか、少なくともいつかはより大きなマシンに移行することを予見しています。新しいツールを学ぶことを恐れていません。ゾーンファイルとは何ですか?」
10
Quuxplusone

可能な解決策:

  1. ポートAをリッスンし、ポートBまたはCに多重化するプロキシとしてサーバーでnginxを使用します。

  2. AWSを使用する場合、ロードバランサーを使用して、 Host に基づいてリクエストを特定のポートにリダイレクトできます。

0
Nadav B