DHCPとDNSだけRTX1100に任せたい

YAMAHAルーター Advent Calendar 2017 - Adventar  - 8日目

みなさんYAMAHAルーター使っていますか。
師走とはよく行ったもので、とても忙しくてうっかり遅刻してしまいました(言い訳)

今日はRTX1100をDHCPDNS専用機として使ってみたいと思います。

 はじめに

なぜ、RTX1100をDHCP/DNS専用機にするかというと、もっともな理由があります。

我が家では特に3つ目、当時使用していた「無線LANルーター(AtermWR8600N)」ではDHCPのアドレス数が32までしかなく、家電ネットに繋がったりや個人でスマホやPCを持つようになった昨今、一瞬で使い尽くしてIPアドレスが降って来なくなりました。

今回は以下のような構成になるように設定していきます。

項目
ip 192.168.100.2
上位のDNSサーバー 8.8.8.8
ローカルドメイン(※1) local
DHCPアドレス範囲 192.168.100.100~192.168.100.199

※1 ローカルドメインを設定すると、名前解決に失敗した場合にここの値を補完して再度問い合わせするようになる。例えばクライアントが「server1」で名前解決に失敗した場合は「server1.local」で再度問い合わせを行う。

初期設定

DNSDHCPの設定始める前に、最低限の設定をしましょう

ip route default gateway 192.168.100.1
ip address lan1 192.168.100.2/24

DNSの設定

まずはDNSの設定をしましょう。
個人的には家の中にDNS(キャッシュ)を置くことで、WANへのDNSのリクエストの削減もそうですが、何より簡易DNSサーバ機能でLAN内のサーバーの名前解決を気軽にできることにメリットを感じています。

dns service service # DNSサービスを使う
dns server 8.8.8.8 
dns domain local # ローカルドメイン
dns service fallback on # IPv6使うのならon

また、静的にDNSのレコードを追加するときは次のようにします。
例: 192.168.100.201server1.localを割り当てる

ip host 192.168.100.201 server1.local

DHCPの設定

最低限DHCPを使うには次のようにします

# dhcp service server
# dhcp server rfc2131 compliant except remain-silent
# dhcp scope 1 192.168.100.100-192.168.100.199/24
# dhcp scope option 1 dns=192.168.100.2 # これを設定しないと8.8.8.8が通知される

サーバーなどにDHCP側から固定したい場合は次のように設定します
例: サーバー(macアドレスxx:xx:xx:xx:xx:xx)に192.168.100.201を割り当てる

dhcp scope bind 1 192.168.100.201 xx:xx:xx:xx:xx:xx

DHCPは他に細かなoptionがあるので詳細は公式サイトを見てください。
http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/dhcp/dhcp_scope_option.html http://www.rtpro.yamaha.co.jp/RT/FAQ/TCPIP/dhcp-scope-option.html

ルーター買ってネットに繋ぐまで

YAMAHAルーター Advent Calendar 2017 - Adventar  - 1日目

みなさんYAMAHAルーター使っていますか。
もうすぐクリスマス、まだ持っていない方は自分のご褒美に是非購入しましょう。

さて、タイトルにあるように今回はそんな購入間もない方が「買ったら何すればいいの」を書いていこうと思います。
今回は手元にRTX1100(古っ)があって検証が楽なので、これを前提に進めていきます。

 はじめに

まず、ネットに繋ぐために必要なもの(物理)を考えます。

  • RTX1100
  • プロバイダからもらうアカウント情報(PPPoE)
  • LANケーブル

本当はコンソールケーブルなども欲しいですが、今回は「とりあえずルーター買ったぜヒャッハー!!」って人向けに行こうと思います。

ルーターにログインしてみよう

PCとRTX1100をLANケーブルでつなぎます。
そして、RTX1100を裏返すとそこにMACアドレスが書いてあるので、それを使ってリンクローカルなアドレスを作ります。

