このブログを検索

この記事の内容は、個人の見解、検証の範囲のものであり、誤りがある可能性があります。
個人の責任において情報活用をお願いします。


2023年3月31日金曜日

やってみよう自動化ツール Ansible その6 動的PVCが使えるようにnfs-clientを自動で展開してみよう

今回は、Podに永久ストレージを自動で追加してくれる動的PVCを使えるように、nfs-clientの導入をやっていきます。
事前準備として、コントロールプレーンノード、ワーカーノードからNFSの領域がアクセスできるようにしておいてください。

NFS用意してないよっていう人は、以下の作業で検証用のNFSを適当に作ってください。
1. マウントする領域を作成する(mkdir /share/nfs)
2. yum install nfs-utils で nfs-utils をインストール
3. vi /etc/exports で通信設定を行う
/share/nfs NFSサーバーにアクセス可能にするネットワーク(rw,no_root_squash,async) 4. firewallを無効
5. サービスを起動する
systemctl start rpcbind systemctl start nfs
NFSを用意したら忘れずにWorkerノードにマウントしてください
1. マウントポイント作成(mkdir /share/nfs-client)
2. yum install nfs-utils で nfs-utils をインストール
3. mount -v -t nfs NFSのIPアドレス:/share/nfs /share/nfs-client
準備ができたら、次に進みましょう。
まず、手動でやる際のnfs-client導入手順確認です
1. nfs-clientをインストールするためにhelmを利用するので導入します

   curl -O https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
   bash ./get-helm-3

2. helmからnfs-clientをデプロイできるようにリポジトリを追加します

   helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

3. helmからnfs-clientをデプロイします

   helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
     --set nfs.server=NFSのIPアドレス \
     --set nfs.path=/share/nfs
手順としては上記で完了です。
これをもとにansible用のプレイブックを作成していきましょう。

まず、今回もrolesを使っていこうと思うので、roles/nfs_client/tasks/main.yaml を作成し以下の内容を記載します。
---
- name: helm get
  shell: curl -O https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

- name: helm install
  shell: bash ./get-helm-3

- name: helm add repo
  shell: helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

- name: nfs-client deploy
  shell: helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=NFSのIPアドレス --set nfs.path=/share/nfs
---
続いて前回作成したrolesを呼び出す用のプレイブック(k8s-add.yaml)に、このrolesを追加します。
- name: setup k8s
  hosts: kubectl
  remote_user: root

  tasks:
#    - name: metallb setup
#      include_role:
#        name: MetalLB

    - name: nfs-client setup
      include_role:
        name: nfs_client
前回作成済みのMetalLBがすでにあるので、MetalLBについての処理はコメントアウトしています。
あとは、ansibleからプレイブックを実行するだけです。

ansible-playbook k8s-add.yaml
正常に処理が行われたら、PVCが使えるか確認してみましょう。
まず、以下のコマンドで nfs-client を導入したことにより追加された storage class と pod を確認します。
kubectl get pod,sc
nfs-subdir-external-provisioner-xxxxx という pod と nfs-client というstorage class ができていると思います。
現時点では pvc も pv もないことを確認しておいてください。
kubectl get pv,pvc
No resources found
では、pvcを作成するyamlを作成します。
pvc.yaml
----
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-provisioner
  annotations:
    volume.beta.kubernetes.io/storage-class: nfs-client
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
----
以下のコマンドでPVCを作成します。
kubectl apply -f pvc.yaml
pvc とそれに Bound された pv が作成されていることを確認してください。
# kubectl get pv,pvc
今回は以上となります。

2023年3月30日木曜日

GraphQLに触れてみる

GraphQLに触れてみる

◆ やること

Webアプリで別リソースからデータ取得しないといけないケースがたまにあります。
例えば、人事情報は「Google API」から取得、その他は「オンプレのPostgreSQL」から取得…といったケースです。

GraphQLはこういったケースを想定してデータ取得できるようなので、実際にどんなものか触れてみようと思います。
また、別リソースを結合(SQLの内部結合みたいに)してデータ取得できると便利そうなので、結合できるかどうかも確認してみます。

