質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

Nodejsでipを変えてパケットを送信する

Sueqk
Sueqk

総合スコア1

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0グッド

0クリップ

860閲覧

投稿2021/05/15 08:37

編集2021/05/15 08:38

Nodejsでipを変更してパケットを送りたいです。
また不可能ならば、C++ addonを使用したいと思います。

ipアドレスを変更する目的:
クライアント1がサーバーにクライアント2のipを使用して送信する。
クライアント2が受け取り、処理をする
クライアント1のリクエストが終了する
クライアント2がクライアント1のipを使用してサーバーにデータを送信する
クライアント1が受け取り、目的が達成される

このようなことを考えているのですが、Nodejsだけで可能でしょうか?
不可能ならば、C++の方法を教えてくれると幸いです

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

dodox86

2021/05/15 10:41

> クライアント1がサーバーにクライアント2のipを使用して送信する。 送信元であるクライアント1が、クライアント2のIPアドレスを送信元として偽装/詐称して送信する、ということですか? UDPで? > また不可能ならば、C++ addonを使用したいと思います。 Node.jsのC++ addonでそういうことが可能とどこかで情報を得たのでしょうか。それともできるかどうか分からないのでそれをも含めた質問なのでしょうか。
Sueqk

2021/05/16 05:38

少し前、raw-packetsというC++で出来たモジュールを見たつけたんですが、その中にICMPの通信をするというものが含まれていたような気がしてできるのかと。

回答1

0

ベストアンサー

目的達成のためにはかなりトリッキーなことをする必要がありそうです。

例えば、netcatで送信元IPアドレスを自身で管理していないIPアドレスで送信しようとするとエラーが発生します。

bash

1$ nc -u -s 192.168.1.1 8.8.8.8 53 2nc: bind failed: Cannot assign requested address

※ 192.168.1.1は私の家のルータのアドレス。

ソースコードを見ると、bind関数(syscallの薄いラッパーの認識)がエラーを返しています。
https://github.com/openbsd/src/blob/aeddc3fc1c2dc619781d7d37222447f40fb248a7/usr.bin/nc/netcat.c#L977

RAWパケットを扱うpingもbindで失敗します。

$ ping -I192.168.1.1 1.1.1.1 ping: bind: Cannot assign requested address

https://github.com/iputils/iputils/blob/2917e0e31dd799c9a3bf931f86b3e62452a4e217/ping/ping.c#L821

socket APIを利用しての実装は厳しそうなので、それより下位層(ethernet層など)での実装が必要になりそうです。

Linuxであれば、XDP (eBPF関連の技術)でパケット書き換えが実現できそうです。
XDPでPacket Rewriting – MySQLのポートを書き換える
上記記事ではポートを書き換えていますが、ポートの代わりに送信元IPアドレスを書き換えれば目的は達成できるのではと考えています。

投稿2021/05/15 11:48

yskszk63

総合スコア161

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Sueqk

2021/05/16 05:47

なるほど、LinuxであればXDPで可能なのですね。少し試してみます

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。