Linux」カテゴリーアーカイブ

サーバ⚙

アーカイブ

カテゴリー

我が家のWiFi機器の登録

子どもに「ネットワーク機器」が新たに届く。そろそろ、専門用語も通じる様になってきたので、セットアップ方法を伝授。

普通の家なら、WiFiルータのAOSSのボタンを押して…と言うところだろうが、我が家はネットワークの登録は手作業。

(1) ルータの設定画面 http://192.168.11.1 に接続し、login: admin , password: ●●●
(2) 詳細設定→無線設定→MACアクセス制限
(3) 登録リストの編集で、登録リストの新規追加

普通の家なら、WiFiルータで DHCP サーバ機能(プライベートアドレスの貸し出し機能)が動いているので、これで終わり。

ただし、我が家では、ネットワーク機器の稼働状況を管理するために、

(4) 固定IPアドレスを割り振るために DHCP サーバへの登録、/etc/dhcp/dhcpd.conf の編集
(5) IPアドレスを名前で呼び出せるようにするための DNS サーバへの登録 /etc/db.xxxx の編集
(6) 登録されていない MAC アドレス機器を監視するために、監視対象から外すための /etc/arpalert/maclist.allow への追記
(7) その他にも hosts への追記、Samba のための lmhosts への追記

と、面倒な設定が必要。これを全部管理するのは大変なので、これらの管理の自動化を行うプログラムが作ってあるので、その設定ファイルに、機器の ホスト名・IPアドレス・MACアドレスを記載すればいい。

EdgeRouter-X ver 2.0.8 に更新

12/5 に、EdgeRouter-X のファームウェア 2.0.8 が公開されたみたい。さっそく適用。