Spring for GraphQL が2022年5月頃にリリースされたため、そちらを使います。

◆ 使うもの

  • Spring for GraphQL (v1.1.3)
  • IntelliJ (CE版 2022.3.1)
  • Java (v17)

◆ GraphQLサーバを構築する

  1. SpringInitializr で以下を [Dependencies] に含めてソースを生成する。
    • Spring Web
    • Spring for GraphQL
    • Lombok

  2. 生成したソースを IntelliJ で読み込む。

  3. 以下のファイルを追加する。
    • src/main/resources/graphql/schema.graphqls
      type Employee {
      code: ID!
      fullName: String!
      department: Department!
      }

      type Department {
      code: ID!
      name: String!
      }

      type Query {
      employees(code: String): [Employee]
      }
      • GraphQLのスキーマやクエリを定義するファイル。
      • employees クエリを呼び出すと Employee(従業員) と 所属している Department(部門) を取得できる。
      • employees クエリは code で絞り込みできる。実際に絞り込んでるのは後述の EmployeeController。

    • Employee.java
      @Getter
      @Builder
      @AllArgsConstructor
      @ToString
      @EqualsAndHashCode
      public class Employee {
      private final String code;
      private final String fullName;
      private final String departmentCode;
      }
      • Employee の DTO。
      • department のメンバはなく、代わりに departmentCode を持つ。
      • Department (DTO) との関連付けは Spring for GraphQL がやってくれる。ただし、後述の EmployeeController の @BatchMapping 関数で結合処理の記述が必要。

    • Department.java
      @Getter
      @Builder
      @AllArgsConstructor
      @ToString
      @EqualsAndHashCode
      public class Department {
      private final String code;
      private final String name;
      }
      • Department の DTO。

    • EmployeeController.java
      @Slf4j
      @Controller
      public class EmployeeController {

      @QueryMapping(name = "employees") //
      public List<Employee> employees(@Argument String code) {
      // 仮データを作成する
      List<Employee> employees = new ArrayList<>();
      employees.add(new Employee("E001", "山田 一郎", "D001"));
      employees.add(new Employee("E002", "山田 二郎", "D002"));
      employees.add(new Employee("E003", "山田 三郎", "D001"));

      // code が指定されている場合、Employee を絞り込む
      if (code != null && !code.equals("")) {
      employees = employees.stream()
      .filter(e -> code.equals(e.getCode()))
      .collect(Collectors.toList());
      }

      // 返却する
      return employees;
      }

      @BatchMapping(typeName = "Employee", field = "department") //
      public Map<Employee, Optional<Department>> department(
      List<Employee> employees) {
      // 仮データを作成する
      List<Department> departments = new ArrayList<>();
      departments.add(new Department("D001", "開発1課"));
      departments.add(new Department("D002", "開発2課"));

      // Employee Department のマッピングを生成して返却する
      return employees.stream()
      .collect(Collectors.toMap(e -> e, e -> departments.stream()
      .filter(d -> d.getCode().equals(e.getDepartmentCode()))
      .findFirst()));
      }
      }
      • employees クエリ用のコントローラ。
      • ①:employees クエリ呼出し時の入り口になる。
      • ②:employees クエリの呼出し時に Employee の department フィールドのデータを取得する際に呼び出される。パラメータの  employees は ① の結果が渡されるので、① の結果の departmentCode を元にデータを取得する形になる。 
        返却値は List を返却してもいいが、Map であればNULL値の設定も可能なので、Map を返却するのが無難。

    • application.yml
      server:
      port : 8080 #
      spring:
      graphql:
      graphiql:
      enabled: true #
      schema:
      printer:
      enabled: true #
      • SpringBoot お馴染みの設定ファイル。
      • ①:サーバのポートを 8080 にしている。
      • ②:true にすると、ブラウザでGraphiQL(≠GraphQL)が使えるようになる。使い方は後述。
      • ③:true にすると、ブラウザでGraphQLのスキーマ定義を参照できるようになる。使い方は後述。

  4. サーバを起動する。


◆ GraphQLサーバからデータを取得する