www.itbook.info

そしたら、telnetコマンド(windowsの場合は機能の有効化しないと使えないかも)を使って接続します。

telnet FE80:0000:0000:0000:AAAA:AAFF:FEAA:AAAA

Password:と出てきたら何も入力せずにエンター、その後なんかゴニョゴニョ出てくれば成功です。
※ちなみにRTX1200とかそれ以降は初期化すると192.168.100.1のアドレスが割り当てられているので、それでtelnet接続できます。

セットアップしてみよう

まず、ネットに繋ぐために必要なもの(機能)を考えます。

これらをセットアップしていきます。

まずは管理者ログイン こちらもパスワードは何も入力せずにエンター

> administrator

IPアドレスの割当

# ip route default gateway pp 1
# ip lan1 address 192.168.100.1/24

PPPoE

# pp select 1
# pp always-on on
# pppoe use lan3
# pp auth accept pap chap
# pp auth myname [プロバイダからもらったID] [プロバイダからもらったパスワード]
# ppp lcp mru on 1454
# ppp ipcp ipaddress on
# ppp ipcp msext on
# ppp ccp type none
# ip pp mtu 1454
# ip pp nat descriptor 1
# pp enable 1
# pp select none

NAT

# nat descriptor type 1 masquerade

DHCP

# dhcp service server
# dhcp server rfc2131 compliant except remain-silent
# dhcp scope 1 192.168.100.100-192.168.100.199/24

疎通確認

ここまで設定終わったら、LAN3とONUをつなぎます。
LAN1→PC
LAN3→ONU
の状態にして、PCからping 8.8.8.8ping google.comをやって帰ってきたら成功です。

追記

macアドレスからipv6アドレス作るの地味に面倒だったので、雑にコード書いてみた。
ブラウザのコンソールにコピペ&エンターして、generateAddress("XXXXXXXXXXXX")(カッコ内は文字列のMACアドレス)って叩けば多分アドレスになる。

const generateAddress = (mac) => {
    const t = mac
        .split("")
        .reduce((a, b) => a.concat(parseInt(b, 16).toString(2)), [])
        .map(e => ("0000" + e).slice(-4))generateAddress
        .map((e, i) => i === 1 ? e.replace(/(?:.{2})(.)+?/,Math.pow(e[2] - 1, 2)+"") : e)
        .map(e => parseInt(e,2).toString(16))
        .toString()
        .replace( /,/g,"");
    return `FE80:0000:0000:0000:${t.substring(0,4)}:${t.substring(4,6)}FF:FE${t.substring(6,8)}:${t.substring(8)}`.toLocaleUpperCase();
};

Elasticsearchを使ってみた

twitterを見ていたら、こんなTLが流れてきました

見ててなんとなくこれまでzabbixとかでやりたいと思ってたことの代わりにできそうな気がしてきたので、触ってみることにしました。 ※zabbixはすでに挫折している

ただ、そもそもデータとして何を集めるかってことですので、とりあえず手元にあったRPi3とBME280で温度とってみることにしました。

目次

  1. RPiのセットアップ
  2. ELK(Elasticsearch+Logstash+Kibana)のインストール
  3. Logstashの設定
  4. その他

環境

  • 温度湿度気圧の取得
    RaspberryPi3(Raspbian)+BME280
  • ELKサーバー
    ProxmoxのContainer(Ubuntu16.04)

1. RPiのセットアップ

方針としては、httpでリクエスト投げるとjsonで情報取得できるといいなと思います。
とりあえず、温度とか取るためにこの記事を参考にして標準出力にcsvで情報を出せるようにしました。 karaage.hatenadiary.jp

ただ、自身の技術力の問題で「python書けない」&「node.js使ってもセンサー情報を取得できない」ことがよくわかったので、node.jsからpythonを呼び出す感じでソースを書きました。
github.com

これで、温度の取得はOK

2. ELKのインストール

