2016年11月アーカイブ

Huawei E8231 とロケットモバイル神プラン(エントリーパッケージ)を組み合わせて、FreeBSDの回線が切れたとき用のサブ接続を用意します。

ストレージとして認識されてしまうので usb_modeswitch でNICとして認識できるようにします。

下の例では echo "net.fibs=4" >> /boot/loader.conf などとして、ルーティングテーブルを複数持てるようにしています。

% dmesg
...
ugen0.6: <HUAWEI> at usbus0
umass0: <Mass Storage> on usbus0
umass0:  SCSI over Bulk-Only; quirks = 0x0100
umass0:3:0: Attached to scbus3
cd0 at umass-sim0 bus 0 scbus3 target 0 lun 0
cd0: <HUAWEI Mass Storage 2.31> Removable CD-ROM SCSI-2 device
cd0: Serial Number FFFFFFFFFFFFFFFF
cd0: 40.000MB/s transfers
cd0: Attempt to query device size failed: NOT READY, Medium not present
cd0: quirks=0x10<10_BYTE_ONLY>

% usbconfig
...
ugen0.6: <HUAWEI Mobile HUAWEI> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (500mA)

% usbconfig -d ugen0.6 dump_device_desc
...
ugen0.6: <HUAWEI Mobile HUAWEI> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (500mA)

bLength = 0x0012
bDescriptorType = 0x0001
bcdUSB = 0x0200
bDeviceClass = 0x0000  <Probed by interface class>
bDeviceSubClass = 0x0000
bDeviceProtocol = 0x00ff
bMaxPacketSize0 = 0x0040
idVendor = 0x12d1
idProduct = 0x1f01
bcdDevice = 0x0102
iManufacturer = 0x0001  <HUAWEI>
iProduct = 0x0002  <HUAWEI Mobile>
iSerialNumber = 0x0003  <FFFFFFFFFFFFFFFF>
bNumConfigurations = 0x0001

% usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000011062000000101000100000000000000'

% ifconfig ue0
ue0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:1e:xx:xx:00:00
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

% dhclient ue0
DHCPDISCOVER on ue0 to 255.255.255.255 port 67 interval 8
DHCPOFFER from 192.168.8.1
DHCPREQUEST on ue0 to 255.255.255.255 port 67
DHCPACK from 192.168.8.1
bound to 192.168.8.100 -- renewal in 43200 seconds.

% setfib 1 route add default 192.168.8.1

% setfib 1 ping 8.8.8.8

http://192.168.8.1/ にアクセスすると管理画面が表示されます。

コネクション毎にIPが変わるようなので、autosshを使ってコネクションを張るようにしておきます。

次のようにして Huawei E8231 を挿すだけで、張れるようになりました。

% cat /etc/devd/huawei.conf 
attach 100 {
        match  "vendor"    "0x12d1";
        match  "product"   "0x1f01";
        action "/etc/devd/huawei_e8231.pl";
};

% cat /etc/devd/huawei_e8231.pl 
#!/usr/local/bin/perl

use strict;
use feature ":5.10";

$|=1;

my @cmd = (
    "/usr/local/sbin/usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000011062000000101000100000000000000'",
    q|perl -E '$try=10; while ($try--) { system("ifconfig ue0 > /dev/null")==0 ? exit 0 : sleep 1 } exit 256'|,
    "dhclient ue0",
    "setfib 1 route add default 192.168.8.1",
    "setfib 1 service autossh_sub restart",
);

for (@cmd) {
    say "--> $_";
    my $ret = system($_);
    if ($ret == 0) {
        next;
    }
    else {
        say "failed. ret: $ret";
        exit 256;
    }
}
say "succeeded.";
exit 0;

% cat /usr/local/etc/rc.d/autossh_sub
#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: autossh_sub
# REQUIRE: DAEMON
# KEYWORD: shutdown
#

. /etc/rc.subr

name=autossh_sub
rcvar=autossh_sub_enable

: ${autossh_sub_enable:="NO"}

start_cmd=autossh_sub_start
pidfile="/var/run/autossh_sub.pid"
extra_commands="status"
procname="autossh"

autossh_sub_start() {
        AUTOSSH_PIDFILE=$pidfile AUTOSSH_POLL=10 setfib 1 /usr/local/bin/autossh -f -M 12346 you@yourvps.jp -R 12345:127.0.0.1:22 -i /home/you/.ssh/id_rsa.plain -o "StrictHostKeyChecking no" -N
}

load_rc_config $name
run_rc_command $1

% sysrc autossh_sub_enable=YES

% service devd restart

yourvps.jp から ssh -p 12345 localhost で接続できるようになりました。