Hatena::ブログ(Diary)

とりあえず日記 このページをアンテナに追加 RSSフィード Twitter

2018-06-16

DHCP(dnsmasq)のIPリース情報をブラウザで表示する

はじめに

我が家では家庭内DHCPとしてdnsmasqを利用しています。


DHCPでリースされたIPアドレスを確認するには、サーバSSHログインし dnsmasq.leases のファイル内容を確認しますが、

毎回サーバログインするのが面倒になってきました。


そこで、WEBサーバを立ち上げてDHCPIPリース状況をWEBブラウザから簡単に確認できるようにしました。


先行事例

先行事例をgoogleで簡単に調べましたが特に見つかりませんでした。

探している時間が勿体ないのでさっさと作りました。


方針

  • DHCPのリース情報が書かれている、以下ファイル内容をWEBブラウザから確認できるようにする。
    • /var/lib/dnsmasq/dnsmasq.leases
  • httpサーバDHCP(dnsmasq)をインストールしているサーバに構築する。
  • 今回は目的が単純なので重装備のapacheは利用せずにpythonのウェブサーバ機能を利用する。
  • 家庭内LANで利用するのでセキュリは後回しにします、まずは最速最短でサーバを構築し運用を開始する。

作成したWEBスクリプト

$vi /var/www-py/cgi-bin/index.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

print('Content-type: text/html; charset=UTF-8\r\n')
print('<H1>%s</H1>\n' % "dnsmasq.leases")

f=open("/var/lib/dnsmasq/dnsmasq.leases", "rt")
try:
  for line in f:
    print(line.strip() + "<br>\n")
finally:
  f.close()
スクリプトを実行できるように権限を付与する
$ ls -l /var/www-py/cgi-bin/index.py
-rwxr-xr-x. 1 root root 121  612 15:13 /var/www-py/cgi-bin/index.py

実行方法

#ファイヤウォールのポートを空ける
#webサーバが起動しているときだけポートを空けたいので --permanent は付けない。
#ファイヤウォールの制御は後述でスクリプトにします。
$firewall-cmd --add-port=8000/tcp --zone=public
$firewall-cmd --reload

#サーバの起動
$cd /var/www-py
$python -m CGIHTTPServer 8000

#ctl-z で終了します。


WEBブラウザで確認する

f:id:ohtorii:20180616202644p:image:w640

プライベートな情報は伏せています。(殆ど黒塗りだな・・・)


サービス化する

OS起動時にWEBサーバ自動起動できるようにサービスを作ります。

サービスの設定ファイル

$vi /usr/lib/systemd/system/www-py.service

[Unit]
Description=www-py server.
After=dnsmasq.service firewalld.service

[Service]
Type=simple
ExecStartPre=/var/www-py/service/start StartPre
ExecStart=/var/www-py/service/start Start
ExecStopPost=/var/www-py/service/start StopPost

[Install]
WantedBy=multi-user.target
サービスから呼ぶスクリプトファイル

サービスが起動しているときだけFirewallのポートを空けたいので、firewall-cmdコマンドに --permanent オプションは付けません。

$vi /var/www-py/service/start

#!/bin/bash

if [ "$1" = "StartPre" ] ; then
  firewall-cmd --add-port=8000/tcp --zone=public
elif [ "$1" = "StopPost" ] ; then
  firewall-cmd --remove-port=8000/tcp --zone=public
elif [ "$1" = "Start" ] ; then
  cd /var/www-py/
  python -m CGIHTTPServer 8000
else
  echo "Unknown arg. arg=$1"
fi

ファイルのアクセス権
ls -l  /var/www-py/service/start
-rwxr-xr-x. 1 root root 105 Jun 12 20:36 /var/www-py/service/start

仕上げ
#サービスを起動&停止して
$systemctl start www-py
$systemctl stop www-py

webサーバのプロセスが残っていないか確認します。
$ps -aux | grep python

#サービス起動時にポートが開き、終了時にはポートが閉じているか確認します。
$firewall-cmd --list-ports --zone=public

#問題なければOS起動時にサービスを読み込むようにします。

$systemctl enable www-py

環境

Raspberry Pi3 b

$uname -a
Linux foo-bar.local 4.9.80-v7.1.el7 #1 SMP Thu Mar 15 13:29:03 UTC 2018 armv7l armv7l armv7l GNU/Linux

$ cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 

$ python --version
Python 2.7.5

2018-06-01

Release for CentOS Linux 7 (1804) on armhfp

今更ですが・・・

Arm版CentOSの開発をされているFabian Arrotin氏が、

