VyOSでルーターを作る

お久しぶりです。

訳あって家のネットワークを分ける必要がでてきたので、今日はVyOSを使ってルーターを作ってみます。

VyOSとは

今日の目標

トポロジ
f:id:akkkix:20170127173204j:plain
いわゆる2重ルーターです

ファイアウォール

送信元 送信先 操作
192.168.2.0/24 192.168.1.0/24 DROP

ポート開放

受信ポート 送信先 送信ポート
1234 192.168.2.2 22

インストール

https://vyos.io/
stableをダウンロードしました。(v1.1.7)

イメージから起動し、ログインします。

install image

インストールが始まるので少し待ちましょう。

インターフェイスへのIPアドレスの割当

インストールが終わったら、起動させてログインします。

configure

設定モードへ入ります。
eth0を192.168.1.2/24、eth1を192.168.2.1/24にします。

set interfaces ethernet eth0 address 192.168.1.2/24
set interfaces ethernet eth1 address 192.168.2.1/24

NATの設定

外部側がeth0、内部側がeth1です。

set nat source rule 1 outbound-interface eth0
set nat source rule 1 source address 192.168.2.0/24
set nat translation address masquerade

これで192.168.2.0/24内のホストがNATされて192.168.1.0/24側に出られるようになりました。

デフォルトゲートウェイの設定

このままでは192.168.2.0/24側のホストはインターネットに出られません。
次に経由するルーター(トポロジのPR-S300NE)を指定します。

protocols static route 0.0.0.0/0 next-hop 192.168.1.1

※systemのgateway-addressでも設定できるみたいです

set system gateway-address 192.168.1.1

ファイアウォールの設定

今回は192.168.2.0/24から送信されたパケットの宛先が192.168.1.0/24だった場合のみDROPします。

set firewall name private-public default action accept
set firewall name private-public rule 1 destination address 192.168.1.0/24

お好みでログを設定します。

set firewall name private-public rule 1 log enable

インターフェイスファイアウォールを設定します。

set interfaces ethernet eth1 firewall in name private-to-public

ポート開放

内部のホストにsshできるようにしておきます。

set nat destination rule 1 inbound-interface eth0
set nat destination rule 1 protocol tcp
set nat destination rule 1 destination address 192.168.1.2
set nat destination rule 1 port 1234
set nat destination rule 1 translation address 192.168.2.2
set nat destination rule 1 port 22

2重ルーターになっているのでインターネットからアクセスしたい場合はインターネットに接続しているルーターもポート開放します。

VyosにSSHで接続できるようにする

面倒なのでSSHでどこからでもVyOSを設定できるようにします。

set service ssh port 22

NTPの設定

ログ等に正確な時間が記録されるようにVyOSをNTPで時刻合わせします。

set system ntp server ntp.jst.mfeed.ad.jp

DNSIPアドレスの設定

DHCP等は特に設定していないのでホスト名を解決できるようにDNSを設定します。

set system name-server 8.8.8.8

設定の反映と保存

設定を変更したら忘れずに

commit
save

やりましょう。

静的ルーティングの設定

最後に192.168.1.0/24から192.168.2.0/24にアクセスできるように静的ルーティングを設定しておきます。
(PR-S300NEの例)
f:id:akkkix:20170127184035j:plain

まとめ

ネットワークの勉強がてらVyOSでルーターを作ってみましたが案外簡単に設定できて拍子抜けでした。
BGPやOSPF等にも対応しているそうなので別の機会にそちらも試してみたいです。
わざわざ高いルーターを買わなくてもこのような形で勉強できるのは素晴らしいと思います。

RTX1000のIPアドレス割り当てとファームウェア更新

ちょっと前のことですが某所でRTX1000を買いました。

(下のやつです)

IPアドレスの設定

初期状態ではIPアドレスを持ってないので設定にはコンソールケーブルかRARPIPアドレスを設定して上げる必要がある。

コンソールケーブルなんて持ってないのでRARPIPアドレスを設定することにした。