困った時のbitnami bitnami.com ドキュメント丁寧に書いてあったので、さくさくっとインストールできました。

3. Logstashの設定

logstashの設定はここにインストールされる
installdir/logstash/conf/
のでいい感じに書いて配置しました。

input {
  http_poller {
    type =>"http_poller"
    urls => {
      service => {
        method => "GET"
        url => "http://hostname" # 温度取得してるサーバのurl
      }
    }
    request_timeout => 60
    interval => 60
    codec => "json"
  }
}

output {
  if [type] == "http_poller" {
    elasticsearch {
     hosts => ["XXX.XXX.XXX.XXX:9200"] # elasticsearchのIP
     document_id => "%{logstash_checksum}"
     index => "get_sensor_data-%{+YYYY.MM.dd}"
    }
  }
#  stdout { codec => rubydebug }
}

んで、実行
logstash -f kibana.conf

4. その他

ここまでくれば、kibanaにアクセスすればデータが入ってるのがわかるのでムフフできます。あとはそのデータでグラフ書いたりして遊びましょう。 ちなみに、部屋の温度を測ってみたらこんな感じになりました。 f:id:kam1nchu:20161217182602j:plain

ハマったところとか

  • logstashコマンドが起動しない
    bitnamiでインストールするとinstalldir内にJavaが配置されるので、JAVA_HOMEとかのパスをそこに指定した
  • logstashがバックグラウンドで動かない
    まだやり方がわかってないので、screenコマンド(仮想端末)内で実行してます
  • http_pollerプラグインでscheduleが使えない
    bitnamiでインストールした時のhttp_pollerのバージョンが古いみたい。intervalで対応できた。
  • RPi3の無線LANが死ぬ
    最初は無線LANでやってましたが、半日くらいで切れてしまうので、結局有線LANでやっています。。
  • 情報が少ない
    特にlogstashの情報が少なかったです。ていうか英語ばっかでした。読めるようになろう英語!!

おわりに

ほとんどネット記事とか公式のドキュメントに沿ってやっただけで大したことしてないのに、それっぽいものができてなかなか楽しかったです。 Zabbixと違い、あくまでデータの分析がメインになるのでそのシンプルさが逆にとっつきやすくなってとてもいいなと感じました。 見た目もイケイケですしね。 温度の取得をできるようになった後に、RTXのsyslog分析とかもやりましたが詳細についてはまた次回にしたいと思います。

butimi.liクローンのクローンを書いた

トゥイッター見てたらbutimiliクローン書いてる人がいた。

utgwkk.hateblo.jp

 

なので、node.jsの練習兼ギッハブ練習を兼ねてブチミリしてみた

github.com

 

まだローカルでしか動作確認してないけど、もう眠い。

そのうちREADME書きます。おやすみ。。。。

 

 

参考になりました

www.nodebeginner.org

Javaのコメントの書き方の話

ソースレビューしてたら先輩社員とコメントの書き方について揉めた意見の交換ができたので、その話。

背景

外注の方が、プロジェクトにアサインされて実装をお願いすることになったのですが、当然最初なので少し実装をしてもらったところでソースレビューを行いました。 その時に、たまたま聞こえる範囲にいた先輩が覗きに来て、そのまま2人でレビューをしました。 その中で、(色々とあるにはありますが中でも)特にコメントの書き方で意見が別れたので書いてみます。

コメントを書く粒度

  • 先輩
    すべての処理(行)にコメントを記述すべきだ。

  • 自分
    変数名やメソッド名などで処理の内容がわかるなら不要。

設計書の内容

  • 先輩
    書くべき。設計書の変更を行う際にソースコードのどの位置を変更すればいいのかわからんくなるから。

  • 自分
    書かないべき。設計書の変更があった際にソース上のコメントを変更し忘れた際に、どっちを信じたらいいのかわからなくなる。コメントのメンテナンスコストもバカにならない。

