テスト環境用ゲートウェイサーバをarmbianで作ったことのメモ


とりあえず客先のIPアドレスで構築する時に、ちょうどいいサーバが無かったので余ってたorangepiでゲートウェイサーバを作った。

調達したスイッチがタグVLANしゃべれるやつだったので、orangepiの1ポートしかないNICに、VLANを4つ載せた

最近のarmbianはNetworkManagerによる制御にあるので、nmtuiコマンドなどでネットワーク設定を行った。

nmtuiで[Add]-[VLAN]を選んだあと、下記の様な感じでデバイスは空欄、「Parent(親)」は、実際のネットワークインターフェイスであるeth0を指定、そして、作成したいVLAN IDを「VLAN id」に入力し、作成

これでネットワーク設定を行った結果は、 /etc/NetworkManager/system-connections に出力されている。

DNSサーバ

次に、VLANを割り当てているサブネット以外の場所にあるDNSサーバをどうやってごまかすかを考えた。

応答する内容については、 /etc/hosts に書いたものを利用する dnsmasq を試用することとした。

root@orangepi2:~# diff -u /etc/dnsmasq.conf.org /etc/dnsmasq.conf
--- /etc/dnsmasq.conf.org       2022-02-28 11:54:50.037516142 +0900
+++ /etc/dnsmasq.conf   2022-02-28 16:05:58.999972348 +0900
@@ -8,6 +8,7 @@
 # (53). Setting this to zero completely disables DNS function,
 # leaving only DHCP and/or TFTP.
 #port=5353
+port=53

 # The following two options make you a better netizen, since they
 # tell dnsmasq to filter out queries which the public DNS cannot
@@ -16,7 +17,7 @@
 # these requests from bringing up the link unnecessarily.

 # Never forward plain names (without a dot or domain part)
-#domain-needed
+domain-needed
 # Never forward addresses in the non-routed address spaces.
 #bogus-priv

@@ -43,7 +44,7 @@

 # Change this line if you want dns to get its upstream servers from
 # somewhere other that /etc/resolv.conf
-#resolv-file=
+resolv-file=/etc/resolv-tmp.conf

 # By  default,  dnsmasq  will  send queries to any of the upstream
 # servers it knows about and tries to favour servers to are  known
@@ -72,6 +73,7 @@
 # Add local-only domains here, queries in these domains are answered
 # from /etc/hosts or DHCP only.
 #local=/localnet/
+local=/osakana.net/

 # Add domains which you want to force to an IP address here.
 # The example below send any host in double-click.net to a local
@@ -142,6 +144,7 @@
 #    domain of all systems configured by DHCP
 # 3) Provides the domain part for "expand-hosts"
 #domain=thekelleys.org.uk
+domain=osakana.net,客先IPアドレス帯/24

 # Set a different domain for a particular subnet
 #domain=wireless.thekelleys.org.uk,192.168.2.0/24

osakana.net ドメインの名前解決を、ちゃんとしたDNSサーバに聞きに行かないよう「local=/ドメイン名/」を定義して、阻止する。

domain=の記述はいらないような感じだけど、とりあえず追加しておいたもの。

「resolv-file=/etc/resolv-tmp.conf」と入れてるのは、Network Manager生成の/etc/resolv.conf だと期待値と違ったものがあったため、あえて別ファイルとしているもので、通常は不要。

DNSサーバが他のサブネットにある件は、とりあえず、ダミーのVLANを作成し、そこにIPアドレスを割り当て、/etc/sysctl.d/98-ipforward.conf にip_forward設定を入れることで、応答を返せるようにした。

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

NTPサーバ

ntpサーバは chronyで作成した。

/etc/chrony.conf を修正するのではなく、 /etc/chrony/conf.d/server.conf に下記を記述した。

allow 172.17.44.0/24
allow 192.168.20.0/26
local stratum 10

これでchrony再起動で問題なかった。

proxyサーバ

要件には無かったが、ひとまずproxyサーバとしても動作できるようsquidをインストールした。

しかし、 armbian初期設定では /var/log が RAMディスク作成で50MBのため /var/log/squid が作成できずエラーとなった

/var/logの50MBというのは /etc/default/armbian-ramlog にて「SIZE=50M」で定義されている。

これを「SIZE=100M」などと変えて再起動すると反映される。

また、/var/log/squid をRAMディスク以外に逃がすことで対応した。

面倒なので、/ディレクトリ直下に/work/squidを作成し、そこに/var/log/squidのシンボリックリンクを作成している

root@orangepi2:/var/log/squid# ls -ld /var/log/squid
lrwxrwxrwx 1 root root 11 Feb 28 15:05 /var/log/squid -> /work/squid
root@orangepi2:/var/log/squid#

ESXi Host ClientのEvent表示で情報以外を表示させる方法


ESXi 7.0サーバのHost Clientから、そのESXiサーバのイベントとしてWarningやErrorが発生していないかを、[Host]-[Monitor]-[Events]で確認しようとした。

すると「Type: Info」のもので埋め尽くされていたのでFilterをかけようとした、

