2018年4月 1日 (日)

rpi-updateしたら、VPNクライアントが繋げなくなった(XL2TP/IPSEC)

rpi-updateしたところ、VPNクライアントから接続できなくなってしまいました。

メッセージは以下。
# tail -f /var/log/syslog
----
Apr 1 20:54:11 raspberrypi3 xl2tpd[3151]: udp_xmit failed to 192.168.0.12:35733 with err=-1:No such device
Apr 1 20:54:12 raspberrypi3 xl2tpd[3151]: udp_xmit failed to 192.168.0.12:35733 with err=-1:No such device
Apr 1 20:54:13 raspberrypi3 xl2tpd[3151]: control_finish: Peer requested tunnel 31445 twice, ignoring second one.
Apr 1 20:54:13 raspberrypi3 xl2tpd[3151]: udp_xmit failed to 192.168.0.12:35733 with err=-1:No such device
Apr 1 20:54:14 raspberrypi3 xl2tpd[3151]: udp_xmit failed to 192.168.0.12:35733 with err=-1:No such device
Apr 1 20:54:15 raspberrypi3 xl2tpd[3151]: control_finish: Peer requested tunnel 31445 twice, ignoring second one.
Apr 1 20:54:15 raspberrypi3 xl2tpd[3151]: udp_xmit failed to 192.168.0.12:35733 with err=-1:No such device
Apr 1 20:54:17 raspberrypi3 xl2tpd[3151]: control_finish: Peer requested tunnel 31445 twice, ignoring second one.
Apr 1 20:54:17 raspberrypi3 xl2tpd[3151]: udp_xmit failed to 192.168.0.12:35733 with err=-1:No such device
Apr 1 20:54:18 raspberrypi3 xl2tpd[3151]: udp_xmit failed to 192.168.0.12:35733 with err=-1:No such device
----

ググると、https://github.com/libreswan/libreswan/issues/140 で、カーネル4.14でxl2tpが同様のエラーで繋がらなくなる事象があるとのこと。

現在のカーネルバージョンは
# uname -a
----
Linux raspberrypi3 4.14.31-v7+ #1104 SMP Thu Mar 29 16:52:18 BST 2018 armv7l GNU/Linux
----
なので、該当しているかも知れません。

以前のカーネルに戻して様子を見ます。

https://github.com/Hexxeh/rpi-firmware/commits/master

4.9系の最終である「Kernel: Bump to 4.9.80」を選択して右側のボタンから「Copy the full SHA」。
以下を実行してカーネルを更新。

# sudo rpi-update 5c80565c5c0c7f820258c792a98b56f22db2dd03

再起動して確認すると、4.9.80に戻っています。
uname -a
----
Linux raspberrypi3 4.9.80-v7+ #1092 SMP Fri Feb 9 13:56:00 GMT 2018 armv7l GNU/Linux
----

VPNクライアントも問題なく繋がるようになりました。


rpi-updateで任意の古いカーネルに戻す

本日rpi-updateしたところ、VPNクライアントから繋がらなくなってしまったため、古いカーネル(4.9.x)に戻して対処しました。

https://github.com/Hexxeh/rpi-update によると、