以下URLにクエリを POST で送信すればデータを取得できます。


何かしらのツールを使って送信すればいいのですが、Spring for GraphQL では以下URLで GraphiQL(≠GraphQL)を使えるため、そちらで試してみます。


Employee の情報だけほしい場合は、以下のようなクエリで取れます。
  • クエリ:
    query {
    employees {
    code
    fullName
    }
    }
  • 結果:



Department の情報もほしければ、以下のようなクエリで取れます。
  • クエリ:
    query {
    employees {
    code
    fullName
    department {
    code
    name
    }
    }
    }
  • 結果:


code で絞り込みたい場合は、以下のようなクエリで取れます。
  • クエリ:
    query {
    employees(code: "E002") {
    code
    fullName
    department {
    code
    name
    }
    }
    }
  • 結果:


以下URLでGraphQLのスキーマ定義も参照できます。

◆ まとめ

SQLみたいな感覚で、ほしい情報だけデータ取得できました。

今回は仮データを返却する形にしましたが、実際は Employee は「Google API」からデータ取得、Department は「オンプレのPostgreSQL」からデータ取得する形で実装すれば、やりたかったことはできます。
 
ただ、Employee と Department の結合に関しては、スキーマ毎に結合処理を別途実装しないといけないため、理想的ではなかったです。。
例えば、新たなスキーマ Company と Department を結合したい場合、この2つの結合処理も別途実装する必要があります。
フレームワークがクエリをうまい具合に読み取って、各スキーマのデータ取得&結合してくれるのが理想的でした。。

結合処理については、REST API 使ったときみたいにコード上で結合処理書くのと大差ない気がするので、GraphQLを使うかどうかは、他のメリット・デメリットで判断したほうがよさそうです。

他のGraphQL(Apollo とか)であれば、結合も楽だったりするんですかね?
機会があれば、その辺も調べてみようと思います。

2023年3月26日日曜日

【VyOS】VyOS 1.2.9 LTSを利用してAWSとIPsec VPNを試してみた 動的ルート編

先日、デプロイしたVyOS 1.2.9 LTSを利用してAWSとの間で動的ルーティングのVPNを試してみました。動的ルーティング構成では、VTIインターフェイスとBGPを利用します。なお、長時間の通信試験はしていません。利用した環境は、以下の通りです。

<利用した環境>

  • VMware Workstation Player 17
    • Windows11 Home
    • VMware v1.2.9 LTS
  • AWS 東京リージョン

<利用した構成図>


AWSの設定とステータスは以下のとおりです。
VPNオプションはデフォルトのまま利用しています。

【Site-to-Site VPN 接続】詳細


【Site-to-Site VPN 接続】トンネルの詳細
 今回の確認では、VyOSからTunnel1のみVPN接続するように設定しました。
 そのため、Tunnel2はダウンしています。


【ルートテーブル】ルート
 前回の静的ルートVPNで利用したVPNゲートウェイを削除したばかりのため、192.168.0.0/24のルートのステータスがブラックホールとなっています。


【ルートテーブル】ルート伝播



