Archive for the ‘技術メモ’ Category

v6プラス固定IP ヤマハルーター編

どうも、imo@入江です。
前の記事からつながるお話です。
読んでない方はぜひ導入の紆余曲折からどうぞ→https://lowfreq.info/archives/23625

サーバー側ネットワークを11/3にv6プラス固定IPに変更した際、IX2105だと160Mbpsくらいで頭打ちというお話をしました。
繋がりましたしレイテンシもいい。
ですがその速度では物足りなかったのです。

ということで、RTX830買ってきました。
こらえ性がないから仕方ない。
RTX830はARM系1.33GHzのデュアルコアCPUです。
PowerPC系とは単純な周波数での比較はできませんが、webで他の方の記事を見る限り速度出そうだなーと。

で、設定していきます。
ヤマハのサイトにIPIPトンネリングとしてコンフィグ例が載っています→コンフィグ例
ですが、こちらについてはIPv6パススルー設定がありませんので他の設定とミックスして噛み砕く必要があります。

他の設定について、v6プラスをご利用の他の方がいくつか設定例出してくださっていますが、
オープンサーキットさんがそのものズバリな設定例を記載してくださっています。
https://www.open-circuit.ne.jp/isp/settei/v6direct-rtx1210-ip1.html
設定例の中の”v6direct-rtx1210-config-ip1-filter.txt”を元にするのがいいでしょうか。
RTX1210向け設定なのでLAN3がWANになっています。
RTX830ではLAN3→LAN2に読み替えてください。

また、プレフィックス変更時、IX2105はddnsコマンドで更新をかけていましたがRTX830には汎用のddnsコマンドはありません。
そのため、Luaスクリプトで更新をかけることになります。
これは上記ヤマハサイトのほうのコンフィグ例を参考にするのがいいと思います。

私はRTX1100以来のヤマハルーターだったのでなかなか思い出せず勝手が掴めませんでした。
IX2105と比較したとき、現在のヤマハルーターにはコンソール上でコンフィグをまっさらにして設定する機能はないようです。
コンフィグをまとめて入れる場合はtftpを使います(設定中に思い出しました)
tftp putの際、clear configurationを入れておくと何もない状態に設定を入れることができます(これがないと追記になります)。
最近のファームバージョンでtftp getでコンフィグを吸い出したときには記載がないので、覚えておくと便利です。

設定して運用してみると、夜中1時前で下のスループットが出ました。

本当にフレッツ回線なんですかね…

速度もですがPINGが2msというのが驚愕です。
今まで一般回線で2msはNUROでしか見たことありません。
これがv6プラスの実力なんですね。

また、CPU使用率についてもIX2105とは大きく違う挙動です。
RTX830では、上記測定中でもCPU使用率コア1-63%、コア2-14%が最高値でした。
IX系と比べて負荷はかなり低いです。
サーバー公開用にフィルタやnat設定も入れてこれなので、余裕がありますね。

ということで、自宅回線の安定化、高速化もひと段落しました。
新しいルーターは設定してると楽しくなります。

Posted: 2018-11-08
at 23:32 by 入江 萌乃


Categories: サーバー,技術メモ

Comments: No comments


v6プラス固定IPのあれこれ

どうも、imo@入江です。
先日告知しましたIPアドレス変更は本日朝に完了しました。
ご協力ありがとうございました。

後日談があります。

現在フレッツ光の回線を利用していますが、POIに起因する混雑時間帯のレイテンシ悪化が酷かったので根本的な解決をしたかったのです。
そこでJPNEのv6プラス固定IPサービスを利用することにしました。
設定の際にあった紆余曲折を備忘録として書き起こしておきます。

v6プラス固定IP自体の特徴を簡単に書くと
・付与IPアドレスは占有となり、ポートの制限はなし
・IPv4アドレスは固定だがIPv6アドレスは半固定、ONU等の変更で変わる可能性がある
・対応ルーターはHGW、もしくはヤマハRTX/NVR系やNEC IX系等の業務向け機種
・JPNEのBRに対してトンネルを張って利用する
というものです。