しかし、文字列として「Info」とか「Information」を入力しても適用されない。

いろいろやってみるとseverityらしく数字でフィルターが出来た。

Info(情報)以外を表示させたいのであれば「1以外」ということで「”is not equal to”, “1”」で実現できた。

Windows 10 環境でいつの間にかDHCPによるIPv6アドレスができなくなってた件への対応


Windows 10 21H2環境でDHCPサーバからIPv6アドレスがちゃんと割り当てられて、各Webサイトに対してIPv6アクセスができる、という状態であることを確認していた。

しかし、ふと気がついて見るといつの間にかにIPv6アクセスではなくなっていたようだった。(たとえば IIJmio にアクセスするとConnected via IPv4表記になっていた)

「ipconfig /all」コマンドを実行してみると、「リンクローカルIPv6アドレス」はあるものの「IPv6アドレス」がない。
また、DNSサーバとして、これまでIPv6アドレスが2つ登録されていたものが、IPv4サーバのみになっていた。

手動でIPv6アドレスを設定してみるとIPv6アクセスができるので、ネットワーク側の問題ではないようだ。

いろいろ悩んだのですが、「netsh interface ipv6 dump」コマンドでIPv6に関する設定情報を取得してみるとおかしな状態が・・・(ログを取ってなかったので↓はこんな感じだった、という再現出力で、細かいパラメータについてはたぶん実際の状況とは異なると思います)

C:\Users\osakanataro>netsh interface ipv6 dump


# ----------------------------------
# IPv6 構成
# ----------------------------------
pushd interface ipv6

reset
set interface interface="イーサネット (カーネル デバッガー)" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="Wi-Fi" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="ローカル エリア接続* 1" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="イーサネット" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="ローカル エリア接続* 4" forwarding=enabled advertise=enabled mtu=1280 nud=enabled ignoredefaultroutes=disabled
set interface interface="ローカル エリア接続* 2" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="イーサネット 2" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="イーサネット 3" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="イーサネット 4" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="vEthernet (Default Switch)" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled


popd
# IPv6 構成の最後



# ----------------------------------
# ISATAP 構成
# ----------------------------------
pushd interface isatap



popd
# ISATAP 構成の最後



# ----------------------------------
# 6to4 構成
# ----------------------------------
pushd interface 6to4

reset



popd
# 6to4 構成の最後



C:\Users\osakanataro>

コントロールパネルのネットワークアダプターでは表示されないデバイスについての設定がいろいろ入っていました。

ここらへんの設定が影響しているかもしれない、ということで、IPv6に関する設定をすべて消去してみました。

コマンドは「netsh interface ipv6 reset」です。

実行完了後、Windows OSの再起動が必要です。

再起動後に確認してみると、IPv6アドレスが期待通りに割り当てられており、また、IPv6アクセスも正常にできていました。

なお、再起動後の「netsh interface ipv6 dump」の内容は下記のようになっていました。(Hyper-V設定を行っているので、vEthernetがあります)

C:\Users\osakanataro>netsh interface ipv6 dump


# ----------------------------------
# IPv6 構成
# ----------------------------------
pushd interface ipv6

reset
set interface interface="vEthernet (Default Switch)" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled


popd
# IPv6 構成の最後



# ----------------------------------
# ISATAP 構成
# ----------------------------------
pushd interface isatap



popd
# ISATAP 構成の最後



# ----------------------------------
# 6to4 構成
# ----------------------------------
pushd interface 6to4

reset



popd
# 6to4 構成の最後



C:\Users\osakanataro>

TeraTermマクロでコマンド出力結果を使って別のコマンドを実行する


NetAppの設定をTeraTermマクロで取得出来るようにマクロを作成中し https://github.com/osakanataro/get-ontap-config で公開中です。

物理ディスク一覧を作成する際、単純に「storage disk show」で取得すると、2ノードの表示が入り交じり、どちらに所属している物理ディスクなのか判別が面倒。

なので、「storage disk show -nodelist ノード名」という形で出力を分けたいのだが、NetAppに対して「system node show -fields node」で取得したノード一覧からノード名を抜き出して、それぞれに対してコマンドを実行するためには、TeraTermマクロで実装できるのかを調査した。

調査

まず、NetAppのノード名一覧の出力を確認

netapp01::> system node show -fields node
node
-------------
netapp01-01
netapp01-02
2 entries were displayed.

netapp01::>

ノードとして「netapp01-01」と「netapp01-02」があることを確認。

また、system node showコマンドの出力のうち最初の2行はヘッダ、そして、ノード名出力後に「~ entries were displayed.」と出力がある。これらは使わないので除外が必要。

スクリプト

サンプルとして、ノード一覧を表示して、各ノードに対して「system node run -node ノード名 hostname」を実行する、というものを作成した。

setsync 1
timeout=60
strdim nodenames 20
I=0
sendln 'system node show -fields node'
recvln ; コマンド入力 のecho出力  をスキップ
recvln ; ヘッダ部分 をスキップ
recvln ; --- 部分 をスキップ