VyOSの設定は以下となります。
繰り返しになりますが、今回は簡易確認のためAWSとのVPN接続は1つだけ設定しています。
vyos@vyos:~$ show configuration commands
set firewall all-ping 'enable'
set firewall broadcast-ping 'disable'
set firewall config-trap 'disable'
set firewall ipv6-receive-redirects 'disable'
set firewall ipv6-src-route 'disable'
set firewall ip-src-route 'disable'
set firewall log-martians 'enable'
set firewall options interface vti0 adjust-mss '1394'
set firewall receive-redirects 'disable'
set firewall send-redirects 'enable'
set firewall source-validation 'disable'
set firewall syn-cookies 'enable'
set firewall twa-hazards-protection 'disable'
set interfaces ethernet eth0 address 'dhcp'
set interfaces ethernet eth0 duplex 'auto'
set interfaces ethernet eth0 hw-id '00:0c:29:f3:72:11'
set interfaces ethernet eth0 smp-affinity 'auto'
set interfaces ethernet eth0 speed 'auto'
set interfaces ethernet eth1 address '192.168.1.1/24'
set interfaces ethernet eth1 duplex 'auto'
set interfaces ethernet eth1 hw-id '00:0c:29:f3:72:1b'
set interfaces ethernet eth1 smp-affinity 'auto'
set interfaces ethernet eth1 speed 'auto'
set interfaces vti vti0 address '169.254.204.246/30'
set interfaces vti vti0 mtu '1436'
set nat source rule 1 outbound-interface 'eth0'
set nat source rule 1 translation address 'masquerade'
set protocols bgp 65000 address-family ipv4-unicast network 192.168.1.0/24
set protocols bgp 65000 neighbor 169.254.204.245 remote-as '64512'
set protocols bgp 65000 neighbor 169.254.204.245 timers holdtime '30'
set protocols bgp 65000 neighbor 169.254.204.245 timers keepalive '10'
set protocols static interface-route 169.254.204.244/30 next-hop-interface vti0
set service ssh port '22'
set system config-management commit-revisions '100'
set system console device ttyS0 speed '9600'
set system host-name 'vyos'
set system login user vyos authentication encrypted-password '[vyos-password]'
set system login user vyos authentication plaintext-password ''
set system login user vyos level 'admin'
set system ntp server 133.243.238.243
set system syslog global facility all level 'notice'
set system syslog global facility protocols level 'debug'
set system time-zone 'Asia/Tokyo'
set vpn ipsec esp-group esp-grp-01 compression 'disable'
set vpn ipsec esp-group esp-grp-01 lifetime '3600'
set vpn ipsec esp-group esp-grp-01 mode 'tunnel'
set vpn ipsec esp-group esp-grp-01 pfs 'dh-group21'
set vpn ipsec esp-group esp-grp-01 proposal 1 encryption 'aes256'
set vpn ipsec esp-group esp-grp-01 proposal 1 hash 'sha256'
set vpn ipsec ike-group ike-grp-01 close-action 'none'
set vpn ipsec ike-group ike-grp-01 dead-peer-detection action 'restart'
set vpn ipsec ike-group ike-grp-01 dead-peer-detection interval '10'
set vpn ipsec ike-group ike-grp-01 dead-peer-detection timeout '120'
set vpn ipsec ike-group ike-grp-01 ikev2-reauth 'no'
set vpn ipsec ike-group ike-grp-01 key-exchange 'ikev2'
set vpn ipsec ike-group ike-grp-01 lifetime '28800'
set vpn ipsec ike-group ike-grp-01 proposal 1 dh-group '21'
set vpn ipsec ike-group ike-grp-01 proposal 1 encryption 'aes256'
set vpn ipsec ike-group ike-grp-01 proposal 1 hash 'sha256'
set vpn ipsec ipsec-interfaces interface 'eth0'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  authentication pre-shared-secret '[pre-shared key1]'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  connection-type 'initiate'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  default-esp-group 'esp-grp-01'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  description 'AWS-VPC-01'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  ike-group 'ike-grp-01'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  ikev2-reauth 'inherit'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  local-address '192.168.115.130'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  vti bind 'vti0'
set vpn ipsec site-to-site peer  [AWS-VirtualPrivateGateway-IP1]  vti esp-group 'esp-grp-01'
vyos@vyos:~$

VyOSでVPNステータスを確認した結果は以下となります。
vyos@vyos:~$ show vpn ike sa
Peer ID / IP                            Local ID / IP
------------                            -------------
[AWS-VirtualPrivateGateway-IP1]                           192.168.115.130

    Description: AWS-VPC-01

    State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
    -----  ------  -------  ----    ---------      -----  ------  ------
    up     IKEv2   aes256   sha256_128 21(ECP_521)    no     7200    28800