といっても、何が変わったかしらんけど。(^_^;

zsh の設定調整

macOSの標準シェルがzshになって、Linux環境にもzshを入れて使い始めたけど、時々予想外の動きをしてくれた。

リモートのファイルをscpでコピーしようと “scp remote:*.c .”みたいなことをしたら、no match*.c みたいなエラー。ワイルドカード展開のタイミングが bash などと違うみたい。

逆に、リモートホスト名が書いてある状態だと、ファイル名補完でリモートに接続しようとして待ちが発生して使い勝手も悪くなるといった情報もある。

そこで、上記2つの問題に対応するために、.zshrc に以下の内容を追加。

PROMPT="%F{cyan}[%n@%m %1~]%(#.#.$)%f "
setopt nonomatch
zstyle ':completion:*:complete:scp:*:files' command command -

macOS Catalina と zsh

macOS Catalina(10.15)

基本ファイルシステムがリードオンリーになるとか、システムの変更がいつもになく危険そうでアップデートを躊躇っていた、macOS Catalina だけど、人柱の方々の撃沈のネタもなく、ようやく Catalina を入れてみた。

でも、心配だった割には、特に重大なトラブルもなく、インストールは終わった。

この後、Macports なども更新を行った。一部、ossp-uuid のパッケージが不具合を発生して、”sudo port clean ossp-uuid” を実行した程度。

Debian環境も zsh に移行

インストールも無事に終わったけど、Catalina からは標準 shell が zsh に変更になった。そこで、身の回りの Debian の環境でも zsh を入れてみた。

ただ、インストールしようとすると、zsh-static という動的リンクをしないパッケージもある。

システムの動的リンクライブラリが異常になっても動くようにということだろう。そこで admin では、zsh-static を使うようにしておいた。

$ sudo aptitude install zsh zsh-static
$ chsh -s /bin/zsh
$ sudo chsh -s /bin/zsh-static root

OpenHAB2 のインストール

SiriやGoogle home との相性を考え、家電制御のために、openhab2 をインストール

OpenHabのリポジトリ登録

$ wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' \
  | sudo apt-key add -
$ sudo apt-get install apt-transport-https
$ echo 'deb https://dl.bintray.com/openhab/apt-repo2 stable main' \
  | sudo tee /etc/apt/sources.list.d/openhab2.list
$ sudo apt-get update 

OpenHabのインストール

$ sudo aptitude install openhab2
$ sudo systemctl daemon-reload
$ sudo systemctl enable openhab2.service

Java環境の設定

上記の設定で、openhub2 のインストールは終わったけど、”systemctl start openhab2.service”を実行しても動いてくれない。起動スクリプトのための設定が必要。

(( /etc/default/openhab2 ))
:
OPENHAB_HTTP_PORT=8080
OPENHAB_HTTP_ADDRESS=192.168.xxx.0
:

相変わらず動かないけど、/var/log/opehhab2/openhab.log を見ると、Java のエラーが出ている。改めて確認すると、java のバージョンが java-8 で、9以降だと動かないみたい。改めて openjdk-8 をインストールし、systemdの設定で JAVA_HOME を指定するように変更。

$ sudo aptitude search openjdk-8 openjdk-8-jdk-headless
$ sudo vi /usr/lib/systemd/system/openhab2.service

(( /usr/lib/systemd/system/openhab2.service ))
:
[Service]
Environment=JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
:

$ sudo systemctl start openhab2.service

 

ブラウザで http://192.168.xx.xx:8080 で開いて、無事起動していることが確認できた。

起床用の照明制御

寝室の蛍光灯がつかなくなって、交換しようとしたらプラスチック劣化で部品が壊れた。他の照明もLEDに切り替えてきたので、これを契機に寝室もLED照明に取り換えた。

リモコン制御でめざまし

赤外線リモコンが目の前に増えると、早々にリモコン制御に登録。以前の蛍光灯もリモコンついていたけど、感度が悪くて制御しづらかったけど、新しいリモコンは感度よく、うまく制御できる。しかも、ON/OFFを交互にしか制御できないトグル型だと、つけたのか消したのかが区別できないけど、新しいリモコンは全点灯と常夜灯のボタンがOFF状態でも使える。

ということで、先日ママが寝坊して「5分で出社」という荒業を使っていたので、平日朝に徐々に明るく点灯させてみる。
# 朝イチに明るさ30%点灯、30分後に全点灯&オフタイマーで1時間後に消灯。

設定初日は、crontab の書き間違いで失敗したけど、明日からは大丈夫だろう。

ネットワークが繋がらない filter-aaaa-on-v4

最近、職場や自宅にて時々ネットワークが繋がらないときがある。

ネットワークの設定などは自前サーバを配置しているとはいえ、ちゃんと設定してあるはず。

繋がらないという状態でも、異なるサイトなら問題なくつながるので、プロバイダーや自宅ネットワークが落ちているということはない。でも、ふと IPv6 アドレスが問題になっているのかと反省。

自宅内は閉じているとはいえ、IPv6が使える状態。もしかして、上流接続はIPv4しか使えないけど、たまにIPv6アドレスを引いてしまうとかであろうか。

filter-aaaa-on-v4

そこで、色々調べ、IPv4 アドレスからの問い合わせは、IPv6 を使わせないための設定をしてみた。

((( /etc/bind/named.conf.options )))
options {
    :
    listen-on-v6       { any; } ;
    filter-aaaa-on-v4  yes ;
}

動作確認

$ nslookup localhost 
Name:    localhost
Address: 127.0.0.1

$ nslookup localhost ::1
Name:    localhost
Address: 127.0.0.1
Name:    localhost
Address: ::1

気のせいかもしれないけど、職場の環境も filter-aaaa-on-v4 つけたけど、IPv4 fallback がなくなったのかな。応答が速くなったように感じる。

iOS13のオートメーション

iOS13のショートカット・アプリには、オートメーション機能が加わった。

iOS13のオートメーション機能で行き先表示板の変更

今回、パーソナルオートメーションにて、職場からの帰宅時に、 部屋の行先表示板の内容を「帰宅」に書き換えて、 自宅に「今から帰る」というメールを送るようにしてみた。
行先掲示板は、小型のLEDメッセンジャーで、 元々簡単なメッセージを Web API で書き換えられるようにしてあった。
ちなみに、自宅に送るメールも、メールタイトルをLEDメッセンジャーで 表示できるようにしてある。

帰宅イベントは、職場のGPS中央から指定半径離れたことで起動させる。

帰宅時に実行する処理で、スクリプティングの中の x-callback 機能を使った。

ただし、元々のLEDメッセンジャーに表示する CGI では、呼び出された後にブラウザが起動状態のままで停止してしまう。このため、詳細表示にして「X-Success URL」をチェック。
X-Success URL とは、iOS が Web アプリと連動するための機能で、表示処理をした後に CGI のヘッダ出力にて、”Location: shortcuts://callback\n” を出力すればいい。今回は、元々の CGI をちょいと書き換えた。メールを送る機能も、単純にメールを送る…では、メールアプリの送信画面で止まってしまう。同じく要塞表示にして、「作成シートを表示」を off にする。

x-callback は HTTPSが必須

これらの機能は、ショートカットアプリのテスト実行機能ではうまくいった。
ただ、事前の実験で、ショートカットの試運転機能ではうまく動いたが、実際に仕事場から帰る時に、オートメーション機能は起動したが、X-CallBack の URL が http で指定したのが原因なのか、URL を開けない。まあ、HTTPSが使えないような怪しいサイトから callback の URL をもらっても、信用できないよな。
ただ、職場のLEDメッセンジャーは公開鍵の登録が手続き的に煩雑なので、http のみ。
# さて、どうしようかな。

Buffaloのファームウェア更新情報のRSS生成

我が家のネットワークは、Buffalo 製品で統一しているけど、ファームウェアの更新は自動取得にしている。

ファームウェア更新の情報を確認したいので、Buffalo の firmware ダウンロードページを自宅の機器に厳選してクローリングし RSS 情報に変換するスクリプトを書いてみた。

Capture The Flags 講座のアフターケア

子供が Capture The Flags の講座に参加したけど、簡単な説明後いきなりミニCTF大会だったので、さっぱり分からないだろうから、少し解き方の説明。

ドメインの秘密

ドメイン名とは、IPアドレスは覚えられないのでコンピュータにつけた名前。そのドメイン名とIPアドレスのデータベースがDNS。通常は、コンピュータ名からIPアドレスを調べる時に使う。unix や windows で DNS 情報を調べるコマンドが、nslookup

最新の unix 環境では、nslookup ではなく、dig しか入っていないかもしれない。

その場合は、

$ sudo apt-get install dnsutils
((( 基本的使い方 )))
$ nslookup [オプション] ドメイン名 [DNSサーバ]
((( 問い合わせ例 )))
$ nslookup tsaitoh.net 8.8.8.8 # GoogleのDNSサーバに問い合わせる例(正引き)
$ nslookup 64.33.3.150 8.8.8.8 # (逆引き=IPアドレスからドメイン名を調べる)
$ nslookup -query=A    tsaitoh.net         # IPv4アドレスを調べる
$ nslookup -query=AAAA www.yahoo.com       # IPv6アドレスを調べる
$ nslookup -query=MX   tsaitoh.net 8.8.8.8 # メールサーバ情報を調べる
$ nslookup -query=TXT  tsaitoh.net 8.8.8.8 # SPF1というメールサーバの信頼性情報

我が家では、自宅専用のDNSサーバが動いている特殊な事例。インターネットのグローバルアドレス空間でどう見えているかを知りたい場合は、DNSサーバに 8.8.8.8 を使う。Google が、記憶しやすいIPアドレスで誰もが使っていい高速のDNSサーバを提供してくれている。

Webページを見つけろ

サーバとの通信では、IPアドレスで相手のコンピュータを見つけるけど、1台のコンピュータ内で複数のネットワークプログラムが動いていた時、どのプログラムと通信するのか区別する必要がある。そのための情報がポート番号IPアドレスを電話番号に例えるなら、ポート番号は内線電話番号みたいなもの。

このポート番号は、プログラムによって番号は◯◯を使うべき…という値が決まっている(よく知られたポート番号)Webサーバ(HTTP)は80番、Webサーバ暗号版(HTTPS)は443番、メールサーバ(SMTP)は25番….。

ポート番号で接続するサービスが決まるけど、学内だけで外に見せたくないWebサーバなどがある場合は、ファイアウォールで特定のポート番号を流通させないようにする場合もある。そういう場合には、通常のポート番号以外を使って通信することがある。

Webサーバに接続する時には、80番を使いたくない場合には、http://コンピュータ名:ポート番号/ と URL にポート番号付きで指定することもできる。

ポートスキャン

このポート番号が解らない時は、ポートスキャンというツールがある。ポート1番で通信してみる、ダメなら2番…という繰り返しをしてくれるツール。一番有名なツールが、nmap。ウィルスなどが仕掛けられて、外部からのネットワーク接続を受ける状態(バックドアが仕掛けられた状態)になったのを見つけるのが本来の使い方。

nmap は通常インストールされない(こんな危ないツール普通はシロートに使わせるものではない)。使いたい場合は、

$ sudo apt-get install nmap
((( 基本的使い方 )))
$ nmap [オプション] 接続先
$ sudo nmap tsaitoh.net     # サーバ tsaitoh.net を調べる
$ sudo nmap -A tsaitoh.net  # ソフトの種類も調べてくれる。

ポート番号が解って、そのサーバソフトに接続してみる場合、telnet がよく使われる。
本来は、ネットワークの先のコンピュータを操作するためのソフト(リモート接続23番ポート)だけど、通信を暗号化しないため、セキュリティ的には危険なので、リモート接続用途で使うことは少ない。

Windowsでは、telnetは初期状態でインストールされない。unix で telnet を使いたい場合は、

$ sudo apt-get install telnet
((( 基本的使い方 )))
$ telnet コンピュータ名 [ポート番号]
$ telnet tsaitoh.net 80       # 80番ポート(HTTP)に接続
GET /                         # トップページのHTMLが帰ってくる。
$ telnet tsaitoh.net 25       # 25番ポート(SMTP)に接続
QUIT                          # 接続を切る

隠れたデータ

ウィルスなどにコンピュータに感染させる場合、ファイル名などを偽っってあったりするので、ファイルの種別を調べたり、その中の命令を分析する必要がある。その場合によく用いる基本コマンド。

((( 基本的使い方 )))
$ file ファイル名     # 指定したファイルが何か簡単に調べてくれる。
$ file a.out        # a.out の中身を調べる

$ strings ファイル名  # ファイルの中身の文字として表示できるものを表示する。
$ strings a.out     # a.out の中の文字情報を抽出

$ nm ファイル名       # オブジェクトファイルのシンボル(関数名や変数名)を表示
$ nm a.out          # stripされたa.outでは抽出できない。

逆アセンブル

実行プログラムがどのような処理をしているのか内容を見たい場合は、逆アセンブル(機械語をアセンブリ言語に変換)する。ただし、一般的な実行プログラムでは、関数番地や変数名番地の情報が消されているので、OS の仕組みの知識が必要。

簡単に解析をするのであれば、objdump などを使うことが多い。ここでは、gdb を紹介する。
gdb(GNU Debugger)は、Cコンパイラ(gcc = GNU C Compiler)のためのデバッガ。linux だとプログラムが異常終了すると、coredump(実行時のメモリ内容を出力する機能) するので、この情報でプログラムの異常処理を探す時に使う。

デバッガは通常はインストールされないよな。

$ sudo apt-get install gdb
((( 基本的使い方 )))
   a.out は、何らかのC言語のソースで事前に作っておくこと。
   | // helloworld.c
   | #include <stdio.h>
   | int main() {
   |    printf( "Hello World¥n" ) ;
   |    return 0 ;
   | }
   $ gcc helloworld.c

$ gdb a.out
(gdb) break main      # main にブレークポイントを設置
(gdb) run             # プログラムを実行
(gdb) step 10         # 10行分処理を実行
(gdb) disas main      # main 以降を逆アセンブル
(gdb) quit

((( 異常処理とその場所を見つける )))
   異常終了するプログラムの例
   | // segv.c
   | #include <stdio.h>
   | int main() {
   |    *((int*)NULL) = 123 ;  # 0番地にデータを書き込む
   |    return 0 ;
   | }
$ gcc -g segv.c        # コンパイル時に名前情報を実行プログラムに埋め込む。
$ ulimit -c unlimited  # coredump 機能を有効にする
$ ./a.out
Segmentation fault (コアダンプ)
$ gdb a.out core       # 異常終了した行が表示される

検索 🔎

  My Google     Yahoo

便利サイト