変更履歴

  • 先輩
    書くべき。不具合発生時などにそのコメントが役に立つこともある。

  • 自分
    書かないべき。ソースファイルはソースコード書くところであって、履歴はSVNのコミットログを使うべき。

コメントのないコードは

  • 先輩
    (例外なく)糞。

  • 自分
    (読めるなら)美しい。

お互いの主張

  • 先輩
    ソースを触る人間はPGだけじゃなくて、ソースが読めないSEやPMの場合だってある。その場合にコメント無しでどうやって修正などするんだ。

  • 自分
    コメントは実際に動作する処理とは無関係で、触らなきゃいけないのはソースそのもの。コメントが多いとその分ノイズとなって修正すべき箇所が見つけにくくなる。

考察?

お互い立場も違うので意見の相違はあるとは思うし、確かにソースが全く読めない人間からしたらコメントはあったほうがいいのかなぁ。
(なんでソース全く読めない人間が触る想定なんだよ)

ゲストLANを構築してみた

RTX1100と今流行の小型PC?の一種pcDuino(RaspberryPi見たいなやつ)使ってゲストLANを構築してみました。
今回ゲストLANに求める要件としては以下

  • ゲストLANはサブネットを分ける
    →今回はルータを挟むことにしました
  • ゲストLANは別に速くなくてもいい
    →なので100Mbpsで十分
  • ゲストには横着なことされたくない
    →通信をhttpとhttpsに制限して、なおかつproxy経由以外で通信できなくする

要件を満たすための今回設定したことを、備忘録的につらつらと書いていこうと思います。
ただし、結論から書くと、RTXの設定でわからなかった(思い通りいかなかった部分もある)のでそのへんご了承願ます。 フィルター難しい・・・。

RTXの設定

RTX側でやらせたいことは、すごく簡単にまとめちゃうと「proxyのwebな通信以外を禁止する」ことです。
ただ、最初は通信を完全に遮断したのですが、それやったらurlフィルター動かなくなったので許可しちゃってます。
また、そのurlフィルターもhttpの時は動くのですが、httpsの時動かなくてうーん。 まぁ、実際の設定を貼っつけたほうがいいと思うので貼っつけます。