vyos@vyos:~$ show vpn ipsec sa
Connection                     State    Up           Bytes In/Out    Remote address    Remote ID    Proposal
-----------------------------  -------  -----------  --------------  ----------------  -----------  -------------------------------------------------------
peer-[AWS-VirtualPrivateGateway-IP1]-tunnel-vti  up       110 minutes  11K/16K         [AWS-VirtualPrivateGateway-IP1]     N/A          AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_521
vyos@vyos:~$  
VyOSでBGPネイバーとルーティングを確認した結果は以下となります。
vyos@vyos:~$ show ip bgp
BGP table version is 2, local router ID is 192.168.115.130, vrf id 0
Default local pref 100, local AS 65000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 172.31.0.0/16    169.254.204.245        100             0 64512 i
*> 192.168.1.0/24   0.0.0.0                  0         32768 i

Displayed  2 routes and 2 total paths
vyos@vyos:~$ show ip bgp neighbors
BGP neighbor is 169.254.204.245, remote AS 64512, local AS 65000, external link
  BGP version 4, remote router ID 169.254.204.245, local router ID 192.168.115.130
  BGP state = Established, up for 01:54:51
  Last read 00:00:10, Last write 00:00:10
  Hold time is 30, keepalive interval is 10 seconds
  Configured hold time is 30, keepalive interval is 10 seconds
  Neighbor capabilities:
    4 Byte AS: advertised and received
    AddPath:
      IPv4 Unicast: RX advertised IPv4 Unicast
    Route refresh: advertised and received(old & new)
    Address Family IPv4 Unicast: advertised and received
    Hostname Capability: advertised (name: vyos,domain name: n/a) not received
    Graceful Restart Capabilty: advertised
  Message statistics:
    Inq depth is 0
    Outq depth is 0
                         Sent       Rcvd
    Opens:                  1          1
    Notifications:          0          0
    Updates:                2          2
    Keepalives:           689        690
    Route Refresh:          0          0
    Capability:             0          0
    Total:                692        693
  Minimum time between advertisement runs is 0 seconds

 For address family: IPv4 Unicast
  Update group 1, subgroup 1
  Packet Queue length 0
  Community attribute sent to this neighbor(all)
  1 accepted prefixes

  Connections established 1; dropped 0
  Last reset 01:54:53,  Waiting for peer OPEN
Local host: 169.254.204.246, Local port: 54076
Foreign host: 169.254.204.245, Foreign port: 179
Nexthop: 169.254.204.246
Nexthop global: fe80::5efe:c0a8:7382
Nexthop local: fe80::5efe:c0a8:7382
BGP connection: shared network
BGP Connect Retry Timer in Seconds: 120
Estimated round trip time: 32 ms
Read thread: on  Write thread: on  FD used: 27

vyos@vyos:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

S>* 0.0.0.0/0 [210/0] via 192.168.115.2, eth0, 01:54:57
S   169.254.204.244/30 [1/0] is directly connected, vti0, 01:54:54
C>* 169.254.204.244/30 is directly connected, vti0, 01:54:54
B>* 172.31.0.0/16 [20/100] via 169.254.204.245, vti0, 01:54:53
C>* 192.168.1.0/24 is directly connected, eth1, 01:54:59
C>* 192.168.115.0/24 is directly connected, eth0, 01:54:58
vyos@vyos:~$

VyOSからPingとcurlコマンドを実行します。

vyos@vyos:~$ ping 169.254.204.245 count 4
PING 169.254.204.245 (169.254.204.245) 56(84) bytes of data.
64 bytes from 169.254.204.245: icmp_seq=1 ttl=254 time=57.7 ms
64 bytes from 169.254.204.245: icmp_seq=2 ttl=254 time=54.1 ms
64 bytes from 169.254.204.245: icmp_seq=3 ttl=254 time=43.1 ms
64 bytes from 169.254.204.245: icmp_seq=4 ttl=254 time=40.9 ms

--- 169.254.204.245 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 40.914/48.990/57.715/7.099 ms
vyos@vyos:~$
vyos@vyos:~$ ping 172.31.0.143 count 4 interface 192.168.1.1
PING 172.31.0.143 (172.31.0.143) from 192.168.1.1 : 56(84) bytes of data.
64 bytes from 172.31.0.143: icmp_seq=1 ttl=127 time=68.3 ms
64 bytes from 172.31.0.143: icmp_seq=2 ttl=127 time=48.3 ms
64 bytes from 172.31.0.143: icmp_seq=3 ttl=127 time=216 ms
64 bytes from 172.31.0.143: icmp_seq=4 ttl=127 time=54.4 ms