endflag=1
while endflag=1
	recvln
	strscan inputstr 'displayed.'
	if result>0 then
		endflag=0
	else
		nodenames[I] = inputstr
		I=I+1
	endif
endwhile
wait '::> '

J=0
while I > J
	sendln 'system node run -node ' nodenames[J] ' hostname'
	wait '::> '
	J=J+1
endwhile

setsync 0

スクリプトの解説

今回のようなコマンド出力結果を受け取る場合は、「setsync 1」を実行して、確実に出力結果を受け取る設定(同期)とする必要がある。

次に「recvln」する際、TeraTermマクロからNetAppに送信した文字列もrecvlnで受け取ることになっているため、最初の1行は捨てている。(recvlnして、その後、何の処理もしていない)

続けて2行がヘッダなので、「recvln」で2行分受け取り、何も処理していない。

「2 entries were displayed.」というエントリ以降の行は不要なので、whileを終了する処理を入れるが、1台だったりすると1 entry wasとかになったりしそうなのでdisplayed.だけで終了検出。

whileを抜けたあとは、コマンドプロンプトの「::> 」が来るまで待ちを入れる。

スクリプト実行例

netapp01::> system node show -fields node
node
-------------
netapp01-01
netapp01-02
2 entries were displayed.

netapp01::> system node run -node netapp01-01 hostname
netapp01-01
netapp01::> system node run -node netapp01-02 hostname
netapp01-02
netapp01::>

ssh接続を使って2つ先にある管理画面Webにアクセスする


下記の様な感じで、踏み台サーバを2つ経由した先にある管理画面Webを、手元の操作端末上のブラウザで確認したい。

sshによるトンネル接続を利用したSOCKS proxyを使うことで実現できる。

構成の概要としては下記の様な形となる。

操作端末はWindows 10で、puttyを使用してssh接続を行い、Firefoxブラウザで管理画面を開く、という想定。

まず、SSH接続1について設定

[Session]-[Host Name] で 踏み台サーバ1 とポート番号を指定(port 22)
[Connection]-[Data]-[Auto-login username] で 踏み台サーバ1のログインユーザ名
[Connection]-[SSH]-[Tunnels]の[Forwarded ports] で 「L10022 踏み台サーバ2:22」(“Local”,”Souce port:10022″,”Destination: 踏み台サーバ2:22″)
公開鍵認証を使用する場合は [Connection]-[SSH]-[Auth]の[Private key file for authentication]に指定

これにより、「踏み台サーバ1へのSSH接続1」と「操作端末のローカルポート10022にアクセスすると踏み台サーバ2のポート22に転送されるトンネル接続」が出来る。

次に作成されたトンネル接続を利用したSSH接続2を設定

[Session]-[Host Name] で localhost ポート 10022 を指定
[Connection]-[Data]-[Auto-login username] で 踏み台サーバ2のログインユーザ名
[Connection]-[SSH]-[Tunnels]の[Forwarded ports] で 「D10080」(“Dynamic”,”Souce port:10080)
公開鍵認証を使用する場合は [Connection]-[SSH]-[Auth]の[Private key file for authentication]に指定

これで「”接続端末のローカルポート10022″から 踏み台サーバ ポート22 に転送されてSSH接続2」と「操作端末のローカルポート 10080 にアクセスすると、踏み台サーバ2 上からネットワーク接続できるトンネル接続」が出来る。

最後に、Firefoxの[General]-[Network Settings]にて、「Manual proxy configuration」で「SOCKS Host: localhost Port: 10080」と設定する。

これで操作端末上から閉鎖網2上にあるWeb管理画面を開けるようになった。


2022/01/20追記

TeraTermでも同様のことを行う手法を調べた。

puttyみたくテンプレート化できないので、ショートカットで起動できるようコマンドラインオプションとして指定する手法とした。

"C:\Program Files (x86)\teraterm\ttermpro.exe" 踏み台サーバ1 /ssh2 /auth=publickey /keyfile=X:\tmp\sshkey\~.ppk /ssh-L10022:踏み台サーバ2:22 /user=踏み台サーバ1のログインユーザ名 /passwd=秘密鍵のパスフレーズ

"C:\Program Files (x86)\teraterm\ttermpro.exe" localhost:10022 /ssh2 /auth=publickey /keyfile=X:\tmp\sshkey\~.ppk /ssh-D10080 /user=踏み台サーバ2のログインユーザ名 /passwd=秘密鍵のパスフレーズ

なお、引数でパスフレーズを指定しない場合、「SSH2秘密鍵の読み込みに失敗しました wrong passphrase」という下記のダイアログが表示されてうざいです。

また、TeraTermでSSHのダイナミックポート転送を行う場合、指定したポートが使用できない場合、下記の様なApplication fault Execption:ACCESS_VIOLATIONダイアログが表示されることがある。

ダイアログもなしにTeraTermが終了することもある。

2022/01/21 追記
TeraTermでのSOCKS proxy(ダイナミックポート転送)がどうにも不安定なので、 puttyで実施している。