• このエントリーをはてなブックマークに追加

【linux豆知識】rubyでソケットプログラミング(UDPで疎通確認編)

  • このエントリーをはてなブックマークに追加

socket
zaco muraです。
近頃ではフルスタックエンジニアという言葉があるらしく、(自分の解釈では)上から下まで全てのレイヤをわかっているエンジニアが重宝されるとのこと。

そんなご時世にフルスタックとは程遠い私ですが、今日は少しレイヤを下げてネットワークとサーバ(L3,L4あたり)について書きます。

背景

あるサーバとの疎通を確認したい、という時に恐らくほとんどの人がpingを使うかと思います。ご存知の通りpingはL3の疎通確認に使えます。
では、”あるサーバのあるサービス(ポート)との疎通を確認したい”という場合、どのように確認するでしょうか。(自分の経験上、経路上のACLやサーバのiptablesに問題ないことの確認で、このようなことはけっこうあります)
自分の知っている限り、IPならping、TCPならtelnet で確認できますが、UDPでは汎用的な良い方法はあまり無いように思います。

簡単にUDPパケットを飛ばす方法

こんな時、私は自分でUDPパケットを飛ばす即席プログラムを書きます。プログラムといっても本当に簡単な、数行の内容です。

環境

・Linux端末(自分の環境はCentOS5.11)
・ruby 2.0.0p598
・irb 0.9.6(09/06/30)

手順

### irb(rubyの対話的なコマンドラインインターフェイス)を実行
client $ irb
### socketライブラリを読み込む
irb(main):001:0> require 'socket'
=> true
### UDPソケットを作る
irb(main):002:0> udpsocket = UDPSocket.new()
=> #<UDPSocket:fd 7>
### 自分(192.168.0.2)の10000ポートを使う
irb(main):003:0> udpsocket.bind('192.168.0.2',10000)
=> 0
### 相手(192.168.0.1)の1000番ポートに'test_message'というテキストを送信
irb(main):007:0> udpsocket.send('test_message',0,'192.168.0.1',1000)
=> 12
### 使い終わったUDPソケットを開放する
irb(main):011:0* udpsocket.close
=> nil

ちなみに、この時サーバ側ではこのようにパケットが届いています。

server $ tcpdump -i ens192 -nn -p udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens192, link-type EN10MB (Ethernet), capture size 65535 bytes
### 受け取ったパケット
12:48:04.463377 IP 192.168.0.2.10000 > 192.168.0.1.1000: UDP, length 12

このようにパケットがサーバ側で見られれば途中経路のフィルターなどは問題ないことがわかります。

まとめ

今回は簡単に実行するためにirbを使いましたが、もちろん上記のコマンドをまとめてファイルに記述すればrubyプログラムとしてudpパケットを自由に飛ばすことができます。
rubyは簡単にこういったコードが書けて便利ですね~

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link