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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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

解決済

1回答

2257閲覧

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

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つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿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++の方法を教えてくれると幸いです

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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の通信をするというものが含まれていたような気がしてできるのかと。
guest

回答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で可能なのですね。少し試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問