--- 172.31.0.143 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 48.381/96.924/216.491/69.410 ms
vyos@vyos:~$
vyos@vyos:~$ curl --interface 192.168.1.1 172.31.0.143
<html><body><h1>It works!</h1></body></html>
vyos@vyos:~$

VyOSからAWSのEC2インスタンスへ通信できることを確認しました。
今回はこのへんで。それでは。

2023年3月25日土曜日

【VyOS】VyOS 1.2.9 LTSを利用してAWSとIPsec VPNを試してみた 静的ルート編


先日、デプロイしたVyOS 1.2.9 LTSを利用してAWSとの間で静的ルートを利用するIPsec VPNを試してみました。今回はVTIインターフェイスを使わない設定を試しました。なお、長時間の通信試験はしていません。利用した環境は、以下の通りです。

<利用した環境>

  • VMware Workstation Player 17
    • Windows11 Home
    • VMware v1.2.9 LTS
  • AWS 東京リージョン

<利用した構成図>


AWSの設定とステータスは以下のとおりです。
VPNオプションはデフォルトのまま利用しています。

【Site-to-Site VPN 接続】詳細


【Site-to-Site VPN 接続】トンネルの詳細


【Site-to-Site VPN 接続】静的ルート


【ルートテーブル】ルート


【ルートテーブル】ルート伝播


VyOSの設定は以下となります。今回はVPN確立と簡単な疎通確認のみのため、TCP MSSは設定していません。
vyos@vyos:~$ show configuration commands
set interfaces ethernet eth0 address 'dhcp'
set interfaces ethernet eth0 duplex 'auto'
set interfaces ethernet eth0 hw-id '00:0c:29:f3:72:11'
set interfaces ethernet eth0 smp-affinity 'auto'
set interfaces ethernet eth0 speed 'auto'
set interfaces ethernet eth1 address '192.168.0.1/24'
set interfaces ethernet eth1 duplex 'auto'
set interfaces ethernet eth1 hw-id '00:0c:29:f3:72:1b'
set interfaces ethernet eth1 smp-affinity 'auto'
set interfaces ethernet eth1 speed 'auto'
set service ssh port '22'
set system config-management commit-revisions '100'
set system console device ttyS0 speed '9600'
set system host-name 'vyos'
set system login user vyos authentication encrypted-password '<VyOS-Password>'
set system login user vyos authentication plaintext-password ''
set system login user vyos level 'admin'
set system ntp server 133.243.238.243
set system syslog global facility all level 'notice'
set system syslog global facility protocols level 'debug'
set system time-zone 'Asia/Tokyo'
set vpn ipsec esp-group esp-grp-01 compression 'disable'
set vpn ipsec esp-group esp-grp-01 lifetime '3600'
set vpn ipsec esp-group esp-grp-01 mode 'tunnel'
set vpn ipsec esp-group esp-grp-01 pfs 'dh-group21'
set vpn ipsec esp-group esp-grp-01 proposal 1 encryption 'aes256'
set vpn ipsec esp-group esp-grp-01 proposal 1 hash 'sha256'
set vpn ipsec ike-group ike-grp-01 close-action 'none'
set vpn ipsec ike-group ike-grp-01 dead-peer-detection action 'restart'
set vpn ipsec ike-group ike-grp-01 dead-peer-detection interval '10'
set vpn ipsec ike-group ike-grp-01 dead-peer-detection timeout '120'
set vpn ipsec ike-group ike-grp-01 ikev2-reauth 'no'
set vpn ipsec ike-group ike-grp-01 key-exchange 'ikev2'
set vpn ipsec ike-group ike-grp-01 lifetime '28800'
set vpn ipsec ike-group ike-grp-01 proposal 1 dh-group '21'
set vpn ipsec ike-group ike-grp-01 proposal 1 encryption 'aes256'
set vpn ipsec ike-group ike-grp-01 proposal 1 hash 'sha256'
set vpn ipsec ipsec-interfaces interface 'eth0'
set vpn ipsec nat-traversal 'enable'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] authentication pre-shared-secret '<pre-shared key1>'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] connection-type 'initiate'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] default-esp-group 'esp-grp-01'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] description 'AWS-VPC-01'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] ike-group 'ike-grp-01'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] ikev2-reauth 'inherit'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] local-address '192.168.115.130'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] tunnel 1 allow-nat-networks 'disable'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] tunnel 1 allow-public-networks 'disable'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] tunnel 1 esp-group 'esp-grp-01'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] tunnel 1 local prefix '192.168.0.0/24'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] tunnel 1 protocol 'all'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP1] tunnel 1 remote prefix '172.31.0.0/16'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] authentication pre-shared-secret '<pre-shared key2>'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] connection-type 'initiate'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] default-esp-group 'esp-grp-01'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] description 'AWS-VPC-02'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] ike-group 'ike-grp-01'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] ikev2-reauth 'inherit'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] local-address '192.168.115.130'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] tunnel 1 allow-nat-networks 'disable'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] tunnel 1 allow-public-networks 'disable'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] tunnel 1 esp-group 'esp-grp-01'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] tunnel 1 local prefix '192.168.0.0/24'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] tunnel 1 protocol 'all'
set vpn ipsec site-to-site peer [AWS-VirtualPrivateGateway-IP2] tunnel 1 remote prefix '172.31.0.0/16'
vyos@vyos:~$


