まず、ネットワークに関する私の知識は非常に限られているため、間違った用語を使用している場合は事前にお詫び申し上げます。
状況
私は、クライアントが別のネットワーク上のローカル Web サーバーと通信できるようにするプロトタイプを作成しようとしています。Web サーバーは、VPN サーバーと同じネットワーク上でホストされています。これまでのところ、クライアント パケット (例: SYN) を仮想インターフェイス (tun) にルーティングし、パケット全体を VPN サーバーに送信することができます。サーバー側では、これらのパケットを受信し、送信元と送信先の IP を変更し、ヘッダー内のチェックサムを再計算します。
繰り返しになりますが、流れは次のようになります。
- ユーザーは特定の IP アドレスを使用して Web サーバーにアクセスしようとします。
- SYN パケットはルーティング テーブル内のルートと一致するため、仮想インターフェイスに送信されます。
- VPN クライアント アプリケーションは、確立された Websocket 接続を介して SYN パケットを VPN サーバーに送信します (接続の種類は関係ありません)。
- VPN サーバーはパケットを受信し、送信元/宛先 IP アドレスを変更して、同じネットワーク上でホストされている実際の Web サーバーを指すようにします。
- これらのパケットを Web サーバーに送信し、Web サーバーからの応答を受信するにはどうすればよいでしょうか。クライアントが VPN サーバーまたは確立された Web ソケット接続を介して Web サーバーと通信するようにしたいのですが、どのようなオプションがありますか。
質問
これらのパケットを Web サーバーに送信し、Web サーバーからパケットを受信してクライアントに送り返すにはどうすればよいですか? パケットを正しいインターフェイスに「挿入」し、アプリケーションが応答をクライアントに送り返すようにする必要がありますか? クライアントが VPN サーバー/確立された Web ソケット接続を介して Web サーバーと通信するようにします。どのようなオプションがありますか? また、一般に、現在の VPN サーバーはこれをどのように実行しますか?
私が試したこと
サーバー側で試したのは、仮想インターフェイス (tun) を作成し、クライアントから受信したパケットをインターフェイスに書き込むことです。ただし、これらのパケットは Web サーバーに送信されません。クライアントとサーバーは、ネットワーク拡張機能を使用して macOS 上で実行されています (これが役立つ場合)。Web サーバーは で実行されており、インターフェイスに書き込む前に、192.168.1.95
パケットのソース IP を に変更しました。100.64.0.77
tun
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 192.168.1.254 UGSc en0
default link#10 UCSI utun2
100.64.0.77 100.64.0.77 UH utun2
127 127.0.0.1 UCS lo0
127.0.0.1 127.0.0.1 UH lo0
169.254 link#7 UCS en0 !
192.168.1 link#7 UCS en0 !
192.168.1 link#10 UCSI utun2
192.168.1.92/32 link#7 UCS en0 !
192.168.1.99 8c:a9:82:2e:d6:2e UHLWI en0 986
192.168.1.254/32 link#7 UCS en0 !
192.168.1.254 70:f1:96:86:e6:a0 UHLWIir en0 1196
224.0.0/4 link#7 UmCS en0 !
224.0.0/4 link#10 UmCSI utun2
224.0.0.251 1:0:5e:0:0:fb UHmLWI en0
255.255.255.255/32 link#7 UCS en0 !
255.255.255.255/32 link#10 UCSI utun2
`
答え1
VPN サーバーはパケットを受信し、送信元/宛先 IP アドレスを変更して、同じネットワーク上でホストされている実際の Web サーバーを指すようにします。
クライアントが既に必要な宛先 IP アドレスを指定しているため、これは必要ありません。(VPNカプセル化する元のパケットを別の IP パケット内に格納し、元の IP ヘッダーを変更することなく、サーバー側で再度カプセル化を解除して元のパケットをそのまま転送するだけで済みます。
NATは実行可能です(実際に時々実行されています)が、多くの場合はOSファイアウォールの役割であり、システム管理者の判断です。VPNソフトウェアだけで実行すべきではありません。また、一般的に、内部ネットワーク内の通信は必要NAT を使用すると、ネットワークの基本的なルーティングが正しく設定されていないことが示されることがよくあります。
これらのパケットを Web サーバーに送信し、Web サーバーからの応答を受信するにはどうすればよいでしょうか。クライアントが VPN サーバーまたは確立された Web ソケット接続を介して Web サーバーと通信するようにしたいのですが、どのようなオプションがありますか。
通常、VPN サーバーは VPN クライアントとまったく同じ仮想インターフェイスを持ち、パケットの生成と受信にまったく同じメカニズムを使用します。(クライアントごとに専用の仮想インターフェイスを作成するものもあれば、すべてのクライアントに対して単一のインターフェイスを持つものもあります。) クライアントがインターフェイスを使用している場合はtun
、サーバーでも同じことができます。