To upgrade/downgrade to a specific firmware revision, specify its Git hash (from the https://github.com/Hexxeh/rpi-firmware repository) as follows:

# sudo rpi-update #gitハッシュ値

で好きなカーネルに入れ替えられるようです。

いまの(VPNが繋がらない)カーネル。
# uname -a
----
Linux raspberrypi 4.14.31-v7+ #1104 SMP Thu Mar 29 16:52:18 BST 2018 armv7l GNU/Linux
----

戻したいカーネルを探す。
https://github.com/Hexxeh/rpi-firmware/commits/master

Kernel: Bump to X.X.XX (今回は、Kernel: Bump to 4.9.80)を探し
右側のボタンから「Copy the full SHA」を選択する。

今回は「5c80565c5c0c7f820258c792a98b56f22db2dd03」なので

# sudo rpi-update 5c80565c5c0c7f820258c792a98b56f22db2dd03

再起動して確認。

uname -a
----
Linux raspberrypi 4.9.80-v7+ #1092 SMP Fri Feb 9 13:56:00 GMT 2018 armv7l GNU/Linux
----

VPNクライアントも無事に繋がるようになりました。

(4/24追記)
/bootに古い .firmware_revision があると、このコマンドでは戻せないようです。
あらかじめ.firmware_revision ファイルを改名しておきます。

cd /boot
sudo mv .firmware_revision .firmware_revision_old

この後、rpi-updateしてうまく行きました。

2017年4月27日 (木)

atniftyのダイナミックDNSサービスの更新方法が変更された

@niftyのダイナミックDNSサービスhttp://domain.nifty.com/domain/ddns.htm ですが、4月途中から IP更新方法が内部的に変更されたようです。
見た目は変わらないので、手動で更新してた人は無関係です。スクリプト組んで自動更新してた人がNGです。
@nifty DDNS更新スクリプト さんのスクリプトではうまく動かなくなってしまいましたが、ちょっと追加して、うまく動くようになりました。

$conf_ipaddr の値を変えればよいようです。

----
#my $conf_ipaddr = "DDNS_CHANGE_IP"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
my $conf_ipaddr = "DDNS_CHANGE_IP=IP%95%CF%8DX%83y%81%5B%83W%82%D6"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
----

全体としては以下。


----
#!/usr/bin/perl -w
use strict;
use Encode;

#------------------------------------------------------------------------------#
# 2009.09.26 #
# @nifty DDNSサービスのIPアドレス更新を行うスクリプト(niftyddns.pl) #
# #
# このスクリプトには@niftyのユーザIDとパスワードをテキストで埋め込むため、スク #
# リプトファイルのパーミッションモードは0700としておく方が良い。 #
# このスクリプトを定期的に実行するためにクローンに登録する。なお、IPアドレスの #
# 更新が無い場合でも1週間(期間は以下の変数でカスタマイズ可能)に一度は更新処理 #
# をする(スクリプトが自動で判断して実行)。 #
# crontabの例) #
# 0,10,20,30,40,50 * * * * hogehoge /home/hogehoge/bin/niftyddns.pl #
# #
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# グローバル変数
## ユーザ毎にカスタマイズが必要な変数
my $niftyid = "hogehoge"; # @niftyのユーザID
my $niftypasswd = "mypassword"; # @niftyのパスワード
my $basedir = "/home/pi/niftyddns"; # このスクリプトをインストールするディレクトリ
my $datadir = "$basedir/atniftyddns"; # このスクリプトで使うファイル(IPアドレスの保存ファイル、wgetの出力結果等)を保存するディレクトリ
my $addrfile = "$datadir/prev_ip.txt"; # 前回のIPアドレスを保存するファイル名
my $updatetime = "$datadir/update.txt"; # 前回、IPアドレス更新を実行した時間(time関数値)を保存するファイル名
my $resultfile = "$datadir/result.txt"; # スクリプトの結果(IPアドレスに変更が無かったか、あるいはIPアドレス更新処理をしたか)を記録するファイル名
my $interval = 7; # IPアドレス変更が無い場合でもこの変数で指定された日にち(デフォルト7日)が経過したら更新処理を行う

## カスタマイズ不要な変数
my $atniftyddns = "http://domain.nifty.com/domain/DdnsIpChangeConfirm.do"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
#my $conf_ipaddr = "DDNS_CHANGE_IP"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
my $conf_ipaddr = "DDNS_CHANGE_IP=IP%95%CF%8DX%83y%81%5B%83W%82%D6"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
my $update_ip = "DDNS_UPDATE_IP_ADDRESS"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
my $wget;
my $current_ip; # 現在のIPアドレス
my $previous_ip; # 前回のIPアドレス
my $change = 1; # 前回のIPアドレスと現在のIPアドレスが一致していない場合、または、初めてこのスクリプトを実行する場合に1にセッ ト
my $updated; # $updatetimeファイルに保存されているIPアドレス更新実行時間
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# スクリプトで使うファイルの保存ディレクトリが無い場合にディレクトリを作成
if( !-d $datadir ) {
mkdir( $datadir, 0755 ) || die "ディレクトリ生成失敗 : $!";
}
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# @nifty DDNSのIPアドレス更新ページをwgetでアクセスし、現在のIPアドレスを確認
$wget = `wget --secure-protocol=auto -O - -q $atniftyddns?$conf_ipaddr`;
$wget =~/[0-9]+(\.[0-9]+){3}/;
$current_ip = $&;
#print "Current IP: $current_ip\n";
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# 前回のIPアドレスと現在のIPアドレスが一致するか比較し、一致していない場合には
# IPアドレスが変更したとして$changeフラグをセット

## 前回のIPアドレスを保存しているファイルが存在している場合は現在のIPアドレスと
## 一致するか確認
if ( -e $addrfile ) {
open( FH, "<$addrfile" );
$previous_ip = ;
#print "Previous IP: $previous_ip\n";
close( FH );
if ( $current_ip eq $previous_ip ) {
$change = 0;
}
else {
unlink $addrfile;
open( FH, ">$addrfile" );
print FH $current_ip;
close( FH );
}
}
## 前回のIPアドレスを保存しているファイルが存在しない場合は現在のIPアドレスを
## 保存
else {
open( FH, ">$addrfile" );
print FH $current_ip;
close( FH );
}
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# 最終更新時から$intervalで指定した日数経過している場合は、IPアドレスに変更が
# なくても更新処理を実行する($changeフラグをセットする)
if ( -e $updatetime ) {
open( FH, "<$updatetime" );
$updated = ;
close( FH );
if ( $updated <= time - ( $interval * 24 * 3600 ) ) {
$change = 1;
unlink $updatetime;
open( FH, ">$updatetime" );
print FH time;
close FH;
}
}
else {
$change = 1;
open( FH, ">$updatetime" );
print FH time;
close FH;
}
#------------------------------------------------------------------------------#
# $changeフラグがセットしてある場合、IPアドレス更新を実行し、IPアドレス保存ファ
# イルに保存しているIPアドレスを現在のIPアドレスに更新
if ( $change ) {
if ( -e $resultfile ) {
unlink( $resultfile );
}
$wget = `wget --secure-protocol=auto -O - -q --http-user=$niftyid --http-password=$niftypasswd $atniftyddns?$update_ip`;
$wget =~/[0-9]+(\.[0-9]+){3}/;
$current_ip = $&;
my $remain = $';
$remain =~/
/;
$remain = $`;
Encode::from_to($remain, 'shiftjis', 'utf-8');
open( FH, ">$resultfile" );
print FH $current_ip . $remain . "\n";
close( FH );
}
else {
unlink( $resultfile );
open( FH, ">$resultfile" );
print FH "IPアドレス($current_ip)は変更されていません。\n";
close( FH );
}
----

2017年1月15日 (日)

AliExpressで Raspberry Pi用の3.5inch LCDを買いました

AliExpressで RaspberryPi用の3.5inch LCDが$11.45ということで職場のかたと共同で購入してみました。
12/23に購入し1/6に受け取ったので、ちょうど2週間くらいです。

Img_20170115_151033

あらかじめLCD用ドライバが含まれたOSイメージを使う方法と
純正OSに、自分でドライバを追加する方法の、2種類があるようです

参考サイト
3.5inch RPi LCD (A)
Drive the LCD(Raspbian/Ubuntu mate)

今回は純正OS(Raspbian 2017-01-11版)に自分でドライバを追加する方法を試してみました。
Raspbianは既にインストールされているものとします。

ドライバをダウンロード
$ wget http://www.spotpear.com/download/diver24-5/LCD-show-161112.tar.gz

ファイルを展開
$ tar xzvf LCD-show-161112.tar.gz

この時点でLCDを装着しておきます。(この後いきなりリブートするので)

$ cd LCD-SHOW
$ sudo ./LCD35-show

再起動すると、使えるようになります。
タッチパネルも動きます。
Img_20170115_143351

キーボードが無いと不便なので、マッチボックスキーボードを入れておきます。
$ sudo apt-get update
$ sudo apt-get install matchbox-keyboard

アクセサリ -> keyboard で起動できます。

Img_20170115_142816

画面を回転させることも出来ます。(リブートが必要)
90度回転させるには、90を指定します。0、90、180、270が指定できるようです。

$ cd LCD-show/
$ sudo ./LCD35-show 90

Img_20170115_144505

以上

アプリによってはウィンドウが画面外へはみ出してしまいOKボタン等が押せないこともある(詰み...)、あまり実用的では無いですが、ちょっと面白かったです。

おまけ
LXDEのフォントを小さくするための設定が入っている場所;

$ vi ~/.config/pcmanfm/LXDE-pi/desktop-items-0.conf
----
desktop_font=Roboto Light 12
----

$ vi ~/.config/lxsession/LXDE-pi
----
sGtk/FontName=Roboto Light 12
----

$ vi ~/.config/lxpanel/LXDE-pi/panels/panel
----
fontsize=12
----

$ vi ~/.config/gtk-3.0/gtk.css
----
font: Roboto Light 12;
----

(1/17)追記
xrdpをインストールしましたが、リモートデスクトップ接続できないことが判明。
原因不明(調べてない)

2016年12月13日 (火)

秋月の温湿度・気圧センサモジュールAE-BME280で、温度・湿度・気圧を取得する(2/2)

Cactiで表示させてみることにしました。

(1)カスタマイズグラフの作り方
まずスクリプトを作る
cd /usr/local/share/cacti/scripts

sudo vi bme280_temp.pl
----
#!/usr/local/bin/perl
$val = `/usr/bin/python /home/pi/bme280_sample.py |grep temp |awk '{print $3}'`;
print $val;
----
:wq
実行権付与
sudo chmod +x bme280_temp.pl

(2)Data Input Method画面
----
name: bme280_temp
Input Type: Script/command
Input String: perl /usr/local/share/cacti/scripts/bme280_temp.pl
----

ただ、これではうまく行かない。
ログに延々エラーが出ていた。
tail /var/log/cacti/poller-error.log
----
Traceback (most recent call last):
File "/home/pi/bme280_sample.py", line 9, in
bus = SMBus(bus_number)
File "/usr/local/lib/python2.7/dist-packages/smbus2/smbus2.py", line 132, in __init__
self.open(bus)
File "/usr/local/lib/python2.7/dist-packages/smbus2/smbus2.py", line 142, in open
self.fd = os.open("/dev/i2c-{}".format(bus), os.O_RDWR)
OSError: [Errno 13] Permission denied: '/dev/i2c-1'
----

www-dataでは/dev/i2c-1を読む権限がないらしい

(3)無理矢理パスワードを付けて
sudo passwd www-data

(4)soduersに追加
sudo vi /etc/sudoers
----
www-data ALL=(ALL) NOPASSWD: ALL
----
:wq

うまく(?)出来たようだ
sudo -u www-data sh /usr/local/share/cacti/scripts/bme280_temp.sh
22.54

まあでも、www-dataにsudo権限を付けるのは、セキュリティ的にはどうですかね。

以上

秋月の温湿度・気圧センサモジュールAE-BME280で、温度・湿度・気圧を取得する(1/2)

お手伝いしている会社の勉強会のために、秋月の温湿度・気圧センサモジュールAE-BME280で、温度・湿度・大気圧を得る手順をまとめました。

最近、smbus2が必要になったようです。

Img01013

(1)モジュール接続
割愛

(2)I2C有効化
[Preferences]-[Raspberry Pi Configuration]
[Interfaces」->「I2C」「Enable」

再起動
[YES]

(3)i2cパッケージのインストール
sudo apt-get install i2c-tools
sudo apt-get python-smbus

検出
sudo i2cdetect -y 1

中身を取り出す
sudo i2cdump -y 1 0x76

(4)スイッチサイエンス社のライブラリをダウンロード
wget https://github.com/SWITCHSCIENCE/BME280/archive/master.zip

unzip master.zip

cp -p ./BME280-master/Python27/bme280_sample.py .
python ./bme280_sample.py
----
Traceback (most recent call last):
File "/home/pi/bme280_sample.py", line 3, in
from smbus2 import SMBus
ImportError: No module named smbus2
----
エラーになる。

cd /BME280-master/Python27
cat requirements.txt
----
smbus2>=0.1.3
----
smbus2が必要なようだ。

(5)smbus2のインストール
wget https://github.com/kplindegaard/smbus2/archive/master.zip
unzip master.zip.1
----
Archive: master.zip.1
a115a850ed7c8ecc7438fff0d5c40e230eaf6579
creating: smbus2-master/
inflating: smbus2-master/.travis.yml
inflating: smbus2-master/LICENSE
inflating: smbus2-master/README.md
inflating: smbus2-master/README.rst
inflating: smbus2-master/setup.py
creating: smbus2-master/smbus2/
inflating: smbus2-master/smbus2/__init__.py
inflating: smbus2-master/smbus2/smbus2.py
creating: smbus2-master/tests/
inflating: smbus2-master/tests/test_datatypes.py
inflating: smbus2-master/tests/test_smbus2.py
----

cd smbus2-master
sudo pip install smbus2
----
Downloading/unpacking smbus2
Downloading smbus2-0.1.4.tar.gz
Running setup.py (path:/tmp/pip-build-Eqrjt6/smbus2/setup.py) egg_info for package smbus2

Installing collected packages: smbus2
Running setup.py install for smbus2

Successfully installed smbus2
Cleaning up...
----

(6)動作確認
python ./bme280_sample.py
----
temp : 24.13 ℃
pressure : 1011.14 hPa
hum : 67.66 %
----

以上

2016年12月 6日 (火)

ipset作成メモ(日本のIPv4アドレス一覧)

ipsetで日本のIPv4アドレス一覧を作成したときのメモ

最新のCIDR一覧を取得
wget http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip -f cidr.txt.gz
grep -e "^JP" cidr.txt |awk '{print $2}' >IP_JAPAN
rm cidr.txt

IP_JAPANという名前で一覧を作成
sudo ipset create -exist IP_JAPAN hash:net
while read NET; do sudo ipset add IP_JAPAN $NET; done

※けっこう時間が掛かる

保存
sudo ipset save |sudo tee /etc/ipset.conf

再起動時にipsetをリストアさせる方法

iptablesで日本国外からのアクセスを禁止する設定をしているのですが
ファイアウォールルールが長くなっていろいろ面倒なので、ipsetを使ってみることにしました。
ipsetの内容は再起動時にクリアされてしまうため、うまい方法がないか、考えてみました。

ipsetはインストール&設定済み、の前提で。

■概要
(1)/etc/ipset.confファイルに ipset save する
(2)netfilter-persistent起動時に、ipset restore する。

■詳細
(1)/etc/ipset.confファイルに ipset save
# sudo ipset save |sudo tee /etc/ipset.conf

(2)netfilter-persistent起動時に、ipset restoreする。
# sudo vi /lib/systemd/system/netfilter-persistent.service
----
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no
Before=network.target
Requires=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/bin/sudo /sbin/ipset restore -exist -f /etc/ipset.conf <---これを追加
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target
----
:wq

# sudo systemctl daemon-reload
# sudo systemctl restart netfilter-persistent

以上

2016年11月17日 (木)

Android 6 MarshmallowでL2TP/IPsec VPNが動作しない(openswan編)

HUAWEI P9 Liteを購入しました。
そうしたら、自宅のVPNに接続できなくなってしまいました。
わりと有名な問題のようです。

Android 6 MarshmallowでL2TP/IPsec VPNが動作しない問題を解決する(xl2tpd+openswan)

このかたはopenswanからlibreswanに乗り換えたようですが、パッケージの再セットアップが面倒なのでopenswanで出来ないか調べました。結果は、出来ました。
connセクションにsha2_truncbug=yes を追記すれば良いようです。
libreswanは sha2-truncbug だったので、ハイフンとアンダースコアの違いだけですね。

$ sudo vi /etc/ipsec.conf
----
coon L2TP
<中略>
ike=aes256-sha2_256
phase2alg=aes256-sha2_256
sha2_truncbug=yes
----
$ sudo service ipsec restart
これでOK。Windows7はsha1で、Androidはsha2で繋がります。

ログにこんなメッセージが出ます。
$ tail -f /var/log/auth.log
----
Nov 16 17:45:07 raspberrypi3 pluto[26345]: | authalg converted for sha2 truncation at 96bits instead of IETF's mandated 128bits
Nov 16 17:45:07 raspberrypi3 pluto[26345]: | authalg converted for sha2 truncation at 96bits instead of IETF's mandated 128bits
----

参考にした元記事はこちら。
Cisco 2811 & OpenSWAN SHA256 truncate bug
https://bugzilla.redhat.com/show_bug.cgi?id=1077641

2016年1月12日 (火)

RaspberryPi (4.1.15-v7+) でELECOM WDC-150SU2Mを使う

sudo rpi-update をやったらカーネルが4.1.13-v7+ →4.1.15-v7+ に上がってしまい、ELECOM WDC-150SU2Mが使えなくなってしまった。

参考ページ
https://www.raspberrypi.org/forums/viewtopic.php?p=462982
を見て、カーネルにあったファイルをダウンロードする。

mkdir drivers
cd drivers
wget https://dl.dropboxusercontent.com/u/80256631/8188eu-v7-20151215.tar.gz
tar zxf ./8188eu-v7-20151215.tar.gz
sudo ./install.sh

再起動すれば WDC-150SU2Mが使えるようになる。

«squid 3.5.12-20151128-r13959 失敗編

最近のトラックバック

2021年10月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト
無料ブログはココログ