ip route default gateway 192.168.128.1
ip lan1 address 192.168.132.1/24
ip lan1 secure filter in 100 101 102 103
url lan1 filter in 100 101
ip lan3 address 192.168.128.7/24
ip lan3 nat descriptor 1
ip filter 100 pass 192.168.132.2,192.168.132.100-192.168.132.191 * tcp * www,https
ip filter 101 pass * * udp * dhcps
ip filter 102 pass * * udp * domain
ip filter 103 pass * * icmp * *
ip filter 104 reject * * * *
nat descriptor type 1 masquerade
nat descriptor timer 1 protocol=tcp port=www 120
nat descriptor address outer 1 primary
nat descriptor address inner 1 auto
nat descriptor masquerade session limit 1 1 200
url filter use on
url filter port 80 443
url filter reject redirect http://proxy.local/block.html
url filter 100 pass * 192.168.132.2
url filter 101 reject * *
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.132.100-192.168.132.191/24 gateway 192.168.132.1
dhcp scope option 1 dns=192.168.132.1 252=68,74,74,70,3a,2f,2f,70,72,6f,78,79,2e,6c,6f,63,61,6c,2f,70,72,6f,78,79,2e,70,61,63
dns server 8.8.8.8
dns cache max entry 1024
dns private address spoof on
ip host proxy.local 192.168.132.2
schedule at 1 */* *:00 * ntpdate ntp.nict.jp
  • フィルターの設定
    内容、かなり未熟だと思う。。
    ここに書きながら「こうすればいいのになんで?」ッて思う箇所あるけど、実際こうやって設定ましたっていうのを正直に載せます。
ip lan1 secure filter in 100 101 102 103
url lan1 filter in 100 101
ip filter 100 pass 192.168.132.2,192.168.132.100-192.168.132.191 * tcp * www,https // ホントは192.168.132.2だけにしたかたんだけど、urlフィルタうまく動かなかった
ip filter 101 pass * * udp * dhcps // dhcp動かしたかった
ip filter 102 pass * * udp * domain // dns動かしたかった
ip filter 103 pass * * icmp * * // ping使いたかった
ip filter 104 reject * * * * // 使いたかった奴以外を使いたくなかった
url filter use on
url filter port 80 443 // httpsが動かねー!!
url filter reject redirect http://proxy.local/block.html 
url filter 100 pass * 192.168.132.2 // プロキシ以外からのwebアクセス禁止
url filter 101 reject * *
dhcp scope option 1 dns=192.168.132.1 252=68,74,74,70,3a,2f,2f,70,72,6f,78,79,2e,6c,6f,63,61,6c,2f,70,72,6f,78,79,2e,70,61,63
  • DNSの設定
    proxy.pacの配布にローカル用の名前解決させないといけないかなーって思ったので
dns cache max entry 1024 // キャッシュ増やせばそれだけ上位の負荷減るかなーって
dns private address spoof on // 要るか要らないかわからなかった・・・
ip host proxy.local 192.168.132.2 // プロキシサーバを設定
  • NATの設定
    NATの設定の仕方調べてたら、NATテーブルを使い過ぎないようにする設定があったので、その辺もノリで設定しました。
nat descriptor type 1 masquerade
nat descriptor timer 1 protocol=tcp port=www 120 // NATテーブルの保持時間をデフォルトの15分→2分に!?
nat descriptor address outer 1 primary
nat descriptor address inner 1 auto
nat descriptor masquerade session limit 1 1 200
  • その他
    なんか設定中にルータの時間が1980年になってたので、勢いで時刻の同期設定
schedule at 1 */* *:00 * ntpdate ntp.nict.jp

pcDuinoの設定

pcDuinoってなんぞやって人はこのサイト読んで下さい。
http://www.linksprite.com/linksprite-pcduino1/
中身は普通にlubuntuなので、こいつにsquid3とproxy.pac配布用にnginxをインストールしました。

  • ウザいネットワークマネージャの削除
$ sudo apt-get remove network-manager
  • 固定IPの設定
    /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.132.2
network 192.168.132.0
netmask 255.255.255.0
broadcast 192.168.132.255
gateway 192.168.132.1
dns-nameservers 192.168.132.1
  • squid3のインストール
$ sudo apt-get install squid3
  • squid3の設定
    /etc/squid3/squid.conf(抜粋)
# ポート
http_port 3128

# これやんないと使えないのでアクセス許可
acl localnet src 192.168.132.0/24
http_access allow localnet

# プロキシ経由を隠す
forwarded_for off

request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
reply_header_access X-Forwarded-For deny all
reply_header_access Via deny all
reply_header_access Cache-Control deny all

# キャッシュ増やす
cache_mem 256 MB
maximum_object_size_in_memory 2048 KB
maximum_object_size 64 MB
  • squid3の再起動
$ sudo service squid3 restart 
  • nginxのインストール
    なんとなく、公式?リポジトリを追加してます。
$ wget -O - http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
$ sudo sh -c 'echo "deb http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list'
$ sudo sh -c 'sudo echo "deb-src http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list'
$ sudo apt-get update
$ sudo apt-get install nginx
$ sudo service nginx start
$ sudo update-rc.d nginx defaults
  • proxy.pacの配置
    よくわからなかったのでテキトーに書いちゃいました
    /usr/share/nginx/www/proxy.pac
function FindProxyForURL(url, host) {
    if ( isInNet(host, "192.168.132.0"   , "255.255.255.0"  )
    || isInNet(host, "127.0.0.0"  , "255.0.0.0"  ) )
        return "DIRECT";
    else
        return "PROXY proxy:3128";
}
  • MIME-typeの設定
    いるかどうかわからんけど、一応
    /etc/nginx/mime.types(追加)