VyOSでVPNステータスを確認した結果は以下となります。
vyos@vyos:~$ show vpn ike sa
Peer ID / IP                            Local ID / IP
------------                            -------------
[AWS-VirtualPrivateGateway-IP1]                             192.168.115.130

    Description: AWS-VPC-01

    State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
    -----  ------  -------  ----    ---------      -----  ------  ------
    up     IKEv2   aes256   sha256_128 21(ECP_521)    no     3600    28800


Peer ID / IP                            Local ID / IP
------------                            -------------
[AWS-VirtualPrivateGateway-IP2]                           192.168.115.130

    Description: AWS-VPC-02

    State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
    -----  ------  -------  ----    ---------      -----  ------  ------
    up     IKEv2   aes256   sha256_128 21(ECP_521)    no     3600    28800


vyos@vyos:~$
vyos@vyos:~$ show vpn ipsec sa
Connection                   State    Up          Bytes In/Out    Remote address    Remote ID    Proposal
---------------------------  -------  ----------  --------------  ----------------  -----------  -------------------------------------------------------
peer-[AWS-VirtualPrivateGateway-IP1]-tunnel-1    up       39 minutes  38K/54K         [AWS-VirtualPrivateGateway-IP1]       N/A          AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_521
peer-[AWS-VirtualPrivateGateway-IP2]-tunnel-1  up       39 minutes  0B/0B           [AWS-VirtualPrivateGateway-IP2]     N/A          AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_521
vyos@vyos:~$
vyos@vyos:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

S>* 0.0.0.0/0 [210/0] via 192.168.115.2, eth0, 00:45:20
C>* 192.168.0.0/24 is directly connected, eth1, 00:45:19
C>* 192.168.115.0/24 is directly connected, eth0, 00:45:21
vyos@vyos:~$

VyOSからPingとcurlコマンドを実行します。

vyos@vyos:~$ ping 172.31.0.143 count 4
PING 172.31.0.143 (172.31.0.143) 56(84) bytes of data.
64 bytes from 172.31.0.143: icmp_seq=1 ttl=127 time=52.3 ms
64 bytes from 172.31.0.143: icmp_seq=2 ttl=127 time=60.7 ms
64 bytes from 172.31.0.143: icmp_seq=3 ttl=127 time=59.4 ms
64 bytes from 172.31.0.143: icmp_seq=4 ttl=127 time=36.4 ms

--- 172.31.0.143 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 36.401/52.247/60.723/9.684 ms
vyos@vyos:~$

vyos@vyos:~$ curl 172.31.0.143
<html><body><h1>It works!</h1></body></html>
vyos@vyos:~$