早速手持ちのPC(ArchLinux)でrarpdを動かそうとしたらよくわからないエラーがでてこけるので仕方なくArchのインストールメディアを引っ張り出してきてRARPを動かしたところ無事IPアドレスが設定された。

f:id:akkkix:20160626200943p:plain

> vim /etc/ethers
00:A0:DE:xx:xx:xx xxx.xxx.xxx.xxx
> rarpd -dvae

ここでRTX1000を起動するとIPアドレスが割り当てられる

早速telnetでログインして管理者権限へ

> telnet xxx.xxx.xxx.xxx
> administrator

文字化けしまくってるので文字コードをASCIIにしておいた。

> console character ascii

忘れないうちにIPアドレスを設定しておく

> ip lan1 address xxx.xxx.xxx.xxx/xx

保存

> save

ファームウェアの更新

YAMAHAのサイトで確認したところ、ファームウェアが最新ではなかったのでファームウェアも更新しておく。

http://www.rtpro.yamaha.co.jp/RT/firmware/index.php

ファームウェアのアップロードには RT-Tftp Client という便利なソフトがあったのでありがたく使わせてもらった。

http://www.rtpro.yamaha.co.jp/RT/utility/rt-tftp.html

f:id:akkkix:20160626185413p:plain

ファームウェアを指定しアップロードしたところ…

f:id:akkkix:20160626185423p:plain

なぜか「転送は失敗しました」と出てかなりヒヤッっとしたが無事アップデートされた。

f:id:akkkix:20160626201228p:plain

セキュリティキャンプ2016の応募用紙

セキュキャン何故か受かりました。クソ雑魚なので当日に向けて精進します。

 

締め切り前の土日で急いで書いたので日本語がおかしいところがあるかもしれないですが、せっかくなので無知を晒したいと思います。応募用紙と簡単に問題を解いた感想を書いておきます。

 

来年以降応募する人の参考に少しでもなれば幸いです。

続きを読む

C言語の関数の引数の評価順序

あらすじ

