後期高齢者が彼/彼女のパソコンで何かミスをしても,自宅LANの他のパソコンに及ぶ影響を最小限にするため,隔離したい。彼/彼女のパソコンからは,WAN(インターネット)には出て行けるが,自宅LAN内の他のパソコンにはアクセスできないようにするというわけだ。一番簡単なのは,無線LANルーターの「ネットワーク分離」機能を使うことだ。
有線でつないでいる場合であっても,いまは非常に手頃な費用で可能。VLAN対応の5ポートスイッチと呼ばれるものを買えばよい。amazon.co.jpで2,500円前後で買える。私が買ったのはTP-LINK TL-SG105E。他に,NETGEAR GS105E-200JPSも安く,同じことができる。VLANの解説ではないが,以下の記事が選択の役に立つ。
無線LANルーターまたはルーターが複数台あり,後期高齢者が接続しているのは2台目(内側)の場合は注意が必要だ。単純にネットワーク分離しても内側の内部でしか分離されない。ルーターが入れ子(二重ルーター)のとき,どこが隔離されるかを理解するには,ルーターはファイアーウォールの一種だと考えれば分かり易い。ファイアーウォールの内側が外側から隔離(保護)されるのであって,外側は内側から隔離(保護)されない。もし,1段目(外側)のパソコンを2段目(内側)から保護するなら,合計3台のルーターが必要だ。城の一番外側のルーター(親)の内部に,本丸と二の丸の2つの子ルーター領域を作る。
いまどきはVPSが安く使えるので,往年の「自宅サーバー」の効用はかなり小さくなったが,auひかりの新サービス「スマホで固定電話」を前にまた復活の兆しがある。詳細はNET/通信契約。
VPSを主環境として使っているが,自宅にもサーバーを置いている。自宅サーバーにはThinkPad X201を使っている。ノートパソコンの方が便利だ。画面とキーボードが付いている。X201はかなり古い機種だが,VPNサーバーとして使う上ではスループットで特に支障はない。しかも,SoftEtherを入れているのは,Windows10の上のVirtualBoxの上のCentOS。それでも遅さを全く感じないし,数値で見ても同様。
1万円前後のAtom系オンボードは勧めない。かなり古いノートパソコンよりも処理能力が低いのでコストパフォーマンスに劣る。AtomとCoreプロセッサーとでは大きな格差がある。
実際の運用では、仮想マシンをサービスとして自動起動するとよい。
SoftEtherサーバーが仮に192.168.0.10だとして,自宅LANにVPNした状態で,クライアントから192.168.0.10にアクセスしようとしてもできない(pingすらできない)。(自宅LAN内の他の機器へのアクセスには制限はない。)これはLinuxの仕様だそうだ。「Linux オペレーティングシステム内部での制限事項により、VPN 側 (仮想 HUB 側) からローカルブリッジしている LAN カードに割り当てられる IP アドレスに対して通信を行うことはできません。この制限は SoftEther VPN が原因ではなく、Linux の内部構造に原因があります。」3.6 ローカルブリッジ - SoftEther VPN プロジェクト
このままでも(VPNサーバーとして使う上では)特に困ることはないが,この仮想マシンでウェブサーバーを立てているなど,アクセスしたい場合は,VirtualBoxに仮想NICを追加すれば解消できる。幸い物理NICと違って追加は簡単だ。
vi /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 ONBOOT=yes BOOTPROTO=none HWADDR=08:00:... 先ほどのMACアドレス IPADDR=0.0.0.0 USERCTL=no TYPE=Ethernet IPV6INIT=no /etc/init.d/network restart
上記のように、サーバーはWindows 10上のVirtualBox上のCentOS 7を使っている。(最近、CentOS 6から更新。)土台のWindowsの状態を遠隔から把握するのに以下のスクリプトを使っている。別途、Apache httpd(Windowsにインストール)とPerl(Active Perl, Windows版)が必要。状態把握のやりかたはいろいろあり、普通はWindowsの管理ツールを使うはずだが、それらは個人的になじみがないので、代わりに使い慣れた道具立てを使っている。
#!/usr/bin/perl use utf8; open(STDERR, ">&STDOUT"); #open(STDERR, ">>error.log"); use strict; use warnings; use CGI qw(:cgi); my $q = CGI->new; { my $title = 'WMIC PROCESS'; print $q->header(); print $q->start_html( -title=>$title, -style => { -verbatim => 'td:nth-child(4), td:nth-child(6) {text-align: right;}' }, ); } my $wmic = 'wmic path Win32_PerfFormattedData_PerfProc_Process get Name,PercentProcessorTime,WorkingSet,WorkingSetPeak /format:csv'; my @wmic = qx($wmic); my @lines = (); my %workingSet = (); shift @wmic; # 1行目は空 my @head = map {$_ =~ s/\s+$//; $_} map {split(',')} shift @wmic; push(@head,'rate'); for (@wmic) { chomp; my @headers = @head; my %line = (); my @cols = split(','); for my $key (@headers) { $line{$key} = shift @cols // 0; $line{$key} =~ s/\s+$//; # ゴミ取り } push @lines, {%line}; $workingSet{$line{'Name'}} = $line{'WorkingSet'}; # rate計算用 } # 配列の順序を入れ替え @head[4,5] = @head[5,4]; print qq(<table border>\n); # ソート列を変えて2回呼ぶ。 &sort_print('PercentProcessorTime'); &sort_print('WorkingSet'); print qq(</table>\n); exit; # -----------------------------------終わり sub sort_print { my ($sortKey) = $_[0]; my @lines = sort { $b->{$sortKey} <=> $a->{$sortKey} } @lines; # spliceで原本を壊さないようmyを使う。 splice(@lines,10); print qq(<tr>); map {printf qq(<td>%s),$_} (@head); print qq(</tr>\n); for (@lines) { my %line = %{$_}; next if $sortKey eq 'PercentProcessorTime' && $line{'PercentProcessorTime'} ==0; # 0の項目の順序は無意味なので削除。 print qq(<tr>); $line{'rate'} = sprintf q(%.2f%%), $line{'WorkingSet'}/$workingSet{'_Total'}*100; if ($line{'Name'} eq '_Total') { $line{'rate'} = ''; } for (@head) { $line{$_} =~ s/\s$//; # ゴミ取り if ($line{$_} !~ /\D/) { # 数字なら桁取り。 $line{$_} =~ s/(\d)(?=(\d\d\d)+(?!\d))/$1,/g; } printf qq(<td>%s),$line{$_}; } print qq(</tr>\n); } }
インターネット上のサーバーに「自宅からのみアクセス可」のような設定をしている場合に、IPv6で「自宅」はどのように表記するか。
塩田さんのスクリプト(Windows 10 Wake On LAN(WoL)入門:WoLでPCを起動 - @IT)を使うと、Windows 10から簡単にWake On LANができるのだが、PowerShellをほとんど使わない僕は少し手間取った。「このシステムではスクリプトの実行が無効になっているため、...」に初めて対面した。PowerShellスクリプトを簡単実行 - Qiitaを参考に、やりたいことを実現できた。
powershell -ExecutionPolicy RemoteSigned -File C:\...\WakeDell3020.ps1
WakeDell3020.ps1の中には、直接塩田さんのスクリプト(関数の定義に当たる)を書いてその次の行で呼び出してもよいし、塩田さんのスクリプト自体は汎用的に使うなら、もう一つ別のps1を介在させる。例えば
WakeOnLAN WakeOnLAN "F8-xx-xx-xx-xx-xx" "192.168.1.255"