モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

TCP および UDP の パケットリピータ stone の簡単な使用方法

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/05/27
最終更新最終更新
2021/04/27
記事区分記事区分
一般公開

目次

    Pythonでデータ解析と自動化ツールを開発しています。DjangoでのWeb開発も得意です!

    こちらで公開されている stone という小型のツールを用いると、飛び石としてパケット転送を行う中継サーバを用意することができます。実際には多機能なツールですがここでは最も簡単な使用例を紹介します。

    ビルド手順

    ダウンロード

    公式サイトから最新のもの stone version 2.3e をダウンロードします。

    解凍およびビルド

    Linux で SSL 通信の機能も含めたバイナリをビルドするためには以下のようにします。

    $ tar zxvf stone-2.3e.tar.gz
    $ cd stone-2.3d-2.3.2.7/
    $ make linux-ssl
    

    エラーが出る場合は以下のように Makefile を編集して -D_GNU_SOURCE を追記してから再度 make します。

     linux:
    -  $(MAKE) FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD
         -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL $(FLAGS)" LIBS="-lpthread $(LIBS)" stone
    +  $(MAKE) FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD
         -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -D_GNU_SOURCE $(FLAGS)" LIBS="-lpthread $(LIBS)" stone
    

    ビルド結果のバイナリは例えば /usr/local/bin に設置します。

    $ sudo mv stone /usr/local/bin/
    $ which stone
    /usr/local/bin/stone
    

    使用例

    まず、あるターミナルで以下のコマンドを実行しておきます。

    $ stone 127.0.0.1:22 10022
    May 27 00:16:04.535048 139811526662080 start (2.3e) [4504]
    May 27 00:16:04.543449 139811526662080 stone 3: 127.0.0.1:ssh <- 0.0.0.0:10022
    

    その状態で、別のターミナルで以下のコマンドを実行します。

    $ telnet 127.0.0.1 10022
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    SSH-2.0-OpenSSH_5.3
    

    確かに「stone を動作させているマシンの 10022 番ポート」へのパケットが「127.0.0.1 の 22 番ポート」に転送されました。実用的には 127.0.0.1 ではなく LAN 内の PC のプライベート IP を指定して使用することになります。アクセス元 IP を制限したい場合は以下のようにします。

    $ stone 127.0.0.1:22 アクセス元IP:10022
    

    (参考) コマンドを組み合わせる方法

    一時的な用途であれば、簡易的にいくつかのコマンドを組み合わせて、同様にパケットリピータを実現できます。

    pc --ssh--> vagrant --http--> www.example.com:80
    

    検証用のコマンド

    ssh vagrant
    curl -H 'Host: www.example.com' localhost:8888
    

    SSH トンネル

    -fN は必須ではありませんが、ポート転送をバックグラウンドで行うために指定しています。

    localhost に ssh できる場合

    ssh vagrant
    ssh localhost -fN -L 8888:www.example.com:80
    

    localhost に ssh できない場合

    ssh vagrant -fN -L 1234:www.example.com:80
    ssh vagrant -fN -R 8888:localhost:1234
    

    nc (netcat/ncat) を利用する方法

    サーバとして機能する前段の nc の標準出力を、クライアントとして機能する後段の nc にパイプで渡します。クライアント nc が受け取ったレスポンスは fifo ファイルでパイプしてサーバ nc に渡します。一回の HTTP 通信が終了すると nc は終了するため、while で繰り返し実行しています。

    CentOS 等

    mkfifo /tmp/fifo
    while /usr/bin/true; do nc -l 8888 < /tmp/fifo | nc www.example.com 80 > /tmp/fifo; done
    

    Debian 等

    mkfifo /tmp/fifo
    while /bin/true; do nc -l -p 8888 < /tmp/fifo | nc -q 0 www.example.com 80 > /tmp/fifo; done
    

    応用として -x に対応している nc の場合は TCP プロキシサーバを経由して以下のようなこともできます。

    mkfifo /tmp/fifo
    while /bin/true; do nc.openbsd -l -p 8888 < /tmp/fifo | nc.openbsd -x proxy.example.com:1080 -q 0 internal.example.com 80 > /tmp/fifo; done
    curl http://localhost:8888
    

    curl の --socks5-hostname オプションを利用するとより簡単です。

    curl --socks5-hostname proxy.example.com:1080 http://internal.example.com
    

    socat を利用する方法

    sudo apt install socat
    sudo yum install socat
    socat TCP4-LISTEN:8888,fork TCP4:www.example.com:80
    

    ログを監視して通信を切断する試験

    ログファイルに 'xxxx' という文字列が出現したら www.example.com との通信を 5 秒間切断するためには以下のようにします。

    • ログファイルを監視して特定行に対してコマンド実行 (taif)

    ./myscript.bash

    #!/bin/bash
    echo "./stop_packet_repeat.bash"
    ./stop_packet_repeat.bash
    echo "sleep 5"
    sleep 5
    echo "./start_packet_repeat.bash &"
    ./start_packet_repeat.bash &
    

    ./start_packet_repeat.bash

    #!/bin/bash
    if [ ! -e /tmp/fifo ]; then
        mkfifo /tmp/fifo
    fi
    while /bin/true; do nc -l -p 8888 < /tmp/fifo | nc -q 0 www.example.com 80 > /tmp/fifo; done
    

    ./stop_packet_repeat.bash (pkill)

    #!/bin/bash
    pkill -9 -f start_packet_repeat.bash
    pkill -9 -f nc
    

    実行例 (lsof)

    lsof -i:8888
    ./start_packet_repeat.bash &
    tailf /var/log/mylog.txt | grep --line-buffered 'xxxx' | while read line; do ./myscript.bash "$line"; done
    

    別ターミナル

    sudo sh -c "echo 'xxxx xxxx' >> /var/log/mylog.txt"
    curl -H 'Host: www.example.com' localhost:8888
    

    ルーティングテーブルを書き換える方法 (参考)

    パケットリピータとは関係ありませんが、ログを監視して通信を切断する試験については、ルーティングテーブルを書き換えるのが簡単です。ip コマンドを利用します。

    ip アドレスの確認

    vagrant@stretch:/vagrant$ host www.example.com
    www.example.com has address 93.184.216.34
    www.example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:194
    

    ルーティングテーブルの確認

    vagrant@stretch:/vagrant$ ip r
    default via 10.0.2.2 dev eth0 
    10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 
    

    ./myscript.bash

    #!/bin/bash
    sudo ip route add 93.184.216.34/32 via 127.0.0.1 dev lo
    sleep 5
    sudo ip route del 93.184.216.34/32
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    Pythonでデータ解析と自動化ツールを開発しています。DjangoでのWeb開発も得意です!

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事

      • Ciscoルータの基本操作
        シスコ社の製品のうち、ルータは Cisco*** という製品名でスイッチは Catalyst*** という製品名です。いずれも *** は機種番号で、数字が小さいほど小規模ネットワーク向けとなっています。例えば資格試験 CCNA Routing and Switching では小規模および中規模ネットワークが対象です。そのため、中小規模のネットワークのルータおよびス
      • BIND 9 ゾーンファイル Dynamic Update の設定方法
        DHCP 環境下などで IP が動的に付与される場合は DNS レコードを動的に更新する必要があります。これを実現する Dynamic Update 機能が BIND 9 には実装されています。使用方法をまとめます。Dynamic Update に対応した DNS を特に Dynamic DNS または DDNS とよぶことがあります。 ゾーンファイルの作成 ローカルホストに example.co...
      • VyOS の基本的なルーティング設定
        本ページでは、複数の LAN をつなぐルータとしての設定方法をまとめます。具体的には、スタティックルーティングおよびダイナミックルーティング (RIP/OSPF/BGP)の設定方法を把握します。 設定方法を検証するための構成 ルーティング設定の検証を行うために VirtualBox で 5 台の VM を用意します。ホスト OS から vyos-0001 へ SSH 接続する部分を除き、「内部ネッ...
      • BIND 9.10.2 の公式マニュアルに学ぶ DNS の基本
        DNS の実装としては Internet Systems Consortium (ISC) の Berkeley Internet Name Domain (BIND) が有名です。本ページは公式サイトの Documentation からダウンロードできる v9.10.2 の PDF マニュアルおよび『DNSの仕組み完全解説』から基本事項を抽出してまとめ
      • スタティックルートの設定
        サムネイル画像-73e0bcdf3a
        インターフェイスに IP を設定しただけでは他のデバイスと通信できません。各デバイスにルーティングテーブルを設定する必要があります。ルーティングテーブルの設定方法には動的に自動設定するものと、静的に手動設定するものの二種類があります。ここでは静的に手動設定するスタティックルートの方法を紹介します。 具体的にはまず PC0, PC1, Router0, Router1 それぞれ
        あきらあきら9/7/2021に更新
        いいねアイコン画像0