ネットワーク」カテゴリーアーカイブ

Microk8sを試す

microk8sを用いると簡単に単ノード構成のkubernetesを構築することができ、さらにkubernetesクラスタも構築することができるようなので試してみることにしました。

インストールの手順は、microk8sを踏襲することにします。

Install MicroK8s on Linux

sudo snap install microk8s --classic

ユーザを micro8ksのグループへ追加(次のログイン時に反映される)

sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube

microk8s起動状況の表示

$ microk8s status

microk8s is running
high-availability: yes
  datastore master nodes: 192.168.68.132:19001 192.168.68.129:19001 192.168.68.111:19001
  datastore standby nodes: 192.168.68.130:19001

addons:
  enabled:
    dashboard            # The Kubernetes dashboard
    dns                  # CoreDNS
    ha-cluster           # Configure high availability on the current node
    ingress              # Ingress controller for external access
    metallb              # Loadbalancer for your Kubernetes cluster
    metrics-server       # K8s Metrics Server for API access to service metrics
    storage              # Storage class; allocates storage from host directory
  disabled:
    ambassador           # Ambassador API Gateway and Ingress
    cilium               # SDN, fast with full network policy
    fluentd              # Elasticsearch-Fluentd-Kibana logging and monitoring
    gpu                  # Automatic enablement of Nvidia CUDA
    helm                 # Helm 2 - the package manager for Kubernetes
    helm3                # Helm 3 - Kubernetes package manager
    host-access          # Allow Pods connecting to Host services smoothly
    istio                # Core Istio service mesh services
    jaeger               # Kubernetes Jaeger operator with its simple config
    keda                 # Kubernetes-based Event Driven Autoscaling
    knative              # The Knative framework on Kubernetes.
    kubeflow             # Kubeflow for easy ML deployments
    linkerd              # Linkerd is a service mesh for Kubernetes and other frameworks
    multus               # Multus CNI enables attaching multiple network interfaces to pods
    portainer            # Portainer UI for your Kubernetes cluster
    prometheus           # Prometheus operator for monitoring and logging
    rbac                 # Role-Based Access Control for authorisation
    registry             # Private image registry exposed on localhost:32000
    traefik              # traefik Ingress controller for external access

Check the status while Kubernetes starts

microk8s status --wait-ready

disableされている中から必要なservices を有効化

microk8s enable dashboard dns registry istio

ここで microk8s enable –help を実行すると利用可能なサービスを一覧できます。

起動中の利用可能なサービスを表示

microk8s kubectl get all --all-namespaces
$ microk8s kubectl get all --all-namespaces

NAMESPACE        NAME                                             READY   STATUS        RESTARTS   AGE
ingress          pod/nginx-ingress-microk8s-controller-rj2vj      1/1     Running       0          22h
metallb-system   pod/speaker-bwpl7                                1/1     Running       0          22h
metallb-system   pod/speaker-g2kcl                                1/1     Running       1          22h
ingress          pod/nginx-ingress-microk8s-controller-dvb29      1/1     Running       1          22h
kube-system      pod/calico-node-jdpsl                            1/1     Running       1          23h
kube-system      pod/hostpath-provisioner-5c65fbdb4f-wlg45        1/1     Terminating   1          22h
kube-system      pod/coredns-86f78bb79c-r94k8                     1/1     Terminating   1          23h
kube-system      pod/hostpath-provisioner-5c65fbdb4f-6hz6n        1/1     Running       0          10h
kube-system      pod/calico-node-8hqxv                            1/1     Running       0          24h
ingress          pod/nginx-ingress-microk8s-controller-w5qv9      1/1     Running       0          22h
metallb-system   pod/speaker-wpg4z                                1/1     Running       0          22h
kube-system      pod/coredns-86f78bb79c-hl56s                     1/1     Terminating   0          10h
metallb-system   pod/controller-559b68bfd8-6nw4k                  1/1     Running       0          10h
metallb-system   pod/speaker-nrw9w                                1/1     Running       17         22h
kube-system      pod/coredns-86f78bb79c-72zp4                     1/1     Running       3          10h
kube-system      pod/calico-node-nk45x                            1/1     Running       18         24h
ingress          pod/nginx-ingress-microk8s-controller-cnpzq      1/1     Running       15         22h
kube-system      pod/metrics-server-8bbfb4bdb-9kh97               1/1     Running       0          38m
kube-system      pod/dashboard-metrics-scraper-6c4568dc68-vrmzl   1/1     Running       0          36m
kube-system      pod/calico-kube-controllers-847c8c99d-z867h      1/1     Running       0          33h
kube-system      pod/calico-node-ppczw                            1/1     Running       0          24h
kube-system      pod/kubernetes-dashboard-7ffd448895-q7zkf        1/1     Running       7          36m