■ルーター側のコンフィグ
利用したのはNECのIX2105、今まで別ISPのPPPoE終端で利用していたものです。
NECのサイトに設定ガイドがあるので比較的敷居が低いのですが、
記載コンフィグの対象ファームバージョンが記載されていないのでコマンドリファレンスと見比べる必要があります。(後述)

>設定ガイド

当初利用した個体のファームは9.1.10
一部相違はあるもののだいたいは設定ガイドのコンフィグで通ります。
ですが、proxy-dns ip enable request bothだけは通らず。
というのも、request bothはファーム9.2台から実装されているようで、9.1台にはv4とv6に同時に転送する機能はないようです。
また、記載コンフィグ上ddns内のsource-interface BVI0も、9.1ではsource BVI0となります。
一部書き換えることで9.1.10でもトンネル接続可能です。

その後、10.0.14の個体にしてみましたら今度はrequest bothが別行への記載に変更になっていました。
以上から、設定ガイドのコンフィグはファーム9.2~10未満が対象のようです。

あと、ISPから提供される情報にインターフェイスID、IFIDがありますが、
IFIDの表記がxxxx:xxxx:xxxx:xxxxとなっていることがあります。
IXシリーズではxx:xx:xx:xx:xx:xx:xx:xxという表現方法になるので、
例: dead:beef:dead:beef → de:ad:be:ef:de:ad:be:efのように書き換えて設定ください。

11/4追記:
9.1.10での運用について当初うまくいっていなかったのですが、解消できたので書いておきます。
すぐ下の5秒遅延-に関するところです。

前提になる話として、「v6プラスが提供しているDNSサーバーはIPv6でのみreachableです」
proxy-dns ip enable request bothがない状態だと、IPv4でのDNS問い合わせが不可能なのでタイムアウトまで待っていただけだったんですね。
当初AAAAレコードだけかと思っていましたが、tcpdumpしてよく見てるとAも引けていませんでした…
コンフィグに他にDNS設定を書いていないので、当たり前の挙動です。

で、要はv4 rechableなDNSがあればいいということで、
proxy-dns server 1.1.1.1
を追加して平穏が訪れました。
1.1.1.1はCloudflareが提供しているパブリックDNSです。
Google Public DNSでもVerisign Public DNSでも好きなのを入れていいと思います。
サーバー系の設定にパブリックDNSを入れる是非については少し悩みましたが、他にあてもないので。
–追記ここまで

■サーバー側の設定
利用目的がwebサーバー公開なので、そこでも気になった点を。
RHEL6/CentOS6以降ではDNS問い合わせする際、標準ではAレコードとAAAAレコードの問い合わせに同じソケットを利用するようです。
そのため、一部ファイアウォールでは後の応答を遮断してしまう模様。
CentOS7の自分の環境ではWordPressにアクセスする際サーバー側からDNS問い合わせが発生するため、
遮断が入っていたのかタイムアウトが発生しページ表示が5秒程度遅延していました。

従来の問い合わせ方法を使うにはnmcliで下記を投入します。
nmcli con modify ipv4.dns-options single-request-reopen
systemctl restart network

single-request-reopenというのがリクエストごとに別のソケットを開くオプションになります。
/etc/resolv.confを編集する方法もありますが、CentOS7の場合はNetworkManagerがオーバーライドしていくので
上記nmcliのほうが良いと思います。

■使用感
ひとまず結果から。
記事公開日に数回だけチェックした数値なので参考程度に。

Ookla speedtest.net(DL/UL、相手はOPEN Projectを選択)
 PPPoE:平時PING15ms 290/410Mbps、混雑時PING40ms 28/60Mbps
 v6プラス:平時PING3ms 140/138Mbps、混雑時PING3ms 138/143Mbps

