2つのネットワークカード(およびそれらに関連付けられたポート)を備えたWebサーバーがあると仮定し、それらをAおよびBと呼びましょう。アイデアは、一方のポート(A)をインターネットに接続し、もう一方(B)をサーバーの分離されたネットワークに接続することです。さまざまな計算。これは比較的一般的であるように思われます。1つのネットワークは実際の情報の送受信のためにインターネットに公開され、プライベートネットワークは安全なデータストレージや管理制御などのために公開されています。
トラフィックはどちらか一方をどのように誘導されますか?これについて私が見た唯一の側面はコード側であり、私が精通しているすべての言語では、発信元アドレスではなく宛先アドレスを提供することによって通信(TCPなど)を開始します。いずれかのポートに(スイッチを介して)接続されている特定のマシンと通信する場合、どちらをどのように指定しますか?さらに、マシンがAとBの両方を介して接続されていても、一部のトラフィック(財務情報など)をB経由で送信する必要があり、他のトラフィック(RESTデータなど)がAに適している場合はどうでしょうか。
おそらくルーティングを使用してこれを行います。ポートAに1つのサブネットを持ち、ポートBに別のサブネットを持ちます。その後、OSは、到達する必要のあるサービスに従って、正しいインターフェイスを介してパケットをルーティングします。
何を、なぜ行う必要があるのかは明確ではありません。
ネットワークカードが2つある場合、マシンには2つのネットワーク接続と2つのIPアドレスがあります。そのマシンのIPアドレスを介して他のマシンと通信する場合、サーバーはローカルルーティングポリシーに基づいて発信インターフェイスを選択します。メトリック。
例1:2つのネットワークに接続しています:
ここで、192.168.1.5に接続する場合、宛先はそこに直接到達できるため、Webサーバーは2番目のネットワーク(192.168.1.0)を選択する可能性があります。
例2:、1つのネットワークのみに接続:
これで、10.10.10.2に接続する場合、10.10.10.2はネットワーク(192.168.1.0)にないため、Webサーバーはデフォルトゲートウェイ(ルーター)にパケットを送信するだけです。サーバーには、ゲートウェイ上のパケットで何が起こり、ゲートウェイ(ルーター)がパケットを最終的な宛先に配信する方法についての手がかりがありません。これはゲートウェイ(ルーター)だけの頭痛の種です。
2番目の例では、サーバー上のローカルルーティングテーブルは非常に簡単に見えます。
結論:
ルーティングソフトウェアを作成していない場合、コード側からは発信インターフェイスを選択できません。アプリケーションはルーティングプロトコル、情報、およびルールについて何も知らないため、これは合理的です。オペレーティングシステムは、ルーティングテーブルに応じて選択を行います。また、ルーティングテーブルは、ネットワーク接続のステータス、ポリシー、ルール、ルーティングプロトコル(サーバーがルーターとして機能する場合)などに応じて、オペレーティングシステムによって作成および更新されます。
宛先PORTに応じて、2つの異なる発信インターフェイスを介して同じ宛先と通信する必要がある場合は、サーバーでルーティングを構成する必要があります。 Linuxの例: https://unix.stackexchange.com/questions/21093/output-traffic-on-different-interfaces-based-on-destination-port
これが、通常、異なるインターフェースに異なるホスト名、またはおそらく異なるサブドメインを割り当てる理由です。
ホスト名がHost001とHost002であり、ネットワークが次のようになっているとします。
<-----internet --------+------------------------------+-------whatever else--->
| |
157.38.5.6 | 157.38.5.7 |
+---------------+--+ +-------------+--+
| Host001 | | Host002 |
+---------------+--+ +-------------+--+
192.168.1.1 | 192.168.1.2 |
+------------------------------+-------admin lan--->
157.38.5/24は、プロバイダーによって割り当てられたアドレス範囲です。両方のホストはインターネットから到達可能であり、あなたは置くでしょう
Host001.mycompany.com. IN A 157.38.5.6
Host002.mycompany.com. IN A 157.38.5.7
公式のDNSレコードに。
(インターネット接続には大きなファイアウォールボックスが必要であり、ファイアウォール以外の場所ではパブリックにルーティング可能なアドレスを使用しないでください。しかし、わかりやすくするために、内側と外側を区別したかったのです)。
レコードがインターネット上で公開されていない社内DNSサーバーに、
Host001.dmz.company.com IN A 157.38.5.6
Host002.dmz.company.com IN A 157.38.5.7
Host001.mgm-net.company.com IN A 192.168.1.1
Host002.mgm-net.company.com IN A 192.168.1.2
これで、内部ネットワークを介して接続を開く場合は常に、mgm-net
ドメイン内のホスト名の1つを使用します。これにより、192.168.1
アドレスが選択され、各ホストには独自のアドレスが1つあるため、このネットワークインターフェイスが使用されます。パブリックネットワークを使用する場合は、dmz
ドメインアドレスを使用します。
ローカルホストはどのように発信インターフェイスを選択しますか?
これがルーティングテーブルの目的です。ルーティングテーブルは次のようになります。
destination netmask gateway metric interface
0.0.0.0 0.0.0.0 157.38.5.1 1 eth0
157.38.5.0 255.255.255.0 0 eth0
192.168.1.0 255.255.255.0 0 eth1
テーブルの正確な形式は、OS、OSのバージョン、およびテーブルの表示に使用されるコマンドによって異なります。また、メトリックの絶対値は異なる場合があります。この重要な点は、すべてのルーティングテーブルエントリから、カーネルが宛先アドレスに適合しないエントリを排除することです。 192.168.1.1に接続すると、リストから2番目のエントリ(157 ...)が削除されます。デフォルトルート(0.0.0.0)は、この時点でも引き続き有効です。
次に、残りのすべての可能性から、最適なメトリックを持つものが選択されます。従来、メトリックは宛先へのホップ数の同義語であったため、最も低いメトリックが最適でした。 Windowsは他の方法を使用しますが、最高のメトリックが最適です。とにかく、使用するローカルインターフェイスを決定するのは、ローカルルーティングテーブル内の可能なルートとメトリックの組み合わせです。
これは、PCとターゲットネットワークの間に1つ以上のルーターがある、社内の「ネットワークのさらに下流」の場所から接続しようとしている場合に特に重要です。
これをさらに改善する可能性
異なるネットワークドメインではなく、異なるホスト名をホストに付けることをお勧めします。したがって、Host001-ext.mycompany.comとHost001-adm.mycompany.comのホストエントリがある可能性があるため、特定のホストに接続するたびにドメインを「スペルアウト」する必要はありません。ただし、さまざまなPCでドメイン検索順序をいじることで、PC Aがdmz.company.comを優先し、PC Bがmgm-net.company.comを優先し、正しいネットワークを「自動選択」するというトリックを実行できます。構成ファイルの「Host001」を参照してください。
最後のIPバイトを同期すると、混乱が少なくなります。外側の157.38.5.6は、192.168.1.1ではなく、内側の192.178.1.6と一致する必要があります。最後のバイトに一貫性があると、外部アドレスから内部アドレスを自動生成するスクリプトを作成できます。
ポート22/ssh(UNIX上)や3389 /リモートデスクトップなどの「危険な」サービスは、192.168.1.Xアドレスにのみバインドできます。そうすれば、内部ネットワークに接続している場合でもマシンにSSHで接続できますが、外部から攻撃ベクトルを削除しました。
構成/プログラミング
OS APIの機能の1つは、そのすべての厄介な詳細を非表示にすることです。そのため、特に要求しない限り、「データの取得元のインターフェイス」に違いは見られません。
CソケットAPIから、getsockname()
およびgetpeername()
関数を使用して、ソケットのローカル/リモートアドレスを調べることができます。また、bind()
を使用してリスニングソケットを設定する場合、パラメータの1つはsockaddr
構造体です。この構造体では、ポートを設定する必要があり、mayIPアドレスを設定します。通常は、0.0.0.0に設定するだけです。これは、ソケットが任意のアドレスのそのポートにバインドされていることを意味します。
Javaでは、同じことを行うためにSocket.getRemoteSocketAddress()
とSocket.getInetAddress
があり、ServerSocket()
には、リッスンするアドレスを設定できる3パラメーターバージョンがあります。
アプリケーションには通常、同じことを行うための構成ファイルがあります。たとえば、/etc/sshd/sshd_config
のsshd
構成にはListenAddress
パラメーターがあります。ここでListenAddress 192.168.1.1
と言うと、sshd
はソケットの作成時にその192.168.1.1
をbind()
に渡し、OSは157.38.5.6
宛てのsshパケットを受け入れません。
同様に、ApacheWebサーバーには構成パラメーターListen
があり、これを使用して、リッスンするポートとオプションでアドレスを設定できます。
Windowsプログラムは、通常、いくつかの構成クリックでこれを持っています。 IISでは、ポートとIPアドレス(すべてのアドレスに対してアドレスを「*」にすることができます)を使用してサービスをサーバーにバインドします。これにより、実質的に同じことが行われます。
あなたのテキストから、あなたが本当に2つの本当に別々のネットワークについて話しているのかどうかはわかりません。
サブネットごとに1つの異なるスイッチ(または複数のVLANを持つ単一のマネージドスイッチ)。
各スイッチは、サーバー上の1つのNIC(ネットワークカード)に接続します。
他のすべてのコンピューターは、単一のスイッチにのみ接続します。
各サブネットには独自のアドレス指定があります。たとえば、一方には192.168.0。*のようなアドレスがあり、もう一方には192.1.68.1。*のようなアドレスがあります。
それが実際に当てはまる場合は、次のようにします。
サーバー上のLinuxは、トラフィックをルーティングする必要があります自動的にあるネットワークから別のネットワークにルーティングします(そうでない場合は、Google iptables、2つのNIC間のルーティング、および実行しているLinuxを教えてください)
サーバーは、構成するのに適した場所でもあります制限するファイアウォールネットワーク間でルーティングしたくないトラフィック。
トラフィックがどちらの方向に進むかの区別は、単にIPアドレスに基づいています(上記の4を参照)。
通常、両方のサブネットでPCを接続するのではなく、ルーティングとファイアウォール(単一のポイントであるサーバー)を使用して、サブネット間を移動するものを微調整します。