2021/11/28

NTT フレッツ光ネクスト 契約回線確認等のサイト接続

 NTT東日本のフレッツ光ネクストを利用しているが、
手続中に契約回線確認等でサービス情報サイトにアクセスする必要がある。

サービス情報サイト (https://flets-east.jp/)

その際、Windowsのネットワークのプロパティにて、ipv6を許容していないと、
サイトにアクセスできなかったので、 オボエガキ。

以前はIPv4のみ(ネットワークプロパティ上でIPv6を利用しない状態)で接続できていたが、
ONUがIPv6対応の場合、IPoEのみ情報サイトへの接続を許容している模様。
PPPoEにてIPv4方式のWebサイトへ強制的に向けるよう、PPPoE接続設定を行い、
NTTルータのPPP接続ランプも2か所に接続された状態になったのだが、内部処理は、
IPv6を優先に接続させようとするようで、機械的にルータ側はIPv6側に接続されている場合は、
IPv4へ切り替える作業は行わない仕様のようだ。
そのため、WindowsのネットワークのプロパティでIPv6をOFFにする効果がないということが分かった。
Microsoftはレジストリレベルで、IPv4の優先度を上げる設定を推奨している記事があった)
レジストリでIPv6を非対応にすればよいが、あまり意味を感じず、そこまでのテストは行っていない。


 左図の赤で囲んだ(TPC/IPv6)にチェックが入っていないと、
 上記のサイトにアクセスできない状態となる。


 今まで、IPv4の速度向上に効果があるということで、
 IPv6の設定を無効にしていたが、
 ここの設定をoffにしてもOSの内部的な優先度は
 あくまでIPv6が高い状態で処理が行われているそうだ。
 









参考URL https://turningp.jp/server-client/windows/windows-ipv6-ipv4

2021/10/20

postfix メールの受信を拒否する_spam等対策

spamメールの対策のオボエガキ

http://www.postfix-jp.info/trans-2.2/jhtml/header_checks.5.html

上記を参考にすると、
/etc/postfix/main.cf の
header_checks = regexp:/etc/postfix/header_checks
を有効にする。

/etc/postfix/header_checks の末尾等に排除条件を追記する。

cf)
件名に「残念ながらあなたの」~が含まれる場合
/^Subject:.*=?ISO-2022-JP?B?GyRCO0RHMCRKJCwkaSQiJEokPyROGyhC?=.*/ REJECT

※日本語は、エンコードしないと駄目。

ユーザhogeへのメール(hoge@xxx.comが受信)を拒否する場合
/^To:.*hoge@xxx.com/ REJECT


あくまで非mimeのヘッダーチェックなので、以下の内容に限る。
受信サーバ側から見るので、
Cc:           同時送信されたユーザ
From:       送信元ユーザ 
Subject: 件名
To:           受信者 

この辺りは、使える。


最後に設定を反映

# systemctl restart postfix

2021/08/23

NAS(TeraStation)が起動しなくなった際のサルベージ方法

会社の定期電気点検に伴って、物凄い台数の機器の電源の入り切りが発生したのだが、

十数台あるNASのうち1台の基盤が壊れたらしく、起動しなくなってしまった。

HDDは3年毎くらいで交換したが、本体は7年以上頑張ってくれたみたい。ありがとう・・・。

 

とはいえ、データは救出して使えるようにしないと問題なので、

同世代のNASを覗いてみると、XFSフォーマットだった。

CentOSでそのままいけるじゃないか!と気楽に外付けでHDDを接続し、

マウントしようとしたが、

mount: unknown filesystem type 'linux_raid_member'

レイド組んでると、普通にマウントできないそうだ・・・。

少し調べると、mdadm(Multiple Devices maapper administrator の略と思われる)という

ユーティリティがあるので、それを使ってレイド構成として認識させるとあった。

 

物理又は、ソフトウェア的にレイドを組んでいるマシンで作業すると

ぶっ壊れる恐れがあるので、『レイドが組んでいないマシンで作業』すること!

 

# yum install mdadm でユーティリティをインストールする。

 

RAID状態だったHDDをUSB等で接続すると、md124とかmd125とかの
mdマップが自動作成させてしまっているので、一旦それらを停止させる必要があった。

# cat /proc/mdstat で調べると、inactiveとして認識されているが、これが原因の様子。