application/x-ns-proxy-autoconfig       pac;
  • リダイレクトの時のページの配置
    ついでのRTXでurlフィルターでrejectされた時のページをmarkdownをpandocで変換して作成して、配置しました。
    /usr/share/nginx/www/block.html

所感

今回、やりたいことは大体出来たかと思いますが、RTXのフィルターがかなり甘いのと、urlフィルターがhttpsなページでうまくリダイレクトかからないのが残念です。
ルーター設定はやっぱり難しいですね!!

あと、日頃markdown書くときはVSCode使ってますが、はてなブログへ投稿するとめちゃくちゃ崩れちゃって使いにくい!!
何かいい方法ナイカナー

RTX1100を買ってみた

RTX1100を買ってみたので記事にしてみます。

そもそもなんでRTX1100かというと、速い!安い!うまい!からです。 残念ながら速度は100Mbpsで速くはないのですが、ヤフオクめぐりしてれば2k+送料で買えちゃいます。

auctions.search.yahoo.co.jp

その上、普通に超高機能なのでうまい!という中々おすすめな一品です。

今回は少々もったいないですがこのRTX1100をDHCP専用サーバとして使うために設定をしたので、メモ書きとして残します。

目次

  • FW更新作業
  • DHCPの設定
  • まとめ?

FW更新作業

中古で買ったのでサクサク更新作業を行います。(8.03.91(build 6)→8.03.94)

更新はtftpとかで新しいFWを送ってもいいですが、失敗怖いしなんか面倒くさそうなので、httpコマンドを使います。

ただ、そのためには最低限インターネットの海に繋がないといけないので、そこから始めます。

ちなみに、このやり方で更新作業を行うと設定全部消えますのでご注意を。(消えない方法があるかどうかは調べてません)

// 外と通信するための一時的な設定
# ip lan3 address 192.168.0.50/24
# ip route default gateway 192.168.0.1
# dns server 8.8.8.8

// FW更新するためのコマンド
# http revision-up permit on
# http revision-up go

DHCPの設定

今回の一番の目的なDHCPの設定を行います。

# ip lan1 address 192.168.0.253/24
# dhcp service server
# dhcp server rfc2131 compliant except remain-silent
# dhcp scope 1 192.168.0.100-192.168.0.191/24 gateway 192.168.0.1
# dhcp scope option 1 dns=8.8.8.8

とりあえず我が家はこんな感じに設定しました。

中身についてチョロと解説します(間違ってたらごめんなさい)

  • dhcp server rfc2131 compliant except remain-silent
    DHCPのRFC2131に対応させるコマンドらしいです。
    ただ、あんま詳しく調べてなかったので、今のところはDHCP使う時のおまじないッて感じです。

  • dhcp scope 1 192.168.0.100-192.168.0.191/24 gateway 192.168.0.1
    DHCPを割り当てる範囲を指定できます。
    それとどのgatewayを使うかも指定できるみたいです。
    scopeの後ろの数字を変えることで幾つかのスコープを設定できますが、インターフェースのアドレスとの一致が必要みたい?

  • dhcp scope option 1 dns=8.8.8.8
    これ面白いなと思ったのですが、dhcpってIPアドレスとかgateway以外にも色々通知できるみたい。
    今回はDNSサーバのアドレスだけ通知してますが、他にも色々指定できるそうです。

FAQ for YAMAHA RT Series / TCP/IP
winsとかプロキシとかその辺の通知が便利そう

まとめ?

今回はDHCPだけ設定しましたが、せっかくのRTX1100なのでこれからちょっとずつ設定増やしていって便利に使っていこうと思います。
また、うまくいったら記事にしていきたいと思います。

YAMAHAルーター楽しい!!