NAMESPACE     NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  33h
kube-system   service/kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   23h
kube-system   service/metrics-server              ClusterIP   10.152.183.231   <none>        443/TCP                  38m
kube-system   service/kubernetes-dashboard        ClusterIP   10.152.183.118   <none>        443/TCP                  36m
kube-system   service/dashboard-metrics-scraper   ClusterIP   10.152.183.83    <none>        8000/TCP                 36m

NAMESPACE        NAME                                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
kube-system      daemonset.apps/calico-node                         4         4         2       4            2           kubernetes.io/os=linux        33h
metallb-system   daemonset.apps/speaker                             2         2         2       2            2           beta.kubernetes.io/os=linux   22h
ingress          daemonset.apps/nginx-ingress-microk8s-controller   2         2         2       2            2           <none>                        22h

NAMESPACE        NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
kube-system      deployment.apps/hostpath-provisioner        1/1     1            1           22h
metallb-system   deployment.apps/controller                  1/1     1            1           22h
kube-system      deployment.apps/calico-kube-controllers     1/1     1            1           33h
kube-system      deployment.apps/coredns                     1/1     1            1           23h
kube-system      deployment.apps/metrics-server              1/1     1            1           38m
kube-system      deployment.apps/dashboard-metrics-scraper   1/1     1            1           36m
kube-system      deployment.apps/kubernetes-dashboard        1/1     1            1           36m

NAMESPACE        NAME                                                   DESIRED   CURRENT   READY   AGE
kube-system      replicaset.apps/hostpath-provisioner-5c65fbdb4f        1         1         1       22h
metallb-system   replicaset.apps/controller-559b68bfd8                  1         1         1       22h
kube-system      replicaset.apps/calico-kube-controllers-847c8c99d      1         1         1       33h
kube-system      replicaset.apps/coredns-86f78bb79c                     1         1         1       23h
kube-system      replicaset.apps/metrics-server-8bbfb4bdb               1         1         1       38m
kube-system      replicaset.apps/dashboard-metrics-scraper-6c4568dc68   1         1         1       36m
kube-system      replicaset.apps/kubernetes-dashboard-7ffd448895        1         1         1       36m

Kubernetesの起動と停止

microk8s start
or
microk8s stop

ノードをクラスターへ追加;microk8s joink~ の行をCopyし、追加するノードの端末へPasteして実行する。

microk8s add-node

/* ノード参加に必要な以下のようなメッセージ が表示されるので、参加するノードで、microk8s joinjoinを実行 */

Join node with:
microk8s join ip-172-31-20-243:25000/DDOkUupkmaBezNnMheTBqFYHLWINGDbf

If the node you are adding is not reachable through the default
interface you can use one of the following:

microk8s join 10.1.84.0:25000/DDOkUupkmaBezNnMheTBqFYHLWINGDbf
microk8s join 10.22.254.77:25000/DDOkUupkmaBezNnMheTBqFYHLWINGDbf
  • 参加しているノードの表示
microk8s kubectl get no

frirewallの設定

sudo ufw allow in on cni0 && sudo ufw allow out on cni0
sudo ufw default allow routed

dashboardの利用するには、アクセスのためのトークンを作成します。

