スキップしてメイン コンテンツに移動

Nucleo-64:Slip over VCPをudevにて自動設定

前回は、手動でSlip over VCPを設定していたのですが、複数台の異なるターゲットを接続する場合も想定すべきではと考えたものの、これを一々設定するのはミスもあるし面倒なので何か良い方法はないかと思案したところ、linux側でudevから接続設定を自動で行うようにすればよいのではと思い、トライしてみました。
まず最初に、全体の構成を記述しておきます。

1. udevにてNucleoのID_SERIAL_SHORTを識別子として利用。
2. udev rule から、systemd を呼び出す。
3. systemdから、さらに、前述のID_SERIAL_SHORT識別子ごとに異なるslip接続を立ち上げるスクリプトを呼び出す。

少しややこしいですね。というのも、実はudevから3のスクリプトを直接よびだしても、5秒ほどでスクリプトがkillされるからです。したがって、対処として、1と3の間に2のsystemdを入れました。こうすることで、udevが呼び出したsystemdスクリプトから呼び出したスクリプトの場合、udevがkillしない/killできないdaemonを実行すること(今回はslattach)ができるからです。説明してもややこしいのは変わりありませんが、設定は比較的簡単です。以下設定です。
1. /etc/udev/rules.d/80-slip-over-vcp.rules の作成
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374e", \
RUN+="/bin/systemctl start slip-over-vcp@$env{ID_SERIAL_SHORT}-%n"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", \
RUN+="/bin/systemctl start slip-over-vcp@$env{ID_SERIAL_SHORT}-%n"
ACTION=="remove", SUBSYSTEM=="tty", \
RUN+="/bin/systemctl stop  slip-over-vcp@$env{ID_SERIAL_SHORT}-%n"
2. udevのリロード
udevadm control --reload
3. systemd スクリプトの作成
# ファイル名 /etc/systemd/system/slip-over-vcp@.service にて以下の内容で作成(注:@以下もファイル名の一部です。)

[Unit]
Description=SLIP over VCP for Nucleo devices

[Service]
Type=forking
Environment="ARGS=%I"
ExecStart=/usr/local/sbin/nucleo-slip-over-vcp.sh "$ARGS"

[Install]
4. systemdスクリプトの登録
systemctl enable slip-over-vcp@.service
5. systemdスクリプトが呼び出す識別子別に設定を記述したslip自動接続スクリプト
# ファイル名 /usr/local/sbin/nucleo-slip-over-vcp.sh (chmod +x)
#!/bin/bash

if [ $# = 0 ]; then
    exit 0
fi

serial=`echo $1 | awk '{print $1}' FS=/`
ifno=`echo $1   | awk '{print $2}' FS=/`

case "$serial" in
  "066AFF56WWWWXXXXYYYYZZZZ" )
    devname="ttyACM$ifno"
    ipaddr=10.0.0.1
    netmsk=255.255.255.0
    ppaddr=10.0.0.2;;
  "0671FF48WWWWXXXXYYYYZZZZ" )
    devname="ttyACM$ifno"
    ipaddr=10.0.1.1
    netmsk=255.255.255.255
    ppaddr=10.0.1.2;;
  "0034002BWWWWXXXXYYYYZZZZ" )
    devname="ttyACM$ifno"
    ipaddr=10.0.2.1
    netmsk=255.255.255.255
    ppaddr=10.0.2.2;;
  *)
    exit 0
esac
  slattach -d -p slip -s 115200 /dev/$devname 2>&1 > /tmp/sov-$devname.log &
  sleep 1 && slif=`cat /tmp/sov-$devname.log | grep interface | awk '{print $6}'`
  ip link set dev $slif up
  ip addr add dev $slif local $ipaddr/$netmsk remote $ppaddr
#  ifconfig $slif $ipaddr netmask $netmsk pointtopoint $ppaddr up
  exit 0
なお、ID_SERIAL_SHORTなどは、以下のコマンドで確認できます。
udevadm info /dev/ttyACM0
6. iptablesにて、Nucleoからのパケットをマスカレード
# Generated by iptables-save v1.8.5 on Tue Dec 15 11:16:25 2020
*filter
:INPUT ACCEPT [20829:1598126]
:FORWARD ACCEPT [20:1620]
:OUTPUT ACCEPT [15478:2023565]
COMMIT
# Completed on Tue Dec 15 11:16:25 2020
# Generated by iptables-save v1.8.5 on Tue Dec 15 11:16:25 2020
*nat
:PREROUTING ACCEPT [4073:523053]
:INPUT ACCEPT [82:16109]
:POSTROUTING ACCEPT [2:120]
:OUTPUT ACCEPT [19:1277]
-A POSTROUTING -o enp3s0 -j MASQUERADE
-A POSTROUTING -o sl0 -j MASQUERADE
-A POSTROUTING -o sl1 -j MASQUERADE
-A POSTROUTING -o sl2 -j MASQUERADE
-A POSTROUTING -o sl3 -j MASQUERADE
COMMIT
# Completed on Tue Dec 15 11:16:25 2020
該当部分は"-A POSTROUTING -o slx -j MASQUERADE"のところです。
設定は以上です。後はLinux機にNucleoを差し込むだけです。正常に動作していれば、slattachのプロセスが立ち上がり、network interface slxが立ち上がります。
9: sl0:  mtu 296 qdisc pfifo_fast state UNKNOWN group default qlen 10
    link/slip
    inet 10.0.1.1 peer 10.0.1.2/32 scope global sl0
       valid_lft forever preferred_lft forever
10: sl1:  mtu 296 qdisc pfifo_fast state UNKNOWN group default qlen 10
    link/slip
    inet 10.0.2.1 peer 10.0.2.2/32 scope global sl1
       valid_lft forever preferred_lft forever
また、取り外すと、systemdがslattachのプロセスを終了させ、networkインターフェースもなくなるようになっています。slipの設定をしていないNucleoを同時に接続しても動作できること、複数台の接続も確認しています。linux再起動時に差し込んだままでも認識しました。今回は以上です。それでは。

コメント

このブログの人気の投稿

Hyper-V Server2019にワークグループ環境下でWindows10(1809)から接続

Hyper-V server 2019に、ワークグループ環境にてWindows10(1809)から接続してみました。Windows10にHyper-V管理ツールがインストールされていることと、Hyper-V Serverをインストール済であることが前提です。以下、Hyper-V serverは名前がHyperVSV、アドレスは192.168.1.110としています。 まず、Hyper-V server上で、powershellを起動し、以下のコマンドを入力します。 Enable-WSManCredSSP -Role Server -Force 続いて、クライアントのWindows10のpowershell で以下のコマンドを入力します。 winrm quickconfig -Force Enable-WSManCredSSP -Role Client -DelegateComputer * -Force さらに、クライアントマシンで、gpedit(グループポリシーエディタ)を起動し、以下の要領でポリシーを設定します。 a. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLMのみのサーバー認証で新しい資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「WSMAN/*」を追加 b. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLM のみのサーバー認証で保存された資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「*」を追加 また、名前解決できるように、(notepadを管理者権限で実行し)C:\Windows\System32\Drivers\etc\hostsにサーバ名とIPアドレスの対を追加。 192.168.1.110 HyperVSV 最後に、Hyper-Vマネージャーを起動し、Windows10からHyper-V サーバに接続します。手順は以下の通りです。 「サーバーに接続」->コンピュータの選択->別のコンピューターに[HyperVSV]と入力し、[別のユーザーとして接続する

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかもしれませ

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-