( ^o^)<ショートコーディング楽しい!
( ^o^)<よーしprintfの引数の中でポインタの参照とインクリメント同時にやっちゃおう!
(;^o^)<あれ…期待した通りに動作しないぞ…
( ˘⊖˘) 。o(待てよ、引数の評価順序ってどうなってるんだ)
|C/C++|┗(☋` )┓三
( ◠‿◠ )☛未定義だ
▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああああああ


C言語の関数の引数の評価順序に見事に引っかかった。
C言語では関数の引数の評価順序は未定義で処理系によって異なるらしい。
そこで、ちょっと気になったので手元で使えるGCCとVisualStudioで検証してみることにした。

検証コード

#include <stdio.h>
int a;
int func(int arg){
  a=arg;
  return arg;
}
int main(void){
  printf("%d %d\n",func(1),func(2));
  printf("a:%d",a);
  return 0;
}

関数funcに渡された引数を変数aに入れてから引数をそのまま返します。
その後2行目に変数aを出力します。
出力された変数aが1だったら右→左の順、2だったら左→右の順になります。

実行結果

GCC6.1.1場合

1 2
a:1

VisualStudio2015場合

1 2
a:1

どちらともaの値は1になっており引数の評価は右→左の順で行われている様です。

まとめのようなもの

結果はどちらとも右から左だったので普通は右から左に評価されてくのでしょうか。
どちらにしろ未定義とのことなので使わないほうがいいんですが、知っておくと何か役に立つのかもしれないですね。
あとは左から右に評価されてく処理系とかあったりするのか気になります。
その辺も含めて又の機会にもうちょっと詳しいところを調べてみたいと思いました。


参考
引数として関数を渡したときの実行順序 - mooz deceives you
BohYoh.com-C/C++ FAQ 関数に渡される実引数の評価順序はどうなっていますか。
javaの場合は左から右に統一されているんですね。
引数の評価順序 - Togetterまとめ
↑(x=3)+(x+4)の様な部分式の場合も同じようなことになるみたいです。

P.S.
今日外を歩いてたら鳥の糞が直撃しました
すごくつらいです

運賃表示器を買った

お久しぶりです。
だいぶ前に某鉄道イベントで運賃表示器を購入してしまいました。

制御方法が分からずしばらく放置していたのですが、久しぶりに動かしてみようと思ったので色々書こうと思います。
ハードウェアに関する知識は皆無にほぼ等しいので間違っている点等があるかもしれませんがお許しください。

正攻法的に運賃表示器の入力線を使う→挫折

この運賃表示器はどうやらレシップという会社の製品のようですがgoogle先生に聞いてもはっきりとした答えが出てこない。
調べ方が悪いのかもしれませんがこの手のものは情報が出て来辛いと思ったのでここであっさりと諦めました。
(ここまで去年)

(ここから今年)
久しぶりに運賃表示器を眺めてたらすすのようなもので隠れている型番のシールを見つけた。早速検索してみるも情報がない。
f:id:akkkix:20160328212939j:plain 諦めてから結構月日が流れ気づいたら三月になってた。再び動かしてみようと言う気持ちになり、情報収集をしてみる。 そういえばこれ由利高原鉄道のやつだったよなぁ思い、適当に調べてみた。

運賃表示器の在りし日の姿がみつかる

由利高原鉄道YR-1500形
こことか

この動画の00:58らへんとか

この動画の00:36らへんとか

上部のマトリクスLED、赤緑の2色だったんですね。ずっとオレンジの単色だと思ってました。

マトリクスLEDの部分だけでもうごかせないか

運賃表示器の情報を収集してるときに見つけた動画を思い出した。


京急2100形の車内LEDを動かしてみた

京急ファミリー鉄道フェスタ2014で購入した2100形の車内LEDをArduin­oで制御してみました。 制御方法が不明なためLEDモジュール自体を制御しています。

なるほど、制御方法分からないしいっそのことマトリクスLED単体で動かしてみるのもありかもしれない。
早速マトリクスLEDを取り外してみた。

わからん

とりあえずgoogle先生に聞いたらマトリクスLEDの制御にはダイナミック制御と言うものがあるらしい。
んで制御にはシフトレジスタが使われるとのこと。確かにマトリクスLEDの基板にはシフトレジスタ(TB62706)が使われていた。
入力端子に何を入れるか分からないとどうしようもないのでまたgoogle先生に聞いてみた。

基板の解析
なるほど、基板の解析ってそんなに難しくない?とりあえずやってみよう。

ドライバ基板(?)とマトリクスLEDの本体を外して

ICの役割を調べてひたすらパターンを追いました。かなり地道な作業でしたがとりあえずなんとかなった。
行の指定に3-8デコーダー(74HC238A)、一列の点灯パターンの指定に16ビットシフトレジスタ(TB62706)が使われているっぽい。

ここまで分かれば後は簡単でそれぞれのICの挙動を調べてarduino等で制御するだけ。
適当にプログラムかいて動かしてみた。

動いた!!

多分続きます。

C言語でピラミッドを作る

C言語のfor文でビラミッド型にアスタリスクを出力するプログラム。

学校の授業でハマる人が多かったので、アスタリスクと空白の数について簡単に解説してみる。

コード

 実行結果

f:id:akkkix:20150919220619p:plain

解説

まずはピラミッドを構成しているアスタリスクの数について考えます。

行数と関連付けて考えることが大事そうです。

アスタリスクの数は1行目は1個、2行目は3個、3行目は5個...となっています。

つまり奇数ですね。

奇数は「n×2-1」で表すことができるので、

アスタリスクの数=行数×2-1

となります。

これをコードにすると9行目から11行目の様になります。

 

次に空白の数を考えます。

空白の数もアスタリスクの数と同じように行数と関連付けて考えると、

空白の数=全体の行数-行数

となっていることがわかります。

これをコードにすると6行目から8行目の様になります。

 

以上です。

 

/*

上のコードのどこかを変えると逆三角形になったり、何行出力するか変えられたりできるよ。わかった人はやってみてね。

*/