5月10日にRaspberry PiCentOSイメージをリリースされてました。


氏がMLに流したメール

[CentOS-announce] Release for CentOS Linux 7 (1804) on armhfp


Raspberry Piのイメージ

http://mirror.centos.org/altarch/7/isos/armhfp/

  • CentOS-Userland-7-armv7hl-RaspberryPI-GNOME-1804-sda.raw.xz
  • CentOS-Userland-7-armv7hl-RaspberryPI-KDE-1804-sda.raw.xz
  • CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1804-sda.raw.x

最後に

手元のRaspberry Piは全て稼働中なので、新しいディスクイメージを試すだけの余剰機材がないです😰

Raspberry Piを新しく買うことがあれば試してみたいです😃

2018-05-29 DD for Windowsでフォールト トレラント ヒープのエラーが発生する

DD for Windowsでフォールト トレラント ヒープのエラーが発生する

DD for Windows(ディスクイメージの読み書きを行うアプリ)でフォールト トレラント ヒープのエラーが発生したので、情報をネットの海に放流しておきます。

エラーメッセージ

[19164] FTH: (19164): *** Fault tolerant heap shim applied to current process. This is usually due to previous crashes. ***

f:id:ohtorii:20180529181233p:image:w360

DD for Windowsを起動したタイミングで出力されます。

動作について

フォールト トレラント ヒープのエラーは発生してますがDD for Windowsは問題なく動作しています。

潜在的にメモリ破壊の問題があるのかも?

環境

Windows10 64bit

DD for Windows Ver.0.9.9.8

フォールト トレラント ヒープとは

no title

フォールト トレラント ヒープ

2018-04-27

Raspberry Pi3 Model B+上でCentOS7が動いたよ

はじめに

Raspberry Pi3 Model B+を入手しました。

日本の技適を通過していないのでWifiを利用できないのが難点ですが。。。


さて本題です、

Raspberry Pi3 Model B+ を既存のCentOS7イメージでブートすると虹色の画面で止まったままになります。

困った困った😖


状況
ファイル名bootするか?
CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img.xz虹色の画面で止まる
CentOS-Userland-7-armv7hl-Minimal-1708-RaspberryPi3.img.xz虹色の画面で止まる

解決方法

FabianArrotin氏がRaspberry Pi3 Model B+で動くようにビルドしたイメージを利用します。


(ファイル)

https://buildlogs.centos.org/rolling/7/isos/armhfp/CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-sda.raw.xz


単にソースをビルドしただけのようでリリース前のテストが十分に行われているのか不明です。

利用時はご注意を。


情報源

Arm-dev -- Conversations around CentOS on ARM hardware

[Arm-dev] Raspberry Pi 3 Model B+

上記一連のスレッド


FabianArrotin氏のTwitter

Arm版のCentOSを開発されている方のようです。

Fabian Arrotinさんのツイート: "Look what just finished cooking : @CentOS 7.5.1804 armhfp running on @Raspberry_Pi 3B+, with kernel 4.14.28, and wifi working OOTB. #ReleaseApproaching… https://t.co/9qslvRxyCB"

Fabian Arrotinさんのツイート: "So just tested that a "renewed" @CentOS 7 armhfp image works for the @Raspberry_Pi 3 model B+ , including wifi. Stay tuned for the updated link !"

Special Interest Groups (SIG)内の自己紹介。

FabianArrotin - CentOS Wiki


まとめ

Arm版CentOSで困ったときはArm-devのMLを読み書きするのが良いと思います。

2018-04-19

【Raspberry Pi3+CentOS7】NIC2枚差しの設定をした

はじめに

Raspberry Pi3+CentOS7の環境にSoftEtherVPNを設定したときの自分用メモです。

なぜNICを2枚差したのか?

SoftetherVPNの公式にはVPN専用のNICを追加した方が良いと書いてあり、言われるがママ素直にRaspberry PiUSB-NICを1つ追加しました。

3.6 ローカルブリッジ - SoftEther VPN プロジェクト

まあ当然、追加しただけでは正しく動作しないのでネットの情報を鵜呑み参考にしながら設定を行いました。


以下、作業メモです。


Raspberry Piネットワーク

192.168.30.40  12:34:56:11:11:11  eth0 (Raspberry Piに元からあるLANポート)
192.168.30.50  ab:cd:ef:22:22:22  eth1 (USB-NIC)

DHCPで固定アドレスを割り当ててます。

問題の発生

WindowsコマンドプロンプトからARPテーブルを確認したところ、

> arp -a
インターネット アドレス 物理アドレス   
192.168.30.40           12-34-56-11-11-11
192.168.30.50           12-34-56-11-11-11

