ページ

2021年4月25日日曜日

NETGEAR製スマートスイッチ GS308T を使用して,NIC が1つしかない PC でルーターを自作する

我が家ではRaspberry Pi にUSB-NIC を接続することで,LAN ポート(NIC)を増設してルーター化していますが,以下のサイトで紹介されているようにタグVLAN を使用することで,LAN ポートを増設すること無く Linux PC をルーター化できることが判ったので,早速試してみました.

Linuxルータのタコ足配線を解消しよう ~ タグVLAN(IEEE 802.1Q)の活用
http://dsas.blog.klab.org/archives/50391881.html
LinuxとVLANで作る、シンプル&スケーラブルネットワークの極意
https://www.irori.org/doc/infra/wd41.html

VLAN に対応したスイッチングハブを所持していなかったため,NETGEAR 製の GS308T を購入しました.5,000 円ちょっとでこれだけ高機能な代物が手に入るのは本当に凄いことだと思います.

近い将来,ネットワークカメラも導入したいと考えているので,PoE 対応製品にすることも考えましたが,GS308T と比べてだいぶ値段が上がってしまうことと,配線の関係から結局ネットワークカメラもWi-Fi 接続になるような気がしたので,PoE については見送ることにしました.

2021年3月23日火曜日

Raspberry Pi ルーターでポートフォワーディングして,LAN 内の VPN に接続する.

最近,自作ルーターの話題ばかりですが今回はポートフォワーディングする話.

なお,これまでのルーターの設定は以下の記事に纏めてある.
Raspberry Pi を楽天ひかりのIPv4 over IPv6(DS-Lite・Xpass)に対応したルーターにする
Raspberry Pi ルーターで DS-Lite と PPPoE 接続を共存させる
Raspberry Pi ルーターに Dynamic DNS を導入する

ざっくり言うと,ラズパイをIPv4 over IPv6接続に対応したルーターに設定することで,回線の混雑を避けて通信速度を維持しつつ,PPPoE接続も共存させることで外部からのアクセスを可能にし,Dynamic DNSによってホスト名による外部からのアクセスを可能にしている.


今回はさらに,ポートフォワーディング機能を追加する.

2021年3月18日木曜日

Raspberry Pi ルーターに Dynamic DNS を導入する

IPv4 over IPv6 接続した Raspberry Pi ルーターに PPPoE 接続を共存させ外部から IPv4 で接続することができるようになったので,Dynamic DNS を導入した.


これまでの設定は以下の記事に纏めてあるので,最初から読みたい方はどうぞ.
Raspberry Pi を楽天ひかりのIPv4 over IPv6(DS-Lite・Xpass)に対応したルーターにする
Raspberry Pi ルーターで DS-Lite と PPPoE 接続を共存させる

今回は無料で使える No-IP を利用する.

初めに,https://www.noip.com/ にアクセスしてアカウントの作成とホスト名の取得を完了したら,以下の記事に従ってクライアントソフトをビルドする.ただし,ルート権限の取得と make install はしないようにする.

2021年3月14日日曜日

Raspberry Pi ルーターで DS-Lite と PPPoE 接続を共存させる

先日,楽天ひかりのIPv4 over IPv6 を利用するための設定方法をまとめたが,(下記参照)
Raspberry Pi を楽天ひかりのIPv4 over IPv6(DS-Lite・Xpass)に対応したルーターにする

今回はその続きとして,PPPoE による接続も共存させる方法.

なぜ,こんなことが必要かというと,DS-Lite方式の接続では,結局のところ,dgw.xpass.jp に対して作成したトンネルの出口をゲートウェイとして使っているので,ルーターがネットの世界と直接繋がっているわけではなく,SSH でルーターにログインしたり,Apacheを立ててHTTPでアクセスしたりすることができない.(正確にはIPv6を使えば接続可能だけど,できれば慣れ親しんだIPv4で接続したい)

これを実現するには,PPPoE の接続が必要になるが,ルーティングテーブルを適切に設定しないと,PPPoE 接続と,DS-Lite 接続のどちらを優先すべきかルーターが判断できなくなってしまう.

