夜明け前の最も暗いとき

技術的なやったことをメモするブログ

ZabbixのMapからteratermで自動ログインする

ネットワーク機器も増えてきたこともあり、監視する必要がでてきたためにZabbixを使っています。MAP画面を使うと装置のつながりが一目で分かります。

f:id:jianlan:20190206002145j:plain
zabbix map
普段はWindowsTeratermを使っているので、マップから起動してログインできると便利です。ということで、ブラウザからローカルのexeファイルを実行する方法を調べたのですが、セキュリティの観点から禁止されているようです。Internet ExplorerであればActiveXを使うことでJavaScriptから呼び出せるようですが、IEはサポートされなくなるため別の方法を考えます。

ブラウザから次のようにプロトコルを指定したリンクを使うことにより特定のプログラムを実行させることができます。

telnet://localhost/

この例ではtelnet接続のためのクライアントが起動し、localhostへ接続しようとします。どのプログラムが起動するかはレジストリに記述されています。regeditを使って下記のレジストリを確認します。

[HKEY_CLASSES_ROOT\telnet\shell\open\command]
(規定)="C:\Windows\System32\rundll32.exe" "C:\Windows\System32\url.dll",TelnetProtocolHandler %l

この規定の値を変更してみます。

[HKEY_CLASSES_ROOT\telnet\shell\open\command]
(規定)="C:\Python\Python35\python.exe" "C:\usr\script\show_args.py" %l

なお、show_args.pyは次のようになっています。

import sys
import msvcrt

print('# of arguments:', len(sys.argv))
print('arguments:', str(sys.argv))

msvcrt.getch()

telnetのリンクをクリックすると次のように表示されます。

# of arguments: 2
arguments: ['C:\\usr\\script\\show_args.py', 'telnet://localhost/']

引数としてエンコードされたURL文字列自身が渡されます。したがって、次のように処理をします。

  1. zabbixのマップからtelnetリンクを生成
  2. telnetリンクをクリック
  3. レジストリに登録されたプログラムを起動
  4. URLエンコードされた文字列を処理
  5. teratermマクロでログイン処理を実行する

まずは、マップのURLsにリンクを張ります。

f:id:jianlan:20190210204138p:plain
Zabbix Map Edit element

URLsのNameとURLを設定します。URLはCGIIPアドレスとユーザ名を渡します。今回は次のようにします。

http://localhost/macro/login.cgi?type=≪実行するマクロ名≫&ip=≪ip アドレス≫&args=≪ユーザ名≫
---
http://localhost/macro/login.cgi?type=ssh_login&ip=192.168.11.10&args=jinglan

参照先のCGIは以下のようになっています。

#!/usr/bin/perl
use strict;
use warnings;
use CGI;

# クエリパラメータ取得
my $query = new CGI;
my $telnet_url = 'localhost/'.$query->param('type').'.ttl '.$query->param('ip').' '.$query->param('args');

# レスポンスヘッダの出力
print "Content-type: text/html", "\n\n";

# HTMLの出力
my $buff =<<"EOM";
<!DOCTYPE html> 
<html>
<head>
  <meta http-equiv="Pragma" content="no-cache">
  <meta http-equiv="Cache-Control" content="no-cache">
  <script language="javascript">
    function main() 
    {
       document.location.href = "telnet://$telnet_url";
       //history.go(-1);  //Chromeだとうまく動作しないのでコメントアウト
    }
  </script>
  <title>Login</title>
</head>
<body onload="main()"></body>
</html>
EOM

print $buff;

このスクリプトはHTMLページを作成し、telnet://のアドレスへ自動的にリダイレクトします。これにより、レジストリに登録されたプログラムが実行されます。レジストリへの登録は下記の内容を.regファイルにするとダブルクリックで変更できるので簡単です。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\telnet\shell\open\command]
@="\"C:\\Program Files (x86)\\teraterm\\ttpmacro.exe\" C:\\usr\\script\\login.ttl %l"

telnetプロトコルteratermマクロに関連付け、C:\usr\script\login.ttlを実行しています。login.ttlの内容は以下のようになっています。

arg_str = param2
strreplace arg_str 1 'telnet://localhost/' ''
do
  strreplace arg_str 1 '%20' ' '
loop while result = 1
strsplit arg_str ' '

SSH_CONN_PARAM = ""
strconcat SSH_CONN_PARAM groupmatchstr3
strconcat SSH_CONN_PARAM "@"
strconcat SSH_CONN_PARAM groupmatchstr2

include "Login_ManagementServer.ttl"
sendln "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null " SSH_CONN_PARAM

ブラウザによるURLエンコードでスペースが%20に変換されるため、置換で戻しています。また、telnet://localhost/は不要なので削除しています。踏み台サーバ(Linux)にログインした後、sshコマンドで接続しています。

以上でMAPからワンクリックでパスワード入力まで自動化させることができました。注意点として、Windowstelnetプロトコルの処理を変更しているのでセキュリティには留意する必要があります。