token=$(microk8s kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
microk8s kubectl -n kube-system describe secret $token

トークンの一例(dashboardをアクセスした際に要求されるtoken。Copy&Pasteでログイン)

Name:         default-token-57rfp
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default
              kubernetes.io/service-account.uid: 2f782a0f-3d04-43aa-88fe-a6d67364b297

Type:  kubernetes.io/service-account-token

Data
====
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Im56Vm1vTVJyaXVJQzBaSnM4SS1PTWNrZTkzMlJMdFBqS0NMeFgxWnIzdWMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLTU3cmZwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIyZjc4MmEwZi0zZDA0LTQzYWEtODhmZS1hNmQ2NzM2NGIyOTciLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.EGkufnRoGONpt14vmBLAG8vF2khLtHZLx8J0VNzJUxX28z8NtSNB5MhRKCamChqXdTRm1iwyaPQIlgWwaKTci7CA9TNf8o70EmJBOO1AvDJ_QcC2mRpQzrkxcl0wiuLbpkHzC-wvuzqwY4b32utYikbUxHNjiDsOSyVmqN9NyDZ84FKRZUGkaWrgJmUNakBGetqaOPSpTAIC8JncPznYIOt88nyx6kCIrOFJjjh_UhPGMfevVNFZcji617uNTencBVrkwaej6O09wyqzjPVK-jWXhHaigaIb5O2TmjfcQJCyiEkF_6LYFGr7ilOzzpbAqw-iICmBQUW1Mred3FsN9Q
ca.crt:     1103 bytes

dashboardへログインした画面

dashboardでノードの状態を表示

podの追加例:

インストールの過程で気になったキーワード

multipass  Ubuntu環境へ簡単にVMを構築

helm     Kubernetes 用パッケージマネージャー

WordPress  Helm Chartのデプロイ 

3ノード以上の構成では、データストアーがクラスター内で複製され、1ノード故障に対しては耐性がある。

From the 1.19 release of MicroK8s, HA is enabled by default. If your cluster consists of three or more nodes, the datastore will be replicated across the nodes and it will be resilient to a single failure (if one node develops a problem, workloads will continue to run without interruption).

WP Mail SMTP利用をしてWordPressからメールを送信

プラグインWP Mail SMTPをインストール。設定の手順は、WP Mail SMTPのドキュメントを参照。

WP Mail SMTPのドキュメント:

https://wpmailsmtp.com/docs/how-to-set-up-the-gmail-mailer-in-wp-mail-smtp/#create-app

Gmailを利用して、上記のURLを参照しながら設定を完了させ、無事利用できるようになった。Google APIを利用するためのクライアントIDとクライアントシークレットをGoogleから取得することが必要。(手順は、上記URLのドキュメントに詳しく書かれている)

無線でAirGapを超える

無線でAirGapを超える実験(その1 Raspberry Pi)

イスラエスのベン・グリオン大学の研究チームが様々な手段でAirGapを超える実験を発表していて、これまでに、電波、音波、熱などの例が紹介されています。
かねてから、ネタの一つとして無線で実験してみたいと思っていたのですが、最近になってようやく実験を開始しました。

最初は、GPIOを備え、敷居が低そうなRaspberry Piで実験を試みました。RaspberrPiでは、FM変調で音楽などを流す試みが発表されています。手始めに、これを実験してみましたが、githubからダウンロードして、簡単に再現することができました。このソフトはあらかじめ用意したwavファイルの音楽を流したり、マイクロフォンやLINE入力からのオーディオ信号をFM変調で送信できるようになっています。調べてみると、RaspberryPiには3個のGPCLKポートが備わっていて、このポートから、内蔵のクロックを基にしてプログラマブルに周波数を設定可能なハードウェアとなっています。

GPCLK General Purpose CLock https://pinout.xyz/pinout/gpclk

GPIO端子に出力される信号は、基本的には矩形波なので、RF信号の振幅が変化するような変調は、外部のハードウェアなしには実装できません。FM電波とした理由も、そこにあるものと思われます。プログラマブルにクロックを設定できる仕組みを利用し、GPCLK端子へ出力する周波数をうまく制御してFM変調を実現しているようです。クロック生成の詳細は、この記事などが参考になります

RaspberryPiのFM送信機のソフトを利用してデジタルデータを送信するには、データからQPSKなどの信号を音声データとして生成し、wavファイルに落として変調用のファイルとすれば、比較的簡単に実現できそうな気がします(APSK変調)。もっと安直な方法として、GPCLK端子から、あるの周波数の信号を断続して出力すれば、搬送波の断続による原始的なCW変調が実現できそうなので、こちらの方式で実験をしてみました。クロックの生成で、参考にた記事は、こちらの Miscellaneous related code セクションにあるMinimal Clock Accessのコードです。

クロックの制御部分だけをC言語で記述し、残りの部分は、これまた安直にPHPで記述しています。

無線でAirGapを超える

(その2 Windows10 RS-232CポートのON/OFF)

PCには、Raspberry Piと違ってGPIOのような物理的にアクセス可能なデバイスは用意されていない。そこで、最近のPCの標準装備からはほとんど姿を消したものの、RS232C(特に法人向けのPCには、数年前まで、標準装備されていたように記憶していますが、、、?)ポートには、ハードウェアによるフロー制御に利用可能なRTS端子があることを思い出した。

この端子を、高速でON/OFFすることで、電波として放射できないか、実験をしてみた。RTS端子をオシロで観測した様子。46KHz程度で、周期がかなり変動している。

動画の左側は、Raspberry Pi3のGPIO端子をソフトウエアでOn/Offした時のスペクトラム波形。右側がPCのRS-232C端子をOn/Offした際の、スペクトラム波形。WindowsではOn/Off周期の変動が大きく、スペクトラムが大きく広がっている。

プログラム例


#include <windows.h>
#include<stdio.h>
int main()
{
  HANDLE hComm;
  int Status;
  int n;
  unsigned clockDivisor = 0;
  hComm = CreateFile("COM1",                //port name
                      GENERIC_READ | GENERIC_WRITE, //Read/Write
                      0,                            // No Sharing
                      NULL,                         // No Security
                      OPEN_EXISTING,// Open existing port only
                      0,            // Non Overlapped I/O
                      NULL);        // Null for Comm Devices
  if (hComm == INVALID_HANDLE_VALUE)
      printf("Error in opening serial port");
  else {
      printf("opening serial port successful");
      for(n=0;n<100000;n++){                         // ここのループでRF信号を放射
     	Status = EscapeCommFunction(hComm, SETRTS);  // RTS ON
      	Status = EscapeCommFunction(hComm, CLRRTS);  // RTS OFF
      }
      printf("Done...\n");
      uSleep(5000000);
      }
  CloseHandle(hComm);//Closing the Serial Port
  return 0;
}

LANのパケット監視

WannaCryは、LANの中ではsmb(445/TCP)で感染するということなので、簡易な監視のツールを作ってみました。
ミラーしたセグメントのパケットをtcpdumpでキャプチャし、PHPのスクリプトで観測したパケットの数を可視化します。
使い方は、次のような感じ、、、

#tcpdump -ntttti eth0 port 445 | visualize.php

visualize.php は、定期的にhtmlファイルを生成ます
利用者はブラウザでhtmlファイルを閲覧します。
htmlファイルは (例えば10秒毎に)自身をrefreshします。

表示される、画像の1マスは、ノード(PCやサーバ)間のパケット数を色で表現しています。
通信がまったく観測されない場合は濃い青色で観測されたパケット数が多いと黄色~赤に変化します。
また、マスの中の1文字は、観測したパケットの数に応じて、0-9,A-Z…..と表示しています。

#!/usr/bin/php
<?php
/*
        Usage:
        tcpdump -nttttr xxxxx.pcap port 445 | ./p445.php
*/

$MIN_TH = 5;
$fp=fopen("php://stdin","r");
for($i=1;$i<255;$i++){
        for($j=1;$j<255;$j++){
                $buf[$i][$j]=0;
        }
}
$n=0;$prev_min=0;
while($in=fgets($fp)){
        $t=explode(" ",$in);
        $date=$t[0]." ".$t[1];
        $tmp =explode(":",$t[1]);       // hh:mm:ss.xxxxx
        $min =$tmp[1];                  // min
        if(isset($t[3])){
                $s=explode(".",$t[3]);
                if(isset($s[3])) {
                        $ip1=$s[3];
                        $d=explode(".",$t[5]);
                        $ip2=$d[3];
//                      echo "$ip1,$ip2\n";
                        $buf[$ip1][$ip2]++;
                }
        }

        $n++;
        if(($n % 2000)==0 || ($min - $prev_min) > $MIN_TH) {
                MkHTML($buf,$date);
                $prev_min = $min;
        }
}

fclose($fp);
MkHTML($buf,$date);
echo "Finished!!!\n";


function MkHTML($buf,$date){

        $date="<H3>$date</H3>";
        $header="<!DOCTYPE HTML><HTML><HEAD><meta http-equiv=\"refresh\" content=\"10\"></HEAD><BODY>";
        $msg="<H3>$date</H3>\n<TABLE>\n";
        for($i=1;$i<255;$i++){
                $sum=0;
                for($j=1;$j<255;$j++){
                        $sum+=$buf[$j][$i];
                }
                $iSum[$i]=$sum;
//              echo "$i,$iSum[$i]\n";
        }

        for($i=1;$i<255;$i++){
                $tmp="<TR><TD>$i</TD>";$sum=0;
                for($j=1;$j<255;$j++){
                        $var=$buf[$i][$j];
                        $pt=".";
                        if($var<63) {
                                if($var<10) {
                                        $pt=$var;
                                } else {
                                        $pt=chr(ord('A')+$var-10);
                                }
                        }
                        $sum+=$var;
                        $var=20*log($var+1);
                        $color=set_color($var);
                        if($iSum[$j]!=0) $tmp.= "<TD BGCOLOR=$color>10.8.0.$j\">$pt</TD>";

                }
                if($sum !=0 ) {
                        $msg.=$tmp;
                        $msg.="</TR>\n";
                }
        }

        $msg.="</TABLE>\n<H3>$date</H3></BODY></HTML>\n";
        $fw=fopen("/var/www/html/cross.html","w");
        fputs($fw,$header);
        fputs($fw,$msg);
        fclose($fw);
}


function set_color($x){
   if ($x<64) {
       $r=0; $g= $x*4 ; $b=255;
   } else {
       if ($x<128){
           $r=4*( $x -64 );$g=255;$b=255-$r;
       } else {
           if ($x<192){
               $b=4*( $x - 128 );$r=255;$g=255-$b;
           } else {
               $r=255;$g=0;$b=255-4*( $x -192);
           }
       }
   }
   return "#".sprintf("%02x%02x%02x",$r,$g,$b);
}
?>