そこで、
# mdadm --stop --scan でraidアレイをすべて停止させてから、

mdadmのコマンドでマウントさせるためのデバイスを認識させる。
# mdadm --assemble --run --force /dev/md7 /dev/sdd7
接続したHDDはsdd7 認識させるmdもわかりやすくmd7とした。

mdadm: /dev/md7 has been started with 1 drive (out of 2).
と出れば、dev配下にmd7として認識されたことになる。

# mkdir /mnt/nas_hdd
わかりやすくnas_hddというディレクトリを作成し、マウント

# mount /dev/md7 /mnt/nas_hdd

アンマウントは、通常通り、
# umount /mnt/nas_hdd で良い。


転ばぬ先の杖はちゃんと用意しないといけないですね。
こんな作業知らないで済むならその方が良いし、消えて欲しくないデータなので、
精神衛生上あまり宜しくない作業だった。

RAIDは便利だけど、起動しなくなった時はつらいなぁ。

2021/05/31

定点カメラ motionを使って定点カメラ

motionをraspberry pi4に入れて定点カメラとして動かしたい
インストール
$ sudo apt install motion
設定
$ sudo nano /etc/motion/motion.conf 

設定はごにょごにょする。
自動起動については、
daemon on
とすれば、自動起動になる。

 

USB接続のカメラを使うとき
$ lsusb で接続を確認
$ ls /dev/video*
等でカメラのIDを確認して、設定してあげればよい。

 尚、複数台のカメラを動かす場合は、

thread /usr/local/etc/thread1.conf
thread /usr/local/etc/thread2.conf
のようにmotionが読込めるディレクトリを作成し、motion.conf に作成したスレッドファイルに絶対パスで指定する必要がある。
制御するWebカメラが1台の場合は、motion.conf に全てを記述し、threadファイルは必要なし。

usr/local/etc/thread1.conf
共通する設定は motion.conf に、カメラ固有に設定が必要と思われる項目を
thread1.conf、thread2.confに記載する。
motion.conf と thread.conf でパラメーターが重複しても優先されるのは threadファイルとなる。

 ポートは8081等で開放しておくこと。
複数台の場合は、当たり前だが各々開放が必要なので、定義のこと。

/etc/motion/thread1.conf
# カメラデバイスの指定(ここをvideo0等の割当先に指定する。)
videodevice /dev/video0
# Webブラウザから画角調整やキャプチャ動作を確認のためポート設定
stream_port 8081

 

 
 

 




2021/05/07

PHP7以前 クエリ結果のカラム文字列を取得できない場合(2GB文字列問題)

データベースのカラムからデータを取得し、phpで扱う作業を行った際、
文字列を取得してこなくて、酷く嵌ったので、オボエガキ。

PHP7とPHP5で平行稼働させている類似のプログラムがあり、
先にPHP7を修正し、追加のカラムの文字列を取得させると、意図する通りに動作した。

続いてPHP5を動かすが、 取得してこない。

 

色々調べたところ、PHP(7以前)の文字列型は2GB以上の文字列を処理できない
正確には、nverchar等でカラムサイズが2147483647(int4の最大値)
で定義されている場合、PHP内でうまく扱えず、空白として処理されてしまうようだ。

PHPのzvalue_value共用体で文字列長をint型で管理しているため、
文字列の長さが2147483647を超えるとマイナスになってしまうことが原因らしい

PHP5のまま稼働させる必要があったので、クエリにてレコードを取得する際に、

select CONVERT(VARCHAR(512), <カラム名>) as hoge from <table名> where ~;

 

のように、varcharのサイズを指定してカラムを取得すれば,以降PHP内でカラムの文字列を扱えた。

3時間くらい同僚と嵌ってしまい、困ったので、忘れないように残しておく。



2021/03/02

rapidSSL サーバ証明書更新のオボエガキ

前提
opensslコマンドがつかる環境である事

申込後
WEBサイトから更新の申し込みを行い、その際取得した、CSRとKEYをテキストファイルに
貼り付け、 key.txt と csr.txt 等の名前で作業ディレクトリに保存 
key.txtをサーバにアップするため、RSA形式に変換