あれ??

異なるIPアドレスに対して同じMACアドレスが割当たってます。

正解は以下の通りです。

192.168.30.40         12-34-56-11-11-11
192.168.30.50         ab-cd-ef-22-22-22

では、ネットワークの設定が正解になるように対応を行います。


異なるIPアドレスMACアドレスが同じになる原因

eth1で受けた通信をeth0から返信しているため。

//tcpdumpコマンドで確認済です。

//ログは省略。


対応方法の概要

NICを2枚を差したときに発生するありがちな問題のようで、マルチホーミング設定を行います。

http://d.hatena.ne.jp/hirose31/20120822/1345626743

http://takumicloud.jp/blog/2015/11/30/nw/

http://ibucket.blogspot.jp/2010/07/centos.html


手順

$cat  /etc/iproute2/rt_tables

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep

100     subroute-eth1   <- 追加
$ ip rule add from 192.168.30.50 table subroute-eth1 prio 100
$ ip route add table subroute-eth1 192.168.30.0/24 dev eth1 scope link proto kernel
$ ip route add table subroute-eth1 default via 192.168.30.1 dev eth1

反映されているか確認します。

$ ip route show table subroute-eth1
default via 192.168.30.1 dev eth1
192.168.30.0/24 dev eth1 proto kernel scope link
$ ip rule
0:      from all lookup local
100:    from 192.168.30.50 lookup subroute-eth1
32766:  from all lookup main
32767:  from all lookup default

OS再起動対応

以下ファイルを作りCentOS再起動で設定が消えないようにします。

/etc/sysconfig/network-scripts/{rule,route}-eth1

作業でファイルを作ると間違う可能性があるので、

CentOS7ではnmcliコマンドを使うのを推奨されていますが、

何故か、nmcliコマンドでポリシーベースの設定は出来ないようです(注意、2015年の古い情報です)

https://www.centos.org/forums/viewtopic.php?t=50400

https://mano.xyz/2033/

nmcliコマンドで設定が可能なら誰か教えて欲しい・・・

しかたないので今回は以下のファイルを手作業で作りました。

$ cat /etc/sysconfig/network-scripts/route-eth1
192.168.30.0/24 dev eth1 src 192.168.30.50 table subroute-eth1
default via 192.168.30.1 dev eth1 table subroute-eth1
$ cat /etc/sysconfig/network-scripts/rule-eth1
from 192.168.30.50 table subroute-eth1 priority 100

NetworkManager-config-routing-rulesの起動

CentOS7をMinimalで構築している場合は以下パッケージをインストールして起動します。

$ yum install NetworkManager-config-routing-rules
$ systemctl enable NetworkManager-dispatcher
$ systemctl start NetworkManager-dispatcher

こうしないと /etc/sysconfig/network-scripts/{rule,route}-eth1 の設定がネットワークに反映されません。

NetworkManagerの再起動

$ systemctl restart NetworkManager

再起動後の設定を確認する

$ ip route show table subroute-eth1
default via 192.168.30.1 dev eth1
192.168.30.0/24 dev eth1 scope link src 192.168.30.50
$ ip route
default via 192.168.30.1 dev eth0 proto static metric 100
192.168.30.0/24 dev eth0 proto kernel scope link src 192.168.30.40 metric 100
192.168.30.0/24 dev eth1 proto kernel scope link src 192.168.30.50 metric 101
$ ip rule
0:      from all lookup local
100:    from 192.168.30.50 lookup subroute-eth1
32766:  from all lookup main
32767:  from all lookup default

その他

VPN接続はパケット転送をおこなわなくても出来るはずなので無効化しています。

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

VPN接続

SoftEtherの設定、サービス起動(systemctlコマンド)とファイヤウォールの設定(firewall-cmd)を行って、Android端末からVPN接続出来ることを確認できました。

めでたしめでたし

最後に

CentOSWindowsと比べるとネットワークを細かく制御できる分めんどうですね。

少しずつ勉強します、めでたしめでたし、



と終わりたいところですが、

OSを再起するとNICを認識する順序によってVPN接続できなくなります、ググるとCentOS界隈ではよくある現象NICの名前(ifcgf-eth0, ifcfg-eth1)を固定する設定が必要になります。

おいおい初見殺しだな


(参考)

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/appe-Consistent_Network_Device_Naming

RHEL7のNICのネーミングルール - めもめも

mrwk update: systemd-udevdによるNIC命名とbiosdevnameがまざって混乱する件

CentOS7におけるNIC命名ルール - 雑木林