web-dev-qa-db-ja.com

DNSレコードはIPアドレスのみを指すことができます。ポートに到達させるにはどうすればよいですか?

私はネットワーク管理にかなり慣れていないため、DNSレコードを正常に設定できたことにすでに興奮しています。

私はこのURLが欲しいので、少し混乱しています。

http://www.example.org:8080/fetch/characters/

これで実際に到達する

http://www.example.org/fetch/characters/

そのため、ユーザーはポートを明示的に設定しなくても、ポート8080でサービスにアクセスできます。

これどうやってするの?サーバーに特別なアプリケーションが必要ですか?または、リクエストに適用されるredirect何か?

10
xetra11

DNSレコードはポートを指すことができません(ここでは適用されないいくつかの特別な例外があります)。

ポート8080でリッスンするWebサービスがあり、このポートを指定せずにアクセスしたい場合は、3つのオプションがあります。

  • ポート80(またはhttpsの443)で実際にリッスンするようにします。
  • ポート8080(リバースプロキシ)でサービスに要求を転送するように、ポート80で既にリッスンしているものを構成します。
  • リダイレクトを使用できる場合は、プロキシの代わりにこれを使用しますが、クライアントはリダイレクト後にアドレスバーに:8080の部分を表示します。
32
Sven

Webサーバーは、デフォルトでTCPポート80をリッスンします。URLにポート番号を明示的に入力したくない場合は、いくつかのオプションがあります。

  • ポート8080の代わりにポート80を使用するようにWebサーバーを再構成できます。これは、nginxやApacheなどのWebサーバーでは推奨されますが、GunicornなどのWebサーバーでは推奨されません。このオプションは、そのポートが別のWebサーバーですでに使用されている可能性があるため、常に使用できるとは限りません。

    また、サーバーがNATゲートウェイの背後にある場合、それはパブリックIPアドレスを所有しておらず、そのパブリックNATアドレスとポート80の組み合わせはすでに別のWebサーバーに転送されている。

  • TCPポート80でトラフィックを受け入れ、それをTCPポート8080でWebサーバーに送信します。これは、ポート80がすでに使用されている場合にも機能します。リバースプロキシサーバーを両方のWebサーバーの前に置くだけで、両方が80以外のポートをリッスンするようになります。

どのオプションが最適か、制限などについて、より詳細で詳細なヘルプを提供するには、セットアップについてさらに知る必要があります。うまくいけば、この説明はすでに少し明確になっています。

10
Tommiie

質問のレベルに関連する簡単な回答

エキゾチックなDNSの使用、および逆DNSルックアップ(質問には関係ありません)を無視すると、ほとんどすべてのDNSの使用は次の形式になります。

  1. クライアントはドメイン名(完全修飾またはその他)をDNSサーバーに送信します
  2. DNSサーバーは、そのレコードからドメイン情報を返します。通常、要求される重要な情報は、そのドメインのWeb /電子メールと通信するためのIPアドレス、またはその情報を提供することができる別のDNSサーバーのIPアドレスです。

クライアントがサーバーに接続すると、サーバー自体が引き継ぎ、DNSシステムが停止します。

つまり、DNSシステムはポート情報を提供する必要がなく、ほとんど提供しません。したがって、質問の目的は有効であり、しばしば行われますが、実際にそれを行うのはDNSシステムではありません。それがあなたがそれを解決できない理由です:)

アイデアは、クライアントが探している特定のマシンまたはサーバーを見つけたら、選択したポートでリッスンし、構成された任意のポートで任意のプロトコルに受け入れ/拒否/応答するのは、そのマシンにかかっているということです。

たとえば、HTTP Webサービスは通常ポート80で提供されます。つまり、クライアントがマシンのIPを知ったら、メッセージをポート80に送信すると、そのメッセージがそのマシンのWebサービスによって読み取られたり応答されたりすると想定できます。しかし、そうである必要はありません。サーバーがポート9000でWeb着信要求をリッスンするように構成されている場合、ポート9000に到達できるクライアントはすべて、そのWebサービスに到達できます。サーバーがポート10000をポート9000にリダイレクトするプロキシ/ NAT /ルーターの背後にあり、クライアントがポート10000でWebリクエストを送信する場合、サーバーはポート9000でそれを受信して​​応答します。

Webサーバー内でのリダイレクト/マッピング

