新しいstrongswanにVPN接続してもパケットが通らなかった

自宅のネットワークにアクセスできるようにIPSec/L2TPのVPNサーバーを使っていた。strongswanとxl2tpdを利用している。

Debian JessieだったかStretchで使っていた設定ファイルをArch Linux ARMにそのまま移した。最新版では使えなくなった設定があるのでsudo journalctl -fで出てくるエラーをつぶして、サービスが動くようにした。

しかし、パケットが通らない。サーバーからpingを打っても、Destination Host Unreachableだった。

LANのip address rangeが192.168.0.0/24で、xl2tpdのip range =  192.168.0.200-192.168.0.220 から 192.168.2.200-192.168.2.220 sudo iptables に変えた。(local ipも合わせる)そして、sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE でNAT通すようにしたら、LANにアクセスできるようになった。

しかし、昔の設定が使えないのは謎なので、さらに調べていたら、どうもルーティングテーブルがおかしい。ip rangeを192.168.0.0/24にしている状態で、VPN接続を行う。そして、ip route get 192.168.0.200を実行すると

$ ip route get 192.168.0.200
192.168.0.200 dev eth0 table 220 src 192.168.0.25 uid 1001
cache

このようになる。

なんかよくわからないtable 220にppp0ではなくeth0経由で通信しようするように設定されている。とりあえず、ip route flush table 220(違ったかも)でルーティングテーブルのこのエントリを消すことで正しくVPNで接続したiPhoneにpingが通るようになった。

https://wiki.strongswan.org/issues/248

If I let charon (and not updown.sh) install the routes (install_routes=yes), this is what happens (10.32.32.200 is the ‘other side’):

とあるので、install_routesというキーワードをヒントに検索したら、次のような設定があることが判明した。

https://wiki.strongswan.org/projects/strongswan/wiki/StrongswanConf

charon.install_routes yes Install routes into a separate routing table for established IPsec tunnels. If disabled a more efficient lookup for source and next-hop addresses is used since 5.5.2.

デフォルトではyesになっているのをnoに変更したら直った。設定ファイルは /etc/strongswan.d/charon.confにあった。

これで、なんとか使えるようになった。

Raspberry Piで新しめのLIRCを使う

Arch Linux ARMとRaspberry Pi 3で使おうとしたが、以下のようなエラーが出て使えなかった。

