Spring lecture
本記事ではPC初心者が一年間の勉強をし,先輩(@khwarizmi6514)の助けをいただきながら行ったパケット解析について書かれています.
経緯
一年間,本当にお世話になっている先輩に春休みの長期休みを使って,授業では教わることのなかなかできない「実践的な学び」について教えてもらうことになりました.週2日の時間を割いてもらいとても有意義な学びをしているので,この大事な経験を忘れないように今ここに記しています.
パケット処理実装
今回やった内容は パケットをKVMにて直つなぎし2台のVMを用意する. pingが通るのを確認したのち,自身が送ったicmpパケットをpcapで保存する. それについてL2,L3アドレスが確認できる程度のパケットpcap解析プログラムを作成する. というものです. パケットというのは,携帯のキャリアがよく広告としてうっている「パケ放題」のパケットと同じものです.基本情報技術者試験などで出てくるので,どういうものなのかは簡単には理解していました.しかし自分の手でそれを流して解析するというのはワクワクしました,
いざpingを打って見ても流れてる感じはありませんでした. pingを送った後,送り先のデバイスでキャプチャしてpcapfileに保存しました. pcap解析プログラムを書いていきました. そこで一個問題が発生しました. その問題は『byte order』についてです.
byte order
今回のパケット解析ではL2,L3の「length,dest&source addr,type,ttl」を表示させるものでした.しかしL2のtype,L3のアドレスは違う値が出てきてしまいました.なぜ違うのか?それは「リトルエンディアン」と「ビックエンディアン」というbyte orderの違いでした.
そこで ntohlとntohs(network to host longとnetwork to host short) htonlとhtons(host to network longとhost to network short) を使用して,正しい値にすることができました. 最後に「Wireshark」をつかってパケット解析を行いました.
code
まだ汚いコードですがお許しください.
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<pcap.h> #include<arpa/inet.h> #include<net/ethernet.h> #include<netinet/ip.h> #define PROTO_ETHER 1 #define PROTO_IP 2 void henkan(void *hen); //アドレスをprintさせる int print(void *addr,int proto){ switch(proto){ case PROTO_ETHER: printf("dest addr:\t"); for(int i=0;i<ETH_ALEN;i++){ printf("%02x ",((struct ether_header *)addr)->ether_dhost[i]); } printf("\nsource addr:\t"); for(int i=0;i<ETH_ALEN;i++){ printf("%02x ",((struct ether_header *)addr)->ether_shost[i]); } printf("\n"); printf("type:\t%04x\n",ntohs(((struct ether_header *)addr)->ether_type)); break; case PROTO_IP: henkan(addr); //printf("source addr:\t%02x\n",ntohl(((struct iphdr *)addr)->saddr)); //printf("dest addr:\t%02x\n",ntohl(((struct iphdr *)addr)->daddr)); printf("ttl:\t%x\n",((struct iphdr *)addr)->ttl); printf("\n"); break; default: break; } }; //byte order変換 void henkan(void *hen){ uint8_t a[4],b[4]; for(int i=0;i<4;i++){ a[i] = (uint8_t)(((ntohl(((struct iphdr *)hen)->saddr)) >> (24-i*8)) & 0b11111111); b[i] = (uint8_t)(((ntohl(((struct iphdr *)hen)->daddr)) >> (24-i*8)) & 0b11111111); } printf("source addr:\t%d.%d.%d.%d\ndest addr:\t%d.%d.%d.%d\n" ,a[0],a[1],a[2],a[3],b[0],b[1],b[2],b[3]); } int main(int argc, char **argv) { char fname[]="test.pcap"; pcap_t *p; char errbuf[PCAP_ERRBUF_SIZE]; int pnum=0; uint8_t *packet; struct pcap_pkthdr pkthdr; p = pcap_open_offline_with_tstamp_precision(fname, PCAP_TSTAMP_PRECISION_NANO, errbuf); struct ether_header *eth; struct iphdr *ip; while ((packet = (uint8_t *)pcap_next(p, &pkthdr))) { pnum++; printf("*** packet%d ***\n", pnum); printf("length: %d\n", pkthdr.caplen); eth = (struct ether_header *)packet; print(eth,PROTO_ETHER); eth++; ip=(struct iphdr *)eth; print(ip,PROTO_IP); } return 0; }
感想
パケット解析がうまく言った時はとても嬉しくて,同じ結果しか出てこないのに何度も試してしまいました. 先輩がいなかったらできない部分もありましたが自分の手で一個意味のあるプログラムをかけ実装できたのはとてもいい経験になりました. 実際に目に見えないものを自分のプログラムで可視化させて,一個一個書かれているいみを理解しながら読んでいけるのでとても為になりました. 先輩にはこうして春休みの時間を割いていただいて本当に感謝でいっぱいです. これからも新しい範囲のlectureも行ってくれるということで楽しみにしています.
お読みいただきありがとうございました。 何かありましたら下記のtwitterでDMをくださると幸いです。
大学1年のITインターンシップ in Vietnam
ベトナムインターン
春休み皆さんは何をして過ごしましたか? 大学の長期休みは長い. そこで今回長期インターンについて調べていました. そこで見つけたのが『国際インターン』.
夏休みにサンディエゴに1ヶ月留学した僕にとって,英語を使える良いチャンスだと思いました. 説明会に行くと,そこには中国やマレーシア,アメリカなどいくつものプログラムが用意されていました. 今回参加したのは「FPT大学(ベトナム)が主催する国際インターン」です.
当記事では実際に経験した国際インターンについて書いていこうと思います.
選考の壁
申し込み用紙には3つの質問があり英語で2000単語以上で回答する必要がありました。英語の勉強は大学受験レベルだったので,そこまでの長文を書いたことがありませんでした.
なんとかその三題を答えて,次のステップは面接でした.面接も全て「英語」. 人生初の面接は英語でした(笑)
面接当日,面接官の言うことは理解できました.しかし,言葉が出ない,練習はしましたが,緊張で簡単な単語すら出てきませんでした.いまだ自分でも何を答えたかはかすかな記憶しかありません.このインターンに行ける募集人数は3人,さすがに無理,「落ちた...」としか思いませんでした.
大学の英語の授業は基本的に「読み」「書き」を重要視した授業のみ.授業にコミュニケーションとついた名前の授業もあるもののその授業で英語をつかって話すことはありません.そのレベルの授業しか受けていない自分には無理だと思いました. しかし結果は合格でした.夏休みの留学後,英語に対する意識が変わり,毎日英語に触れる生活を送っていたのは間違いなく役にたったと思います.
それに加えて,大学1年で応募したことがプラスに働いたように思いました.いまこの記事を読んでいる大学一年生は自分の1年生ブランドを有効に使うべきだともいます.
みんなが動かない時に動いて動き出したらもう動く必要のない人間になっておくべきだと思います.
FPT大学
ベトナムでお世話になった機関はFPT大学でした.
FPT大学は、ベトナム最大のソフトウェアアウトソーシング企業グループのFPTコーポレーションによって2007年1月に設立された私立大学です. 当大学の学部は、ソフトウェア・エンジニアリング、電子通信、コンピュータサイエンス、情報システムがあり優秀なSEを多く輩出しているそうです.ベトナムにある大学ですが,留学生も多く英語が堪能な生徒がたくさんいました.
インターン先
今回インターンを行なったのは『GMO VIETNAM LAB CENTER CO.ダナン支店』. GMOは今回コロナ対策にいち早く取り組んだ企業として,耳にしたことがある人も少なくないと思います.
https://www.excite.co.jp/news/article/Prtimes_2013-03-26-136-1169/?p=2www.excite.co.jp
日系企業なので従業員のほとんどが日本語の勉強をしていました. しかし主な会話はベトナム語,書類は英語,たまに日本語が飛び交う異様な空間のオフィスでした.私と従業員は主に英語を使って話し,休みの時間などは日本語を教えてあげました.一緒に働いた仲間は全員日本に興味があり,彼らが日本に来た時にはぜひ日本を案内してあげる約束を交わしました.
インターン先での業務
今回のインターンでは共同開発の基本的な部分を学ぶ事をメインとしたインターンでした.主に学んだ開発手段は
1年生のうちに共同開発の手段を実戦形式で学べることは,とても貴重な経験だったと思います.
インターン中の1日の流れ
平日
6:30 起床
8:00 仕事開始
13:00 ~ 14:30 昼食&nap time
15:30 小休憩
17:30 仕事終了
ベトナムには昼休憩にnap timeといものがありました. 寝袋を持参して電気を消してほとんどの人が眠りについていました.昼寝をすることによって,効率をあげることが目的だと言っていました.とても興味深い働き方だと思いました.しかし私には昼寝という習慣がなかったので,昼寝をすると深い眠りに入ってしまい,たまに昼休憩の時間が終了しても寝たままで,従業員に起こされたこともありました(笑) 土日は基本的にツアーと自由時間でした. FPT大学がツアーをいくつか用意してくれたので,そのツアーでベトナムの観光名所にバスで何箇所か行来ました.とても面白かったです.
感想
今回初めてのインターンを海外で行うという,基本編を飛ばしていきなり応用編をやってしまったような感じでした. 行く前はとても怯えていましたが行ってみるとなんとかなるもんだなと実感しました.
確かに慣れない言語で初めてのことを学ぶことで毎日頭がパンクしそうでした.しかしそれ以上に得られたものはとても多かったです. 実際にIT会社で働くことが初めてだったので,英語でビジネス用語など初めて聞くようなことがいっぱいありました.しかし,「それってどういう意味?」と英語で聞くことさえできれば,その単語自体がわからくても全ては解決するんだなと思いました.疑問に思ったことを曖昧に解釈するよりも,思い切って聞いてみる勇気というのが大切なんだなと思いました.
そして同じようにググる力も大切だと思いました. 毎回のタスクは道筋が書いてあり,詳細は書いてないことが多かったので,基本的にGoogle先生を頼りにしていました.最初は知りたいことがあるのに調べることができないという状況に陥りました.本当に知りたいことを教えてもらうには知りたいことをしっかり検索できるググる力というのが不可欠だと身をもって感じました.日本語検索だけではなく英語でググる経験をして,自分の中で新たな引き出しができたなという感じです.IT分野だけではなく,1ヶ月間ベトナムに住むことを通して人とどうのようにコミュニケーションを取るのか?など生きる上で大切なことも同時に学ぶこともできました.
今回は本当に色々な方にお世話になりました.この経験を生かしてこの先生きていこうと思います. そしていつか恩返しができるようになりたいと思います.
お読みいただきありがとうございました。 何かありましたら下記のtwitterでDMをくださると幸いです。