コメントでリダイレクトマッピングまたは書き換えについて質問しました。これらは、Webサーバーが実行できる機能です。基本的に、リクエストで受け取ったURLの処理方法を管理するようにWebサーバー(またはほとんどまたは多くのWebサーバー)を構成できます。そのため、受信時にURLを内部的に変更して、異なるURLを同じ方法で処理したり、一般的なタイプミス(マッピング)を修正したり、実際に応答して、別の代替のURLを使用してクライアントに再度尋ねたりすることができます。 (リダイレクト)。

これらには用途があり、原則としてユースケースを処理できますが、次の理由により、「適切な」ソリューションのようには聞こえません。

  1. マッピングがまったく役に立たないと思います。マッピングはほぼ完全にWebサーバーの内部で行われ、「thisURLをであるかのように扱いますURL」。たとえば、WebサーバーのURLマッピングを使用して、ユーザーが非常に古い、古い、現在のURL(ユーザーの便宜のため)を使用して、「 https://example.com/index.php? area- = forum&topic = 2 "、また" https://example.com/forum.php?topic=2 "および" https://forum.example .com?topic = 2 "であり、クエリを処理する最初のステップとして、これらの最初の2つを3番目のURLに内部的にマッピングすることで、これを1回だけ処理します。このターゲットはIP /ポートではなくクエリパスに影響を与えるため、ポート管理ではマッピングはあまり使用されず、クライアントは実際には8080をまったくクエリしません。
  2. リダイレクトは機能しますが、期待どおりではない場合があります。 Webサーバーでのリダイレクトは、実際にクエリを受信するWebサーバーに依存します(これらはWebサーバーの内部関数であるため)。したがって、リダイレクト/マップで応答するには、Webサーバーは元のクエリを取得するためにポート80をリッスンする必要があります。 also はポート8080でリッスンする必要があります。機能的には、 ":8080" URLを使用して再度クエリするには、ポート80をクエリしているクライアントに通知するためのリダイレクトルールが必要です。 、あなたがやりたいことのように聞こえません。また、ユーザーには「:8080」が含まれた新しいURLが表示されますが、表示されないように「透明」にしたいようです。
  3. また、リダイレクトは標準ポート(80または443)をリダイレクトするためにのみ機能します-クライアントが '2000'をリダイレクトしないため、ポート2000を8080にリダイレクトできませんでした最初はデフォルトで2000を照会するので、たとえ2000でリッスンしていても、Webサーバーに到達することはありません。これは問題にはならないかもしれません。

ただし、特定のクエリのみが8080に再ルーティングされる「インテリジェントな」リダイレクトが必要な場合は、リダイレクトがどのURLをリダイレクトするかを決定するロジックを含むことができる一方で、ポートマッピング(下記)がマップするすべて

正しく行う方法

あなたの質問に対する答えは、クライアントがデフォルトのポート(80/443)に送信するがサーバーが実際にポート8080で受信するWebリクエストにWebサーバーが応答するようにすることです。

つまり、ご覧のとおり、その間に何かが必要ですクライアントとサーバー間のポートをマップします。この方法では、クライアントはポート80(Webブラウザーで使用されるデフォルトのポート)で送信しますが、実際にはポート8080でWebサーバーによって受信されます。もちろん、これは標準ではないので、ポート8080でリッスンするようにWebサーバーを構成する必要がありますが、簡単で、どのWebサーバーでもリスニングポートを指定できるはずです。

これを行う最も一般的な方法は、ポートマッピングを介したルーター/ファイアウォール内です。

簡単に言えば、これを行うために、ルーターにはルールが与えられ、宛先IPが80である受信されたものはすべて、代わりに宛先ポートを8080に変更してLANに渡す必要があります。 Webサーバーもクライアントも変更を認識しないため(ルーターによって100%処理されます)、両方に対して100%透過的です。クライアントはポート80をクエリするため、URLに「:8080」がなく、何もリダイレクトする必要はありません。また、Webサーバーはポート80でクエリを取得しないため、ポート80を無視して8080のみをリッスンできます。 。

「ポートのDNS」と同じように単純で簡単な方法が必要な場合、これはおそらく、質問で求めているものに最も近いものです。

7
Stilez

できません。