# openssl rsa -in key.txt -out <サーバにアップする際の名前>.key
# openssl rsa -in key.txt -out hoge_2021rsa.key
(今回は仮として、hoge_2021rsa.key とする)
-----BEGIN RSA PRIVATE KEY----- から
-----END RSA PRIVATE KEY-----  のRSA形式の秘密鍵に変換できる。

中間証明書をrapidSSLのサイトから取得
https://www.geotrust.co.jp/resources/rapidssl/repository/intermediate_sha2.html
ここが正規の所みたいだが、RapidSSLの人は、デジサートのアカウントじゃないから、
2021年の3月以降は、このページではサポートしないようである。
3月以降下のURLにリダイレクトさせると記載されている。
https://knowledge.digicert.com/ja/jp/solution/SOT0018.html?_ga=2.199517224.764125246.1614230988-505583794.1614230987
リンク先にある、テキストフィールドの
「—–BEGIN CERTIFICATE —–」から
「—–END CERTIFICATE—–」をテキストに貼り付けて、
中間証明書のcrtファイルとして保存する。(仮にintermediate_2021.crt とする)

 2021-03現在、crtファイルの生成に、DNS テキストフィールドを利用して
認証させる方法をrapidSSLが採用しているので、
サーバのnamed.serviceの設定ファイルにTXTレコードを追記し、
named.serviceを再起動させる。

DNSサーバツールであるbindがインストールされているはずだが、
無い場合は、インストールしておく。弊社はbindで動いている。
# yum install bind
# yum install bind-utils

設定ファイルは以下に保存されているはずなので、

/etc/named.conf の中に記載の ディレクトリにあるdbに追記TXTレコードを追記