正直なところ、PPPoEでも平時は問題ないのです。
速度も出ますしPINGも悪くありません。
ですが、POIにトラフィックが集中する混雑時には速度が大きく下がります。
実際のところ、上の計測結果は以前と比べるとかなりマシなほうで
ひどい時には下り10Mbps切ることもありました。
また、レスポンスも悪化するので、その分が応答時間に乗ってきます。
もちろんwebサーバーとクライアント間は複数のセッションを張るのでレイテンシ×コンテンツ数ではありませんが、
速度も相まってもっさり感じることが多くなります。

一方、v6プラス固定IPだと速度、PINGともにほとんど変動しません。
特にPINGが一定かつ短いのはサーバー公開用途として理想的です。
夜間にクライアント用途として利用しても、サイトへのアクセスは快適です。
もちろんv6プラスについても終端のBRが混雑すると遅くなる可能性はありますが、
POIと比べるとJPNE内部の機材なので対処しやすいのではないかと。
各ISPがIPv4 over IPv6でトラフィックをIPoEに逃がすサービスをしていますが、その意味は大いにあると思います。

ところで、上記の速度結果で、v6プラスが遅いことに気づくと思います。
これはIX2105のCPU性能によるものです。
上記の速度計測の際に確認すると、v6プラス時はCPU使用率が100%に張り付きます。
IX2105はPowerPC系の400MHzシングルコアなので、このCPUの限界ということですね。
4-over-6の処理はPPPoEより重いようです。
昨年にCPUが800MHzになったIX2106が発売されているので、そちらだとさらに高速だと思います。

ちなみにファームバージョンによっても速度差があり、計測すると9.1.10のほうが速いです。160Mbps程度出ます。
先に書いたDNSまわりの挙動があったので私は今のところ10.0.14で運用入れていますが、9.1.10でもコンフィグ見直せばいけると思います。
2台とも中古で入手した個体なのでその間のファームで確認できないのです。

そんなこんなで、インターネットへの接続方法としては宅外のボトルネックを極力排したものになったかと思います。
今後ともよしなに。

Posted: 2018-11-03
at 22:21 by 入江 萌乃


Categories: サーバー,技術メモ

Comments: No comments


Raspberry Pi + GPSでNTPサーバー

どうも、萌乃です。
Raspberry PiとGPSモジュールを組み合わせてNTPサーバーを構築してみました。
GPSからの信号を利用することでUTCに対して数百ナノ秒の精度で時刻を保持できます。
以前から高精度の時刻保持は研究していたのですが、Raspberry Piを使うとわりと簡単に作れるので良いなと思う次第です。

■もくじ

1:材料
2:raspbianの設定
3:ひとまずGPSモジュールからのデータを見てみる
4:PPSの確認
3:カーネルのリビルド
4:NTPのビルド
5:うるう秒への対応
6:NTPの設定(gpsd編)
7:NTPの設定(ntpd編)
8:Raspberry Pi自体の設定
9:ちなみに

■材料

・Raspberry Pi B+
おなじみのrpiです。秋月電子で購入。

・4GB以上のmicroSDカード
これはお好みで。
4GBだとカーネルリビルド時にギリギリだったので、8GB以上が良いかもしれません。