VyOSからAWSのEC2インスタンスへ通信できることを確認しました。
今回はこのへんで。それでは。

2023年3月22日水曜日

【VyOS】VyOS 1.2.9 LTS をVMware Workstation Playerで動かしてみた


先日、VyOS 1.2.9LTSが無料ダウンロードできることを知りました。

今回は、試しにPCにインストールしているVMware Workstation PlayerでVyOS 1.2.9 LTSを動かしてみました。

VMware Workstation PlayerはWindows上で仮想マシンを動かすことができるソフトウェアです。VMware Workstation Playerは非商用利用であれば無料で利用できます。以下よりダウンロードできます。

VMware Workstation Player

https://www.vmware.com/products/workstation-player.html

製品のダウンロード 

https://customerconnect.vmware.com/jp/downloads/#all_products


今回はVyOSのWebサイトからダウンロードしたVyOSのOVAファイルを利用してVMware Workstation PlayerにVyOS仮想マシンをデプロイします。

利用したOVAファイルとVMware Workstation環境は以下となります。

  • VyOS 1.2.9 LTS
  • VMware(R) Workstation 17 Player
    • 利用したときのバージョン:17.0.1 build-21139696
    • 利用したPCOS:Window11Home(10.0.22624ビルド22624)
OVAファイルを利用したVMware(R) Workstation 17 Playerへのデプロイはとても簡単です。OVAファイルをダブルクリックするだけで完了します。ダブルクリックすると仮想マシン名とファイル置き場を設定するためのポップアップが表示されます。任意の仮想マシン名と仮想マシンファイルの保存場所を設定して「インポート」をクリックします。


インポートが正常に完了してVyOS仮想マシンの起動に十分なリソースがPCにある場合は、以下のにようにインポートした仮想マシンが自動起動します。


私がインポートしたOVAファイルの仮想マシンデフォルト設定値は以下となっていました。


VyOSの最小システム要件を確認してみましょう。

以下のドキュメントにVyOSの最小システム要件は、512 MiB RAM と 2 GiB ストレージと記載されています。

Docs » Installation and Image Management » Installation

https://docs.vyos.io/en/crux/installation/install.html

私は簡単に試したいだけなので、RAM4GBはちょっとオーバースペックかもしれませんね。

仮想マシンを停止してから仮想マシンの利用リソースを調整します。

今回はRAM1GBとしました。


再度仮想マシンを起動してOSが起動完了することを確認します。
今回はこの辺で。それでは。

2023年3月21日火曜日

【VyOS】 古いソフトウェアバージョン(v1.2.9 LTS)の無料ダウンロードが可能に

VyOSのブログを眺めていたら、以下の投稿をみつけました。

Community support for open-source and why it's important
https://blog.vyos.io/community-support-for-open-source

このブログの最後に「古いソフトウェアリリースの無料提供の要望が多いので検討している」と書かれていました。数年前までVyOSのWebサイトでバージョン1.1.8のソフトウェアイメージが無料でダウンロードできましたが、いつからかWebサイトから無料で入手できるソフトウェアは、日々更新される最新版の「ナイトリービルド」のみになっていました。

VyOS Nightly Build    

https://vyos.net/get/nightly-builds

上記のブログ記事によると、今でも過去に提供されていたVyOS 1.1.xが利用されているケースが多いこともあり安全性と機能性の維持やVyOSへの関心を高めるために古いソフトウェアイメージ(VyOS 1.2.9 LTS )を無料で提供することを検討する、とのことでした。

VyOSのバージョンv1.2.9が提供されているのか、ダウンロードサイトで確認してみたところ、なんと、、、



提供が開始されてました!

今でも検証用途でv1.1.xを利用されている方は、この機会に試しにv1.2.9を利用してみてはいかがでしょうか?

v1.2.xで何ができるか?については、以下のDocsが参考になるかもしれません。

VyOS User Guide

https://docs.vyos.io/en/crux/

GitHub vyos/vyos-documentation

https://github.com/vyos/vyos-documentation/tree/crux/docs

それでは。