つまり、技術的にはこれが可能でした。 DNSは、ドメイン名を送信してIPアドレスを取得できることで有名です。ただし、DNSプロトコルについては少し調べましたが、実際には、DNSは技術的には、ドメイン名とIPアドレスだけでなく、クエリ/応答メカニズムとしても機能します。 TXTレコード(技術的に単なるテキストであり、何にでも使用できる)など)の典型的なAまたはAAAAタイプではないDNSリソースレコードを使用することもできます。または、SRVレコード、または選択したその他の新しいリソースレコードタイプ。

独自のソフトウェア(クライアントとサーバーの両方)を作成している場合、一部の人々がDNSホスティング会社を使用し、特定のレコードタイプのみを使用するように制限していることを除いて、そのようなことをしない理由はありません。自分のDNSサーバーを実行する人々は確かにそのようなことに対して十分な柔軟性を持っているので、それは残念です。

ただし、独自のネットワークプロトコルを構成していない場合(たとえば、HTTPを使用したい場合)、使用しない限り、既存のソフトウェアがカスタムソリューションを使用しないという重大な問題が発生する可能性があります。すでに確立されているソリューション。それが障壁になるでしょう。技術的に不可能ではありません。社会的障壁:みんなにあなたのやり方でやるように説得できますか?

なぜそれができないのかを説明したので、私はあなたが望んでいることに対する解決策を持っているかもしれません。まず、なぜIPアドレスとポートがあるのか​​を見てみましょう。

IPアドレスとポートは異なる働きをします。 IPアドレスの目的は、ネットワーク通信のOSIモデルのレイヤー2および3の目標を達成することです。 IPアドレスの目的は、トラフィックの送信先となるコンピューターを識別することです。 NAPT(ネットワークアドレスポートベースの変換、PNATまたは単にNATとも呼ばれる)を実行するためにファイアウォール/ルーターにポート番号を調査させることにより、その目的でポート番号を使用する可能性があるという事実は、リソース(情報)ですが、元のデザインの一部ではありませんでした。このポート番号の「乱用」から少し離れて元の設計を検討すると、より簡単な解決策を見つけることができる場合があります。インターネットの設計により、マシンはIPアドレスを使用して検出されるように意図されていました。

TCPおよびUDPといくつかの代替手段で使用される「ポート番号」のポイントは、個々の会話を追跡できるようにすることです。これは、実行中のプログラムとの通信を整列させるのに役立ちます。したがって、マシンがTCPポート80でトラフィックを受信する場合、マシンはネットワークトラフィックがWebサーバーであるプログラムによって使用されることを意図されていることを認識します。Webブラウザーが複数のグラフィックスを同時にダウンロードする場合、組み合わせ「送信元ポート」番号と「宛先ポート」番号の組み合わせにより、どのデータがどのグラフィックを意味するかを追跡できるため、データを混同することなく、これらの同時会話を行うことができます。

さて、あなたはDNSサーバーにアクセスできると思いますが、DNSの管理がトラフィックのルーティングの一部をもう少し処理できるようにすると便利だと思われるようです。しかし、DNSはポート番号の取得を支援することができないようです。あなたは何ができますか?

IPv6を検討してください。 IPv6を使用すると、IPアドレスをさらに増やすことができます。さらに、IPv4の一部の実装とは異なり、IPv6を使用するデバイスは通常、複数のアクティブなIPv6アドレスを同時に簡単にサポートできます。したがって、1台のコンピューターで3つの異なるネットワークプロトコルを使用する場合は、同じコンピューターに少なくとも3つの異なるIPv6アドレスを割り当てることができます。そして、あなたはそれらのIPv6アドレスであなたが好きなどんなルーティングshenanigansでもすることができます。

次に、AAAAリソースレコードタイプを使用して、そのIPv6アドレスに名前を割り当てることができます。この名前は、ネットワーク設計で、必要な特定のコンピューター上の特定のサービス専用に扱うことができます。

ワラ、これでDNSがソフトウェアの一部を効果的にポイントし、DNSがポート番号をポイントするように頼る必要なしにその目標を達成しました。これは、その機能が一般的ではないため、うまく機能しないサポートされています。

考えられる異論:
そして、IPv4にこだわっていて、IPv6がなんらかの形でサポートされていないと思われる場合は、その問題に取り組んでみることをお勧めします。その問題はおそらく修正がより簡単で(おそらく何らかのトンネリングを使用することになるでしょう)、実装してしまえば、おそらくもっとやりがいのある修正になるでしょう。

3
TOOGAM