・U-blox NEO-6M GPSモジュール
aitendoで購入(http://www.aitendo.com/product/10255
アンテナも付属していますので窓際ならこれだけで受信環境が揃います。

動作電圧3-5v、信号がTTLレベルで出て使いやすいですが、PPSがLEDに接続されているので
3番ピンにリード線をハンダ付けして信号が取り出せるようにしておきます。

gps

こんな感じで。
ピンヘッダを付けておくと便利です。

・GPSアクティブアンテナ
aitendoで購入(http://www.aitendo.com/product/2421
ベランダにアンテナを出したかったので購入。
上記アクティブアンテナの場合、モジュール側がU.FL、アンテナ側がMMCXなので変換する必要があります。

case

自分はケースを加工して搭載できるようにしました。

■raspbianの設定

今回はrpi標準のraspbianを使っています。(2014/12/24版で動作確認しています)
http://www.raspberrypi.org/downloads/からシステムイメージを入手してmicroSDに書き込んでおいてください。

キーボードやロケールなど初期設定はお好みで
apt-get update
apt-get upgrade
rpi-update

で内容を最新にしておきます。

GPSモジュールはrpiのttyAMA0に接続することになります。
標準ではttyAMA0でシリアルコンソールが使えるようになっているため、これを無効にします。

/boot/cmdline.txtからconsole=ttyAMA0,115200 の部分を削除
/etc/inittabのT0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100 の行を無効に
sudo insserv -r triggerhappyでtriggerhappyを無効に

他の用途でもrpiを使うなら最低限このくらいですが、自分のようにntp専用にしたいなら
サウンド関連は無効にしても良いかもしれません。
/etc/modulesにsnd-bcm2835がいます。

ここまでやったら一度シャットダウンしてGPSモジュールを接続。

connect

自分はこんな感じに入力しています。
電源投入後、GPSを捕捉するとPPS LEDが点滅します。

■ひとまずGPSモジュールからのデータを見てみる

PPSは一旦置いておいて、GPSモジュールから出てるデータを見てみます。

NMEAデータを管理するgpsdとクライアントをインストール
sudo apt-get install gpsd gpsd-clients

今のところはgpsdを自動起動せずに手動で立ち上げます。
理由は後述。
sudo gpsd /dev/ttyAMA0 -n -F /var/run/gpsd.sock
cgps -sするとGPSの捕捉状況が見られます。

cgps

こんな感じに
衛星が3つか4つ以上捕捉できていると3D FIXできますが、
時刻同期だけなら多分もっと少なくてもいいです。

余談として、gpsdを経由すれば簡単にPPSに同期したGPSロガーも作れそうですね。
実用に耐えうるかはともかく、そのうち作ってみます。

■PPSの設定

※2014/12/24公開のraspbianカーネルは標準でPPSに対応しています。

PPSの信号が利用できるようにします。

sudo apt-get install pps-tools
でppsツールをインストール後、
/boot/cmdline.txtの行末に
bcm2708.pps_gpio_pin=18 を追加(ピン番号は環境で変更してください)、

/etc/modulesに
pps-gpio
を追加します。

再起動後、
sudo ppstest /dev/pps0
でppsが拾えているか確認。

pps

延々表示し続けるのでCtrl+Cで止めます。

■カーネルのリビルド

※2014/12/24公開のraspbianカーネルは標準でPPSに対応しています。
カーネルリビルドしなくても数マイクロ秒の精度は出ます。

ナノ秒オーダーの精度を出すにはdyntickが邪魔になるので、tickの方法を変更してカーネルをリビルドします。

必要なものをインストール。
apt-get install wget git libncurses5-dev bc screen

今動いているカーネルコンフィグを取得するとき、sudoでもエラーが出たのでrootログインできるようにしておきます。
sudo passwd rootでパスワード作成。
再起動しrootでログインして作業再開。

mkdir pps
cd pps
git clone --depth 1 git://github.com/raspberrypi/linux.git
cd linux
zcat /proc/config.gz > .config ←今動いているカーネルコンフィグを保存、ここでsudoだとエラーが出ました
make menuconfig

カーネルメニューにて、まずは現在の設定をロードします。
最下部のloadから.configをロード。

PPSとtick周りの設定をします。
Device Drivers → PPS supportでPPS supportを有効に(Y)、
PPS kernel consumer supportとPPS client using GPIOも有効にしておきます。

メニューのトップに戻って、
General setup → Timers subsystemと入り
Old Idle dynticks configを無効、
High Resolution Timer Supportを有効に。
その後Timer tick handlingを有効にすると別画面に遷移するので
Periodic timer ticksを選択します。

ここまで終わったら再度メニューのトップに戻り、
saveから.configへ再度書き込みます。

私はこれをやり忘れて1日無駄にしました…

さてビルドします。
make
make modules_install

makeに10時間くらいかかります。
ext4のジャーナル破損が起こることがありますが、その際にはmicroSDの故障ないし相性なので
別のカードに変えてみてください。

カーネルイメージ化します。
git clone --depth 1 git://github.com/raspberrypi/tools.git
cd tools/mkimage/
./imagetool-uncompressed.py ../../linux/arch/arm/boot/zImage

これでkernel.imgが出来上がります。

rpiにカーネルをインストールし、起動カーネルを変更します。
mv kernel.img /boot/kernel_tick.img
/boot/config.txtに
kernel=kernel_tick.img
を追記します。

再起動すると作成したカーネルで起動します。

■NTPのビルド

標準でインストールされているntpはPPSに対応していないので、ソースからビルドします。
sudo打つのが面倒だったのでrootでログインしています。

mkdir ntp
cd ntp
apt-get install libcap-dev
wget http://archive.ntp.org/ntp4/ntp-4.2.8.tar.gz

1/31時点ではntp-4.2.8p1-RC2.tar.gzが最新です。
必要に応じてhttp://archive.ntp.org/ntp4/を確認してください。

tar xvfz ntp-4.2.8.tar.gz
cd ntp-4.2.8
./configure
--enable-ATOMはなくても対応するようです。
--enable-linuxcaps含めて入れたほうが精神衛生上良さそうな気がします。

make
make install

これで/usr/local/bin/と/usr/local/sbin/にバイナリが生成されます。

このバイナリを今まで動いていたntpと入れ替えます。
/etc/init.d/ntp stop
cp /usr/local/bin/ntp* /usr/bin/ && cp /usr/local/sbin/ntp* /usr/sbin/
/etc/init.d/ntp start

この方法だと、今までのからntp.confや起動スクリプトが流用できるので便利です。

■うるう秒への対応

今年の7/1にうるう秒の挿入があります。
GPSから送られる情報の中にうるう秒がいつプラス、マイナスされるかがありますので、
本来であればその情報だけで対応できます。
しかし、GPSからのその情報を使うかはクライアントごとにまちまちなので、別のアプローチで対応しておきます。

アメリカのNISTでうるう秒のリストが公開されていますのでそちらを使います。
ftp://time.nist.gov/pub/leap-seconds.list
(実体のファイルはleap-seconds.3629404800ですが、leap-seconds.listでシンボリックリンクされているようです)

cd ~
wget ftp://time.nist.gov/pub/leap-seconds.list
sudo cp leap-seconds.list /etc/

/etc/はntp.confと同じところに置きたいと思ったからなので、コピー先はお好みで。

/etc/ntp.confの中に
leapfile /etc/leap-seconds.list
を追記します。
ntpdを再起動すると適用されます。

ここからNTPの設定に入りますが、NMEAのデータgpsd経由で送るか、ntpdで直接管理するかによって設定が異なります。
gpsdを経由せずにntpdで直接管理したほうが精度が良いですが、他のソフトから扱えなくなります。

■NTPの設定(gpsd編)

NMEAデータをロギングしたいなど、他にも使う際にはこちらです。
共有メモリを経由するので、NMEA側のジッターが大きめな気がします。

まずはgpsdの自動起動を設定します。
sudo dpkg-reconfigure gpsdから出てくるメニューで
自動起動をオン、参照ポートを/dev/ttyAMA0、ソケットを/var/run/gpsd.sock(標準)に。

/etc/ntp.confの現在のserver行をコメントアウトしてから、下記設定を投入します。
server 127.127.22.0 maxpoll 4
fudge 127.127.22.0 flag3 1 refid PPS
server 127.127.28.0 maxpoll 4 prefer
fudge 127.127.28.0 time1 0.141 refid GPS

他の設定はお好みで。

time1はPPSに対するNMEAの遅延時間で、単位は秒です。
私の環境では141ミリ秒くらいでしたが、一旦0で動かしてオフセットを見ながら適宜調整したほうがいいかもしれません。

この設定で動かすと、下のようになります。

gpsd

■NTPの設定(ntpd編)

私のようにNTP専用機にするぜ!という人はこちらです。
ntpdが直接NMEAデータをつかむので安定しますが、他で使えません。

/etc/udev/rules.d/10.pps.rulesというファイルを作成します。
内容は以下2行

KERNEL=="ttyAMA0", SYMLINK+="gps0"
KERNEL=="pps0", OWNER="root", GROUP="dialout", MODE="0660", SYMLINK+="gpspps0"

ntpdはユーザー”ntp”で動作するので、ユーザー”ntp”をdialoutグループに追加しておきます(標準ではグループに属していません)。
sudo usermod -G dialout ntp

再起動すると/dev/gps0と/dev/gpspps0という2つのデバイスができます。
このデバイスをntpdで読んでいきます。

/etc/ntp.confの現在のserver行をコメントアウトしてから、下記設定を投入します。
server 127.127.20.0 mode 17 maxpoll 4 prefer
fudge 127.127.20.0 flag1 1 flag3 1 refid GPS

flag1はPPSを処理するかのフラグ、flag3はPPSの管理をntpdでするかカーネルでするか(0がntpd、1がカーネル)のフラグです。
あと、入れなくても精度は出ますが気になる方はtime2も入れてください。
time2はPPSに対するNMEAの遅延時間で、単位は秒です。

この設定で動かすと、下のようになります。

ntpd

■Raspberry Pi自体の設定

上記でGPSモジュールを参照してntpdが動作するようになりました。
より時刻精度を出したい、参照時の精度を出したいといった場合には下記設定をすると良いでしょう。

・CPU周波数の固定
rpiのCPU周波数は、アイドル時には低く負荷がかかると高くなります。
周波数変動時の遅延が時刻に影響をするので、それを固定します。
raspi-configでオーバークロックをするとリセットされてしまうので注意。

sudo echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

・シリアルのレイテンシ設定
シリアル(NMEA)はオフセット指定できるので標準のままでも問題ないのですが、
レイテンシを低減しておくとなお良いかと思います。

sudo apt-get install setserial
setserial /dev/ttyAMA0 low_latency

この設定を入れる前後で遅延時間がいくぶん変化しますので、必要に応じてntp.confに修正を加えてください。

・LANコントローラーの設定
rpiに搭載されているLANコントローラーはSMSC9512というもので、USBハブと一緒になっています。
ターボモードというものがあり複数のパケットを同時送出できますが、カーネルクラッシュの危険性がありますので
無効にしたほうが良いのかも。

/boot/cmdline.txtに下記設定を入れます。
smsc95xx.turbo_mode=0
ppsの設定が行末になるように注意してください。

・メモリの設定
rpiに搭載のメモリにはリフレッシュレート調整の機能がありますが、調整時にはポーズがかかって影響が出ますので無効にします。
メモリの温度によって調整しているみたいですね。

/boot/cmdline.txtに下記設定を入れます。
disable_pvt=1
ppsの設定が行末になるように注意してください。

■ちなみに

自宅で運用しているrpiのオフセット値などをmuninで収集して公開しています。
http://ns.lowfreq.info/munin/pintp/pintp/
このくらいの精度が出る、という参考にしてもらえれば。
プラグインの一部は自作したものですが、これについては別の機会に公開します。

Posted: 2015-01-31
at 17:00 by 入江 萌乃


Categories: サーバー,技術メモ

Comments: 2 comments