・・・
options {
//listen-on port 53 { 127.0.0.1; };
listen-on port 53 { 192.168.142.31; };
listen-on-v6 port 53 { ::1; };
directory  "/var/named";
dump-file  "/var/named/data/cache_dump.db";
・・・


上記の場合、cache_dump.db に記載すれば良い

TXTレコードは

ドメイン名   :hoge.jp
ホスト名    : 
レコードタイプ : TXT
指定内容(Value):
1234567890abcdef(rapidsslから指示がある文字列)

例: hoge.jp.   IN TXT "
1234567890abcdef"

複数行ある場合は、カンマ区切りで一行に書くこと
(複数行で記載すると、最初の一行だけ反映される仕様のようだ)

DNSサーバ再起動後、30分くらいでTXTレコードが拾えるようになるはず。

googleさんにお願いしてhoge.jpのTXTレコードを照会する場合
$ dig @8.8.8.8 hoge.jp TXT 
;; ANSWER SECTION:
hoge.jp.         2xxxx   IN      TXT     "
1234567890abcdef"

こう帰ってくれば、反映されている。

この状態で、
Digicert社(rapidsslの親会社)が定期的にDNSをチェックしている際に、
上手く
TXTレコードに指定の文字列が確認が取れると、承認作業が完了し、Digicert社の審査を経て証明書発行される仕組み。

証明書がメールで送られてくるので、
「—–BEGIN CERTIFICATE —–」から
「—–END CERTIFICATE—–」をテキストに貼り付けて、crtファイルとして保存する。
(今回は、仮に
hoge_2021.crt とする。)

続いて、ssl証明書の配置をする。

設定ファイルは
/etc/httpd/conf.d/ssl.conf
に配置されているので、中身を確認し必要であれば、修正後のファイル名に置き換え等の
作業を行い、指定のディレクトリにRSA形式の秘密鍵と中間証明書.crt、証明書.crt
ファイルを配置した状態(ssl.confの中以下の記載のアドレスにファイルを配置)
#   Server Certificate:
SSLCertificateFile /usr/local/ssl/crt/hoge_2021.crt
#   Server Private Key:
SSLCertificateKeyFile /usr/local/ssl/private/hoge_2021rsa.key
#   Server Certificate Chain:
SSLCertificateChainFile /usr/local/ssl/crt/intermediate_2021.crt

上記のような状態でhttpdを再起動すれば、反映される(はず)
再起動
# systemctl restart httpd



2021/01/26

PHP XMLファイルからデータ取得

PHPにてXML形式のファイルから必要なデータを取得する。

予めssh2が使えるように、
libssh2とssh2のextensionを PHP7にインストールしておく。

#yum install gcc glibc-devel zlib-devel openssl-devel
#yum install --enablerepo=epel,remi,remi-php73 php-devel

本家LIBSSH2サイトへアクセスしwgetで取得
# wget https://www.libssh2.org/download/libssh2-1.9.0.tar.gz
# tar vxzf libssh2-1.9.0.tar.gz
# cd libssh2-1.9.0
# ./configure
# make
# make install

ライブラリ PCELから ssh2のモジュールを取得
# wget https://pecl.php.net/get/ssh2-1.2.tgz
# tar vxzf ssh2-1.2.tgz
# cd ssh2-1.2
# phpize
# ./configure --with-ssh2
# make
# make install

extensionに認識
php.iniに
extension=ssh2.so を記述し、apacheを再起動。

<?php
$filepath="<取得先のxmlファイルのアドレスを指定>";
//SCPでファイル要求
$connection = ssh2_connect('192.168.0.xxx', 22);//22ポートは開放しておく
ssh2_auth_password($connection, '<ユーザ名>', '<パスワード>');
$get_add = "/var/www/html/xml/get.xml";//一旦ローカルに取得
ssh2_scp_recv($connection, $filepath, $get_add);
//file_existsを使い、xmlがあればデータを取得させる
if(file_exists("/var/www/html/xml/get.xml")){
$xml=simplexml_load_file("/var/www/html/xml/get.xml");

//xmlの中身を取得 階層が深い時は、->で階層を深く指定すれば取得できる。
//xmlの構成を以下とした場合
//<address>
//  <zip>100-0001</zip>
//  <add>東京都何某</add>
//</address>

$column_xml = ($xml->address->zip);//zipの中身を取得
echo "取得したxmlのデータ⇒".$column_xml;
}else{
echo "xml取得失敗";
}
//ディレクトリに残存する当該xmlファイルを削除する
array_map('unlink', glob("/var/www/html/xml/get.xml"));
?>

 

2021/01/21

シェル(bash) データベースへのレコードを自動挿入

指定の時間に成ったら、レコードを挿入するためのシェル(bash)

#!/bin/bash
#postgresqlへアクセスし、データを書き込む
psql "postgresql://<ユーザ>:<パスワード>@192.168.0.xxx/<データベース名>" << _EOF
insert into table1 (create_date)
select to_number(to_char(now(), 'YYYYMMDD'),'99999999')
where NOT EXISTS (select 1 from table1 where create_date=to_number(to_char(now(), 'YYYYMMDD'),'99999999'))
_EOF

exit $?


データベースへの格納条件
create_dateは20210121のnumeric型

create_dateに今日の日付が入っているものが存在しなければ、
create_dateに今日の日付「YYYYMMDD」のnumeric型のデータでそのほかはデフォルト値
のレコードを挿入する。
存在すれば、レコードを挿入しない。

これをcronやRUNDECK等を使って指定の時間にシェルを走らせればいい。

Postgresql データ型変換 char numeric date関連

日付の取り扱いでよく使うもののオボエガキ

【1】今日の日付をnumericに20210121に形で格納したい場合
  now()をcharでYYYYMMDD型に加工した後に、numberで8桁の数値に変えればよい
結果  to_number(to_char(now(), 'YYYYMMDD'),'99999999')

 

【2】8桁の数字20210121をタイムスタンプ型にしたい場合
結果 to_timestamp(to_char(’20210121’,'0000-00-00'),'YYYY-MM-DD'))

 

【3】2021-01-21 12:00:00.0 を 2021-01-21のタイムスタンプ型で扱いたい場合
結果 to_timestamp(to_char(’2021-01-21 12:00:00.0’,'YYYY-MM-DD'),'YYYY-MM-DD')

 

※【2】と【3】は同じタイムスタンプ型になっているので、
where等で 【2】-【3】> INTERVAL '3 days' 等で経過日数を条件としたり出来る。

 

to_charの扱いとして
to_char(1111,'99999') ⇒ ' 1111' 先頭に空白を含み、指定桁数無視
to_char(1111,'FM99999') ⇒ '1111' 空白なし指定桁数無視
to_char(1111,'00000') ⇒ ' 01111' 先頭に空白と含み指定桁数のゼロを付加
to_char(1111,'FM00000') ⇒ '01111'  空白なし指定桁数のゼロ付加

となる FMをつけないと格納できないようなDBもあり得る。