he.net を使った IPv6 トンネル
IPv6 の導入の実験として、IPv6トンネルを無料で利用できる he.net を使って設定してみた。
現在、自宅サーバ自体を IPv6 対応することはできたけど、サーバ配下のパソコンもこのトンネルを使うようにできていないので、まだ目標の半分。
he.netへの登録
Hurricane Electric(he.net)の接続方法を紹介しているサイトの記事を見ながら、he.net に利用者登録をして、トンネルの割り当てを受ける。
トンネル起動の設定
he.netのサイトで、上記の登録が終わると、”Example of Configuration”のタブで、OSを選べば、接続するための設定ファイルのサンプルが表示される。
ただ、Debian/Ubuntu を選ぶと、/etc/network/interfaces 用の設定が示された。自宅サーバは systemd を使っているので、このままでは使えない。ほかのサイトで調べて、最終的に以下に落ち着いた。
(( /etc/systemd/system/he-ipv6.service )) [Unit] Description=he.net IPv6 tunnel After=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/ip tunnel add he-ipv6 mode sit remote 74.82.xx.xx local 192.168.yy.yy ttl 255 ExecStart=/bin/ip link set he-ipv6 up mtu 1480 ExecStartPost=/bin/sleep 0.3 ; /bin/ip -6 route add ::/0 dev he-ipv6 Execstop=-/bin/ip -6 route del ::/0 dev he-ipv6 ExecStop=/bin/ip link set he-ipv6 down ExecStop=/bin/ip tunnel del he-ipv6 [Install] WantedBy=multi-user.target
systemd の サービス として設定するために、he-ipv6.service ファイルを作成する。
systemd ではサービスの処理を起動/停止するためのコマンドは、ExecStart / ExecStop に記載する。
“ip tunnel add” の remote 欄は、割り当てられたhe.net のIPアドレス、localには自分のグローバルアドレスを指定する。ただし、自宅サイトはルータ内にサーバがあるので、ポートフォワードされたプライベートのアドレスを指定する。
トンネル開通後のIPv6のデフォルトゲートウェイを設定する “ip -6 route add” の実行は、少し間を置かないと失敗するようなので、若干の sleep を挟んだ。ExecStart 行は、通常1行1コマンドしか使えないが、ExecStartPost は、複数コマンドが書けるので、こういう時には便利。
ExecStop でのデフォルトゲートウェイ削除の処理 “ip -6 route del ::/0″では、前述のsleepが無い場合、エラーが出ることがあるので、コマンドの先頭に”-“をつけエラーで止まらないようにしておいた。
# サービスの登録 $ sudo systemctl enable he-ipv6.service # サービスの起動 $ sudo systemctl start he-ipv6.service # サービスの停止 $ sudo systemctl stop he-ipv6.service
ただし、後にも述べるように常時 IPv6 化は現状では問題があるので、systemctl enable は行わないでおく。
RAの設定(ルーティング広告)
ルータ周りの他のパソコンがグローバルなIPv6アドレスが割り当てられるように、RAの設定を行う。実は、リンクローカル”fe80::”での自宅内IPv6ネットワークの運用では、グローバルIPv6が無いので RA が不要だけど、IPv6の DNS をアナウンスが必要なので、今までは DHCPv6 を使っていた。でも、radvd.conf の設定を調べると、アナウンスするプレフィックス設定の欄を “prefix ::/64” と記載すれば、”fe80::”のリンクローカルはアナウンスされないようなので、radvd に変更。”RDNSS”の欄で、自宅内 IPv6 対応なDNSサーバを指定することで、IPv6経由で名前解決をできるようにしておく。
interface eth0
{
AdvSendAdvert on;
AdvManagedFlag on;
AdvOtherConfigFlag on;
# 非リンクローカルなアドレスだけアナウンス
prefix ::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
# DNSは、リンクローカルなDNSサーバをアナウンス
RDNSS fe80::xxxx:xxxx:xxxx:xxxx
{
AdvRDNSSLifetime 30;
};
DNSSL example.jp {
AdvDNSSLLifetime 30;
};
};
この段階で、IPv6 のファイアウォールの設定(ferm)の設定が間違っているのが判明したので、別途修正。
常時IPv6対外接続は問題あり
よく、IPv6 を使うとネット通信速度が速くなると言われているけど、現時点では IPv6 利用者が少ないので、上流が詰まらないだけ。今回のような、IPv4 を使ったIPv6トンネリングでは、IPv4 以上には速くなるはずもないし、IPv6 も無料でサービスを提供している he.net では、上流の輻輳もあるだろうし高速通信も期待できない。
このため、上記の IPv6 接続は単なる自分の勉強用で、必要な時だけ”systemctl start he-ipv6.service”でトンネル接続させる予定。。当面、常時 IPv6 運用はしないだろう。
emacsをsystemdで起動
Linux で OneDrive のクライアントを systemd で起動する方法を知って、”systemctl –user” でできることを調べてみたら、emacs server も systemd で使えるような設定がデフォルトで入ってた。
emacs server
emacs server とは、emacs を常に使いまくるような人向けに、emacs をサーバで起動しておき、emacsclient から起動させる機能。
emacsclient は、端末画面を割り当てるだけなので、emacs のプロセスを1つにできる。
(( emacs server 起動)) $ emacs --daemon (( emacs を使う )) $ emacsclient -nw # emacsエディタの起動 $ emacsclient -e "(kill-emacs)" # 起動したemacs serverを止める
systemd で起動
最近は、”/usr/lib/systemd/user/emacs.service” が書いてあるから、以下のコマンドで簡単にemacsサーバを起動できる。
$ systemctl --user enable emacs # emacs起動を登録しておく $ systemctl --user start emacs # emacs serverを起動
とはいえ、最近は emacs でなんでもする訳でもないし、サーバに無駄な常駐させたくないから、しないけど。
linuxでOneDriveを使う
macOS用のonedriveアプリも更新され、オンデマンド機能が便利。以前は、使わないファイルの同期を外したり、利用頻度の低いファイルのパソコン側のディスク容量圧迫の心配がなくなった。
利便性が上がったし、linux 環境でも改めて使いたくなってきた。以前は、onedrive-d というソフトがあったけど、同じように開発されていた、onedrive の完成度があがってる。
linux用のonedriveを使ってみる。
OneDriveのインストール
$ sudo aptitude install onedrive
認証設定
最初の認証設定を行う。以前のバージョンで設定が残っているようなら、”rm -rf ~/.config/onedrive/” で消せばいい。
$ onedrive Authorize this app visiting: ...URL... このURLをブラウザでアクセスし、OneDriveの認証を行う。 この後、真っ白なページが表示されるので、 このページのURLをコピーする。 Enter the response uri: ここにURLをペースト
これで、使える状態になり同期が始まるけど、OneDrive をサービスで起動させたままにしたいので、ひとまず Ctrl-C で停止させる。
常駐起動させる
新しいバージョンでは、通常ユーザ状態での systemctl 起動に対応しているので、以下のコマンドで、自動起動の登録、および起動を行う。
$ systemctl --user enable onedrive $ systemctl --user start onedrive
SambaがWindowsのネットワークから見えない
サーバが、Windows10のエクスプローラのネットワークから見えない。
どうも、Windows側で、「Windowsの機能の有効化または無効化」で、”SMB 1.0/CIFS Client” の設定が必要みたいで、設定したけど、また見えなくなった。
参考となる記事を探していたけど、IPv6 の問題が指摘されていたものがあった。自宅では、IPv6 が一応使えるようにしてあるし、設定を見直し。
(( /etc/samba/smb.conf )) [global] # CIFS標準の SMB1 では見えないようなので、SMB3 を使えるようにする client max protocol = SMB3 # IPv6 からのアクセスを受け付けるようにする。 hosts allow = 192.0.0.0/8 192.168.0.0/16 fe80::/10 : $ sudo /etc/init.d/smbd restart ; sudo /etc/init.d/nmbd restart
IPv6 用の hosts allow を加えたら、Windows から サーバが見えるようになった。
wsltty いいね
Windows 10でLinux環境を WSL で使っているけど、cmd.exe が動くコンソールの動きに色々と違和感を感じていた。WSLが出始めた頃なら、フォントの文字化けとか酷かったけど、最近はかなりマシに動いていても、画面の反応のタイミングが微妙だったり。
ネットの記事を探していたら、wsltty の紹介記事をみつけた。 試しに入れてみたけど、違和感ない。
今まで、あまり使ってこなかったけど、コンソールの背景が透ける設定も悪くない。ウィンドウ開きまくりだと、隠れたウィンドウがどこかのヒントとして、背景透過ってアリだな。
香港からのアクセス制限解除
自宅サーバは、少しでも危険な攻撃を避けるために、国ごとのIPアドレスの配布状況にあわせアクセス拒否をしている。
しかし、明日からの香港での学会参加に合わせ、アクセス拒否の設定を外した。一時的だけどね。
apachectl graceful で segfault part2
以前、apachectl graceful を実行すると、segfault で子プロセスが止まっていて、php7.3 に 統一したら、なぜかしら問題解決をしていたが、症状が再発。
また、mbstring で segfault が発生している。
解決しないので、/etc/logrotate.d/apache2 を修正
/var/log/apache2/*.log {
:
postrotate
if invoke-rc.d apache2 status > /dev/null 2>&1; then ¥
invoke-rc.d apache2 stop > /dev/null 2>&1; ¥
invoke-rc.d apache2 start > /dev/null 2>&1; ¥
fi ;
endscript
}
添付ファイル付きメールの送信
WatchOS5 を使うと、メール添付画像を見ることができるので、監視システムなどから画像付きでメールを送りたくなった。HTML形式で画像へのリンクを送っても画像はみえない。
#!/usr/bin/perl
=head1 使用方法
mail-mixed.jp [options] 宛先... 標準入力をメール本文として送る
-t --to 宛先
-c --cc CC宛先
-b --bcc BCC宛先
-f --from 差し出し人
-s --subject タイトル
-a --attach 添付
-h --html HTML形式かどうか
=cut
use warnings ;
use Getopt::Long ;
use Jcode ;
use Encode ;
use utf8 ;
use MIME::Lite ;
use File::MimeInfo::Magic ;
my $m_from = "" ;
my $m_html = 0 ;
my @m_attach = () ;
my @m_to = () ;
my @m_cc = () ;
my @m_bcc = () ;
my $m_body = "" ;
# オプションの読み込み
GetOptions( 'to=s' => \@m_to , 'cc=s' => \@m_cc , 'bcc=s' => \@m_bcc ,
'from=s' => \$m_from ,
'subject=s' => \$m_subject ,
'attach=s' => \@m_attach ,
'html' => \$m_html ,
) ;
# 残りのオプション To として扱う
@m_to = ( @m_to , @ARGV ) ;
# 標準入力はメール本文
while( ) {
$m_body .= $_ ;
}
# メール MIME::Lite用引数
my %arg = () ;
$arg{From} = $m_from ;
if ( $m_html ) {
# $arg{Subject} = encode( 'MIME-Header' , $m_subject ) ;
# UTF-8だと文字化けするぞ
# $arg{Subject} = encode( 'MIME-Header-UTF_8' , Jcode->new( $m_subject )->utf8 ) ;
$arg{Subject} = encode( 'MIME-Header-ISO_2022_JP' , Jcode->new( $m_subject )->jis ) ;
} else {
$arg{Subject} = encode( 'MIME-Header-ISO_2022_JP' , Jcode->new( $m_subject )->jis ) ;
}
$arg{To} = join( ", " , @m_to ) if ( @m_to > 0 ) ;
$arg{Cc} = join( ", " , @m_cc ) if ( @m_cc > 0 ) ;
$arg{Bcc} = join( ", " , @m_bcc ) if ( @m_bcc > 0 ) ;
$arg{Type} = 'multipart/mixed' ;
# メール全体の作成
my $msg = MIME::Lite->new( %arg ) ;
# メール本文の作成
if ( $m_html ) {
# HTML形式ではUTF-8を使う
$msg->attach(
Type => 'text/html; charset="utf-8"' ,
Data => Jcode->new( $m_body )->utf8 ) ;
} else {
# それ以外は日本語ISO-2022-JP
$msg->attach(
Type => 'text/plain; charset="iso-2022-jp"' ,
Encoding => '7bit' ,
Data => Jcode->new( $m_body )->jis ) ;
}
# 添付ファイルを付ける
foreach my $file ( @m_attach ) {
if ( -r $file ) {
my $r_file = $file ;
# ファイル名のディレクトリ部を削除
$r_file =~ s/^.*\/// ;
# 添付
$msg->attach(
Type => mimetype( $file ) ,
Path => $file ,
Filename => $r_file ,
Disposition => 'attachment' ) ;
}
}
# メールを送る
$msg->send ;
### Local Variables: ###
### mode: perl ###
### End: ###
dhcp-evalの使い方
自宅ネットワークでは、利用する機器の状態を把握するために固定IPアドレスを割り振っているが、DHCP の hardware ethernet で、Mac アドレスをみて配布している。この DHCP のリース時に、状態に合わせた処理を起動するための機能がある。
- dhcp-eval(isc-dhcp のマニュアル)
on commit などで script を実行
on commit , on release , on expiry を設定すると、IPアドレス割り振り時にプログラムを起動できる。
# vi /etc/dhcp/dhcpd.conf
:
# IPアドレス割り振り時に on-commit.sh を起動
on commit {
set clip = binary-to-ascii(10, 8, ".",
leased-address);
set clhw = binary-to-ascii(16, 8, ":",
substring(hardware, 1, 6));
execute("/etc/dhcp/on-commit.sh", clip, clhw);
}
# vi /etc/dhcp/on-commit.sh
#!/bin/bash
# IPアドレスを割り振り時にメールを送る
IP=$1
MAC=$2
if [ -n "$IP" -a -n "$MAC" ]; then
echo "$IP $MAC" \
| /usr/bin/mail -s "dhcp on commit" foo@example.com
fi
on commit の例で示した方法は、DHCPがアドレスをリースする度に呼び出される。スクリプトは同期して行われるため、遅い処理の場合には アドレス割り振りに支障がでるかもしれない。よって、スクリプトはシンプルなものを使う必要がある。
自宅では、host { fixed-address … } で、固定しているとはいえ WiFi なスマホだと、電波強度不足で再接続が発生する時だと、頻繁にメールが届くことになる。接続情報を保存するなどの Script を書かないとウザぃ。
host 毎に script を実行
こういうことができると、状況に合わせてリースを制御したくなる。自宅で使う場合だと、子供が長い時間使っている場合には、IPアドレスのリースを失敗させて、ネットワーク接続を切りたいかもしれない。
こういう場合には、host … { } の中に、execute を埋め込むことができる。しかも、execute で実行される script の返り値で、lease を失敗させることもできる。
# /etc/dhcp/dhcpd.conf
:
host game-machine {
hardware ethernet 00:11:22:33:44:55 ;
fixed-address 192.168.11.222 ;
execute( "/etc/dhcp/lease-check.sh ,
"192.168.11.222" ,
"00:11:22:33:44:55" ) ;
}
# vi /etc/dhcp/lease-check.sh
#!/bin/bash
# DHCP接続を判定する script
IP=$1
MAC=$2
if [ -n "$IP" -a -n "$MAC" ]; then
if [ アドレスを許可する条件 ]; then
# 接続許可
exit 1
else
# 接続禁止
exit 0
fi
fi
注意: 最初 lease-check.sh は許可するときに shell-script 成功時を表す exit 0 を返せばいいとおもったけど、逆だったな。
mineo 宛のメールを取り込む
子供の携帯は、mineo を使っているけど、子供の契約変更(auプラン→docomoプラン)の時に、子供のmineo メール宛に送られている確認メールに気づくのが遅れ、手間取った。
子供の mineo メールのアカウントで、転送設定すればいい…と思ったけど、mineo メールにはそんな機能は無いらしい。gmail で mineo のメールを取り込む方法もあるけど、基本は本人任せで契約変更をしたい時だけメールを確認するのなら、自宅のメールサーバに読み込むほうが手っ取り早そう。
そこで、自宅メールサーバで、mineo.jp のメールを取り込む .fetchmailrc を書き、crontab で fetchmail を実行するように設定した。