これを踏まえ今回は,DS-Liteと共存させるための,PPPoE 接続の方法及びルーティングテーブルの設定方法を記載する.

2021年3月7日日曜日

Raspberry Pi を楽天ひかりのIPv4 over IPv6(DS-Lite・Xpass)に対応したルーターにする

光回線の契約をソフトバンク光から楽天ひかりに乗り換えた.(一年無料なので,ソフトバンクに解約金を払っても十分にお釣りが来る.)

ソフトバンク時代は,IPv4 over IPv6を利用するのに光BBユニットのレンタルが必須だったが,楽天ひかりでは対応したルーターを用いれば専用機器をレンタルする必要はないので,Raspberry PiをDS-Lite・Xpassに対応させてルーターとして可動させた.

同時に,DHCP,RADVD,DNS,さらに,2.4GHz帯/5.0GHz帯のマルチSSD無線LANとしても可動させているので,その設定手順を備忘録として記録する.

最終構成は以下の通り.
 eth0   :ラズパイにある有線LANポート.スイッチングハブと接続する.
 eth1   :USB-NICで拡張した有線LANポート.ONUと接続する.
 wlan0  :ラズパイにある無線LANポート.5.0GHz 帯無線LANアクセスポイントとして動作させる.
 wlan1  :USBドングルで拡張した無線LANポート.2.4GHz 帯無線LANアクセスポイントとして動作させる.
 br0    :eth0,wlan0,wlan1をつなぐブリッジ.192.168.100.1/24に設定する.
 ds-lite:IPv4 over IPv6用のトンネル.

 br0 に DPCP及びRADVD を設定し,接続した機器には自動でIPv4アドレス及びIPv6アドレスを振るように設定.

2021年2月27日土曜日

Bash でプロセスの死活チェックをスマートにやる方法

プロセス名を hogehoge としたとき,

よく見かけるのはこんな感じ.
#!/bin/bash

ProcessName=hogehoge

IsActive=`ps aux | grep ${ProcessName} | grep -v grep | wc -l`

if [ ${IsActive} -gt 0 ]; then
  echo "${ProcessName} is Active."
else
  echo "${ProcessName} is Disactive."
fi

exit 0


ps aux で全てのプロセスを表示して,それをプロセス名でgrep し,ただし grep 自身もヒットしてしまうので,それを grep -v で除き,最後に wc でライン数を数える.そのライン数が0よりも大きければプロセスが存在する.と判定する.

やっていることはよく判ります.でもパイプで色々繋いだりすると,想定外の例外で引っかかることが多い...

(例えばプロセス名自体が,どこかに「grep」を含んでいる場合,この方法では検出できない)

これをもうちょっとスマートにやる方法を紹介します

2021年2月22日月曜日

Linux でGUI を自動操作するツール【自作】

GUI の自動ツールとしては,xdotool などが有名だが,そういったツールを使用できない場合は自作するのもひとつの手段.

マウスポインターを指定した座標に動かして,クリックするだけのプログラムならば,数行のコードで実現できる.

click.c
--------------------------------------------------------------------------------
#include <stdlib.h>
#include <X11/extensions/XTest.h>

int main ( int argc, char ** argv )
{
  // Arguments 1 is Point of X, Argument 2 is Point of Y
  int position[2] = {atoi ( argv[1] ), atoi ( argv[2] ) };

  // Open Default Display
  Display * display = XOpenDisplay ( NULL );

  if ( display != NULL )
  {
    // Open 'Virtual core XTEST pointer'
    XDevice * device = XOpenDevice ( display, 4 );

    if ( device != NULL )
    {
      // Move Poitner
      XTestFakeDeviceMotionEvent ( display, device, False, 0, position, 2, 0 );

      // Press & Release Left Button
      XTestFakeDeviceButtonEvent ( display, device, Button1, True, NULL, 0, 0 );
      XTestFakeDeviceButtonEvent ( display, device, Button1, False, NULL, 0, 0 );

      XCloseDevice ( display, device );
    }

    XCloseDisplay ( display );
  }

  return 0;
}


 $ gcc -lX11 -lXi -lXtst click.c -o click
 $ ./click 100 500