電気通信主任技術者の受験記

昨年は電気通信主任技術者(伝送交換)を受験し、合格したのでそのときのメモです。

受験時にはすでに下記の資格を持っていました。

工事担任者(総合種)を持っていたので「システム」「設備」「専門」「法規」のうち「システム」は免除となりました。また、 基本情報処理技術者をもっているので「専門」はデータ通信を選択しました。

「設備」「法規」の試験対策として次の過去問を買いました。資格勉強では過去問は必須です。

過去問は多くの問題が収録されているものが良いです。調べたところこの本が一番収録されていました。「専門」を除く「システム」「設備」「法規」が収録されているので科目ごとに過去問を買う必要もありません。

「専門」については公式サイトの過去問4回分を使いました。この過去問は解説がないので自力で解答の理由を導く必要があります。しかし、 基本情報処理技術者試験を受けていればおおよそ解答の見当が付きます。基本情報処理技術者試験に出題されないような通信系の問題はルータなどの通信機器を扱った経験があれば難しくないでしょう。

 

 また、参考書は今回購入しませんでした。

「設備」に関しては工事担任者で電話機の通信方式(DPやISDN)、無線や伝送時の符号化について、基本情報処理技術者でMTBFや情報セキュリティといったトピックについて理解しているのであれば参考書は不要だと思います。自分の周りではオーム社のテキストを使っている人が多かったです。

「法規」に関しては丸暗記です。過去問を1周すればどんな問題が出題されるか、どれが正解なのか分かるようになります。法律用語や解釈に不慣れであれば参考書を購入するのも一考です。

電気通信主任技術者試験 これなら受かる 法規(改訂3版)

電気通信主任技術者試験 これなら受かる 法規(改訂3版)

続きを読む

KVM/QEMUの仮想化Windows環境でGTX1070をパススルーする

いままで使っていたWindowsマシンをLinux環境上に移行します。WindowsではGPUを使っていたのでパススルーをして仮想環境上でも使えるようにします。ホストのLinux機はDebianを使用します。

以下に機材の構成を示します。

Core i7-6700 (Skylake)
ASUSTeK Intel H170
MSI GTX 1070 GAMING X 8G

Intel CPUでパススルーを使うためにはVT-d (Virtualization Technology for Directed I/O )に対応している必要があります。

続きを読む

CiscoルータでOCNのIPoEを使ってみる (DNS設定編)

前回、OCNのIPoEの設定を実施しました。今回はDNSを設定します。というのも、IPv6パススルーを使うとDNSがRAアドバタイズとDHCPv6によって通知されるため、自動的にISPDNSサーバとなってしまいます。LAN内に自前のサーバがある都合上、DNS(Proxy)サーバを用いてIPv4で名前解決をできるようにします。

OCNのDNSサーバではIPv4からの問い合わせはIPv6のAAAAレコードを返しません(AAAAフィルタリング)。

[jinglan@localserver]$ nslookup -type=a www.google.com 192.168.11.1 
Server:         192.168.11.1
Address:        192.168.11.1#53

Non-authoritative answer:
Name:   www.google.com
Address: 172.217.25.196

[jinglan@localserver]$ nslookup -type=aaaa www.google.com 192.168.11.1
Server:         192.168.11.1
Address:        192.168.11.1#53

Non-authoritative answer:
*** Can't find www.google.com: No answer

Authoritative answers can be found from:

[jinglan@localserver]$ 

そのため、IPv4IPv6に対応したDNSキャッシュサーバを立て、IPv4の問い合わせに対してAAAAレコードも返せるようにします。

続きを読む

CiscoルータでOCNのIPoEを使ってみる

先日、回線工事をしてOCNフレッツ光にしました。ただ、VDSLなのでどう頑張っても100Mbpsしか出ませんが…。 既存のPPPoEでもある程度、速度が出ますがせっかくですので今話題のネイティブIPv6を設定してみます。 使用機材はCisco systemsのC892FJです。

続きを読む

Ubuntu 18.04のOSインストール時にAMD CPUでフリーズする現象への対処

DELL Inspiron 11 3180を買いました。目的は外出時の持ち運び用です。スペックは次の通りです。

 CPU:
   第7世代 AMD A9-9420e プロセッサー Radeon R5 グラフィックス
 メモリ:
   8GB, DDR4, 2400MHz
 ハードディスク:
   128GB eMMC ストレージ
 ディスプレイ:
   11.6-インチ HD (1366 x 768) LED-バックライト 
 ワイヤレス:
   802.11bgn + Bluetooth 4.0, 2.4 GHz

WindowsUbuntuデュアルブートにしようとしたのですが、Ubuntuのインストール中にフリーズしてポインタも動かない状態になってしまいます。

続きを読む

SNMPでネットワーク機器を監視する

SNMP(Simple Network Management Protocol)とはネットワーク機器を監視するためのプロトコルです。SNMPでは、監視対象の機器からtrapと呼ばれる通知を監視端末で受け取り、状態の変化を把握します。

続きを読む