$ irrecord --device=/dev/lirc0 MyRecord
Using driver devinput on device /dev/lirc0
Driver `devinput' not found (wrong or missing -U/--plugindir?).
accent           alsa_usb         asusdh           atilibusb
atwf83           audio_alsa       awlibusb         bte
bw6130           commandir        creative         creative_infracd
default          dfclibusb        dsp              dvico
ea65             file             ftdi             ftdix
girs             i2cuser          irlink           irtoy
livedrive_midi   livedrive_seq    logitech         macmini
mouseremote      mouseremote_ps2  mp3anywhere      mplay
mplay2           pcmak            pinsys           pixelview
samsung          sb0540           silitek          sonyir
srm7500libusb    tira             tira_raw         udp
uirt2            uirt2_raw        usb_uirt_raw     usbx
zotac

/etc/lirc/lirc_options.confのdriverをからdevinputからdefaultに変更すると使えるようになる。

# These are the default options to lircd, if installed as
# /etc/lirc/lirc_options.conf. See the lircd(8) and lircmd(8)
# manpages for info on the different options.
#
# Some tools including mode2 and irw uses values such as
# driver, device, plugindir and loglevel as fallback values
# in not defined elsewhere.

[lircd]
nodaemon        = False
driver          = default
device          = auto
output          = /var/run/lirc/lircd
pidfile         = /var/run/lirc/lircd.pid
plugindir       = /usr/lib/lirc/plugins
permission      = 666
allow-simulate  = No
repeat-max      = 600
#effective-user =
#listen         = [address:]port
#connect        = host[:port]
#loglevel       = 6
#release        = true
#release_suffix = _EVUP
#logfile        = ...
#driver-options = ...

Raspberry Pi 3をaarch64で動かす

cpuinfoとopenssl speedの結果から見るに、aesアクセラレーターは無いっぽい?あるいは認識されていないのか。パフォーマンスも案の定32bitと比べて悪い様だ。これは、A53が64bit命令を実行できるようにしているのはbig.LITTLEとして使っている場合、突然パフォーマンスコアから省電力コアに切り替わる際に64bit命令が実行できなくて不正な命令になってしまうのを防ぐためで、高速に実行できるかどうかは考えていないためだったはず。

[alarm@alarm ~]$ cat /proc/cpuinfo
processor       : 0
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 2
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 3
BogoMIPS        : 38.40
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

[alarm@alarm ~]$ openssl speed aes-128-cbc
Doing aes-128 cbc for 3s on 16 size blocks: 4187159 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 64 size blocks: 1135520 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 256 size blocks: 291828 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 1024 size blocks: 73494 aes-128 cbc's in 2.98s
Doing aes-128 cbc for 3s on 8192 size blocks: 9211 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 16384 size blocks: 4600 aes-128 cbc's in 2.99s
OpenSSL 1.1.0i  14 Aug 2018
built on: reproducible build, date unspecified
options:bn(64,64) rc4(char) des(int) aes(partial) idea(int) blowfish(ptr)
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/etc/ssl\"" -DENGINESDIR="\"/usr/lib/engines-1.1\""  -Wa,--noexecstack -D_FORTIFY_SOURCE=2 -march=armv8-a -O2 -pipe -fstack-protector-strong -fno-plt -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
aes-128 cbc      22406.20k    24305.44k    24985.94k    25254.31k    25236.29k    25206.15k

Raspberry Pi上のArch Linux ARMでAURのAsteriskをdistccで素早くビルドする

distccを使って、AURパッケージをビルドしようとしていた。しかし、何故かローカルでビルドされて、どうやってもスレーブにコンパイルが振られなかった。結局のところ、-march=nativeがgccの引数に与えられていたのが原因だった模様だった。menuselectでBUILD_NATIVEを無効にすることでビルドすることができた。Ryzen 7 1700を積んでいるPCではHyper-Vを使って8コア割り当てて、仮想マシン上でArch Linuxを走らせて、distccdを動かしている。x86_64 CPUを8コア利用することビルドは10分以内で終わった。configureに2,3分、圧縮にも同じくらいかかっているので、コンパイル自体は5,6分くらいだろうか。Raspberry Pi 3だけでビルドすると20分はかかった。ヒートシンクを取り付けていないので加熱でサーマルスロットリングがかかって遅かったかもしれない。

スレーブ側(PC)

こちらで紹介されているAURパッケージを入れる。/etc/conf.d/distccdを編集して、ローカルネットワークからジョブを送り込めるようにする。そして、 sudo systemctl start distccd-armv7hを実行して、distccdを走らせておく。

マスター側(Raspberry Pi)

~/distccd/hosts

192.168.0.XX:3635,lzo,cpp

trizen -S asteriskを実行した。

pkgbuildを編集するか聞かれたら編集するを選んで、下記のようにする。

build() {
cd ${pkgname}-${pkgver}
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --sbindir=/usr/bin
make menuselect
menuselect/menuselect --disable BUILD_NATIVE
make -j12
}

あとは適当に続行すればよい。

 

追記:日本語音声を入れ忘れていた。

make menuselect
menuselect/menuselect --enable CORE-SOUNDS-JA-WAV --enable CORE-SOUNDS-JA-ULAW
make -j4

Raspberry PiでiSCSIターゲットを利用したい場合Archを使うと楽かも

ArchLinux ARMのRaspberry Pi向けのカーネルには、iSCSIターゲットのカーネルモジュールが用意されているようだ(tar.xzの中身を見たら入っていた)。Raspbianを使わないでArchを使えば簡単にiSCSIターゲットを作れるかもしれない。

Debianの.bashrcは対話的でないと読み込まれない

ふと、.bashrcを見てみたら、次のような記載があった。

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

環境変数の設定をするためにcrontabでスクリプトを走らせるときに.bashrcを読み込んでいたが、無駄なことをしていたようだ。

Windowsでopensslクレートを使う

opensslクレートをGNU ABIで使おうとして苦労した。

MSVC ABIの場合は、特に苦労せず、すんなりとビルドできて、実行もできた。

MSYS2が必要

choco install msys2で入れた。chocolatey使っていなければ、普通にMSYS2をダウンロードしてインストールすればよいと思う。なお、今回はx86_64を使った。

MINGW64と同じOpenSSLが必要

こちらのサイトからダウンロードした。MSYS2に入っているOpenSSLとバージョンを合わせる必要がある。今回はWin64 OpenSSL v1.0.2pを利用した。v1.1系を入れると次のようなエラーが出てビルドできない。

$ OPENSSL_LIB_DIR=/c/OpenSSL-Win64 OPENSSL_INCLUDE_DIR=/c/OpenSSL-Win64/include /c/Users/Akimasa/.cargo/bin/cargo run
   Compiling openssl-sys v0.9.35
error: failed to run custom build command for `openssl-sys v0.9.35`
process didn't exit successfully: `C:\Users\Akimasa\Documents\src\rust_openssl\target\debug\build\openssl-sys-8515c615cbb8f8fa\build-script-main` (exit code: 101)
--- stdout
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_GNU_OPENSSL_LIB_DIR
cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_GNU_OPENSSL_INCLUDE_DIR
cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
cargo:rustc-link-search=native=C:/OpenSSL-Win64
cargo:include=C:/OpenSSL-Win64/include
OPT_LEVEL = Some("0")
TARGET = Some("x86_64-pc-windows-gnu")
HOST = Some("x86_64-pc-windows-gnu")
TARGET = Some("x86_64-pc-windows-gnu")
TARGET = Some("x86_64-pc-windows-gnu")
HOST = Some("x86_64-pc-windows-gnu")
CC_x86_64-pc-windows-gnu = None
CC_x86_64_pc_windows_gnu = None
HOST_CC = None
CC = None
TARGET = Some("x86_64-pc-windows-gnu")
HOST = Some("x86_64-pc-windows-gnu")
CFLAGS_x86_64-pc-windows-gnu = None
CFLAGS_x86_64_pc_windows_gnu = None
HOST_CFLAGS = None
CFLAGS = None
DEBUG = Some("true")
TARGET = Some("x86_64-pc-windows-gnu")
HOST = Some("x86_64-pc-windows-gnu")
CFLAGS_x86_64-pc-windows-gnu = None
CFLAGS_x86_64_pc_windows_gnu = None
HOST_CFLAGS = None
CFLAGS = None
TARGET = Some("x86_64-pc-windows-gnu")
HOST = Some("x86_64-pc-windows-gnu")
CFLAGS_x86_64-pc-windows-gnu = None
CFLAGS_x86_64_pc_windows_gnu = None
HOST_CFLAGS = None
CFLAGS = None
running: "gcc.exe" "-O0" "-ffunction-sections" "-fdata-sections" "-g" "-fno-omit-frame-pointer" "-m64" "-I" "C:/OpenSSL-Win64/include" "-Wall" "-Wextra" "-E" "C:\\Users\\Akimasa\\Documents\\src\\rust_openssl\\target\\debug\\build\\openssl-sys-e711f0916b783511\\out\\expando.c"
exit code: 0
cargo:rustc-cfg=osslconf="OPENSSL_NO_SSL3_METHOD"
cargo:conf=OPENSSL_NO_SSL3_METHOD
cargo:rustc-cfg=ossl101
cargo:rustc-cfg=ossl102
cargo:rustc-cfg=ossl102h
cargo:rustc-cfg=ossl110
cargo:rustc-cfg=ossl110f
cargo:rustc-cfg=ossl110g
cargo:version_number=1010009f
cargo:version=110
cargo:patch=f
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_GNU_OPENSSL_LIBS
cargo:rerun-if-env-changed=OPENSSL_LIBS
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_GNU_OPENSSL_STATIC
cargo:rerun-if-env-changed=OPENSSL_STATIC

--- stderr
thread 'main' panicked at 'OpenSSL libdir at `C:/OpenSSL-Win64` does not contain the required files to either statically or dynamically link OpenSSL', C:\Users\Akimasa\.cargo\registry\src\github.com-1ecc6299db9ec823\openssl-sys-0.9.35\build/main.rs:595:13
note: Run with `RUST_BACKTRACE=1` for a backtrace.

ビルドする

普通にVisual Studio CodeのPowerShellからcargo buildでビルドしたが…

 Running `target\debug\rust_openssl.exe`
error: process didn't exit successfully: `target\debug\rust_openssl.exe` (exit code: 3221225477)

こんなエラーが出て実行できないバイナリが出てくる。

$ OPENSSL_LIB_DIR=/c/OpenSSL-Win64 OPENSSL_INCLUDE_DIR=/c/OpenSSL-Win64/include /c/Users/Akimasa/.cargo/bin/cargo run

先ほどにも出てきたが、MINGW64を使って上記のコマンドを実行する必要がある。

こちらの投稿が参考になった

念のためもう一度試したら、PowerShellでもビルドが通って、実行もできたので頭を抱えている。

下記のようにOPENSSL_LIB_DIRとOPENSSL_INCLUDE_DIRを指定する必要がある。あと、MINGW64(自分の場合は”C:\tools\msys64\mingw64\bin”だった)へPATHを通す必要もある。

$env:OPENSSL_LIB_DIR="C:\OpenSSL-Win64\"
$env:OPENSSL_INCLUDE_DIR="C:\OpenSSL-Win64\include"
$env:PATH="$env:PATH;C:\tools\msys64\mingw64\bin