まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

【前回の復習と今回の目的】
前回のブログエントリで VirtualBox 内の閉域ネットワーク上に VM (下図の VM1)を作る手順を紹介しました:
2025020101

今回は下図の VM0 に相当するような、インターネット接続ルータとなるサーバーを VirtualBox 内に作る手順を紹介します。閉域ネットワークだけなら構築は簡単ですが、インターネット接続ができないので OS やアプリケーションの導入がかなり面倒になります。一方、これができると VPC っぽい感じの便利な(というか不便でない)環境が使えるようになり、VM0 や VM1 だけでなく、この内部ネットワークに繋がる全てのサーバーのアウトバウンド・インターネット接続が可能になります:
2025020102


というわけで、今回のブログエントリでは上図の VM0 に相当するようなルーターを VirtualBox で作る手順を紹介します。


【VirtualBox でルータを作る】
上手の VM0 に相当するルータを作ろうとすると、少なくとも2つの NIC (内部ネットワークに接続されるものと、インターネットに繋がる回線に接続されるもの)が必要になり、これらの間でルーティングを実装する必要があります。

というわけで、VirtualBox の VM でも2つの NIC を有効にする必要があります。VM 作成時に(作成してシャットダウン後でも構いません)、ネットワークのアダプター設定を変更します。まずアダプター1(上図での eth0)は普通に intnet の内部ネットワークに接続する設定にします:
2025020201


その上でアダプター2(上図での eth1)も有効化し、割り当て種類をインターネットに接続できるものにします。「NAT」か「ブリッジアダプター」になりますが、今回は設定がより簡単な「NAT」にしました:
2025020202


そして VM を起動し、NIC のアダプター名を確認します。仮にアダプター1が eth0 、アダプター2が eth1 であったと仮定します:
# nmcli device
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  eth0
eth1    ethernet  connected  eth1
  :


まず eth0 の設定は IP アドレス(10.10.0.1)以外は前回と同様です。内部ネットワークである intnet(10.10.0.0/24)に接続して動くような設定を行います:
# nmcli con add ifname eth0 con-name eth0 type ethernet eth0 をインターフェースとして追加

# nmcli con mod eth0 connection.autoconnect yes OS起動時に自動接続

# nmcli con mod eth0 ipv4.addresses 10.10.0.1/24 IPv4アドレスとネットマスク

# nmcli con mod eth0 ipv4.method manual 手動設定であることを明示

# nmcli con mod eth0 ipv4.dns 10.10.0.10 DNSサーバー

# nmcli con up eth0 ここまでの設定を有効化

ここからが今回の肝になる部分です。インターネットに NAT で接続する側である eth1 の設定を以下のようにします:
# nmcli con add ifname eth1 con-name eth1 type ethernet eth1 をインターフェースとして追加

# nmcli con mod eth1 connection.autoconnect yes OS起動時に自動接続

# nmcli con up eth1 ここまでの設定を有効化


これで2つのネットワークアダプターそれぞれの設定を行いました。最後にこの2つのアダプター間で IP フォワーディングと IP マスカレードによるルーティングを行うための設定を追加します:
(/etc/sysctl.conf に "net.ipv4_forward=1" を追加)

# sysctl -p

# iptables-save 現在の iptables 設定を確認(何も表示されないことを確認)

# iptables -A FORWARD -j ACCEPT ポートフォワーディングを有効化

# iptables -t nat -s 10.10.0.0/24 -A POSTROUTING -j MASQUERADE NAT による IP マスカレードを有効化

これで閉域ネットワークだった intnet 内からインターネットを使えるようにするためのルータ VM0 が準備できました。

ここまでできたら、後は intnet 内の VM(例えば VM1)のデフォルトゲートウェイを VM0 に指定し、インターネット用の DNS を追加設定するだけです。VM1 で以下を実行してデフォルトゲートウェイを VM0 に設定します:
# nmcli con mod eth0 ipv4.gateway 10.10.0.1 デフォルトゲートウェイを VM0 に指定

# nmcli con up eth0 ここまでの設定を有効化

最後に VM1 から DNS 含めてインターネットに接続できることを確認します。下の例では "www.ibm.com" というインターネット上のホスト名を指定して、IP アドレス解決ができ、ping も通ることを確認しています:
# ping www.ibm.com

PING e7817.dscx.akamaiedge.net (23.35.121.153) 56(84) bytes of data.
64 bytes from a23-35-121-153.deploy.static.akamaitechnologies.com (23.35.121.153): icmp_seq=1 ttl=54 time=11.6 ms
64 bytes from a23-35-121-153.deploy.static.akamaitechnologies.com (23.35.121.153): icmp_seq=2 ttl=54 time=24.6 ms
  :

閉域ネットワーク内に作った VM1 がインターネットルータとなる VM0 を経由して外部に接続できるようになったことが確認できました。





ブロードコム社による VMWare のライセンス変更の影響もあって、なんとなく「仮想環境として VMWare を選びにくい」心理になっているのは自分だけじゃないと思ってます。事実、自分は昨年のプロジェクトにおける検証環境として仮想環境が必要だったのですが、自社も扱っている VMWare を選ぶことに躊躇して、結局使いませんでした。。

問題は「VMWare を使わないとして、じゃあ何を使う?」です。もちろん VMWare の便利さ(複数サーバーで1つの環境を構築できるのはリソース管理の視点で便利ですよね)も理解しているし、「使う側の慣れ(別の環境だと慣れるまでが不安)」の問題もあるので、なんでもいいというわけにはいかないことは理解しています。

そこまで理解した上で、自分は昨年1年間を通じて Oracle の VirtualBox を使う機会が数度ありました。もともと個人所有の(PC-DOS や OS/2 資産を残しておくための)仮想環境として使っていたこともあったのですが、単に「VM を起動するだけ」の使い方しかしていませんでした(ネットワーク周りなどは全然・・)。そんな自分も業務を通じて1年間使ってきたこともあり、ある程度理解が深まったと思うので、今年はそのアウトプットを行っていこうと思います:
2025012101


まず最初は「VirtualBox 内で VPC(Virtual Private Cloud) っぽい環境を作る」手順を数度に分けて紹介していこうと考えています。VPN などで外部からアクセスできるような所までは想定しませんが、原則的にはインターネット接続のない閉じたネットワークを作って、その上で複数の VM を動かしたり、インターネット接続のためのルータを作った上でデフォルトゲートウェイとして指定することでアウトバウント・インターネット接続を実現する、といった内容を紹介していく予定です。

というわけで、今回は VirtualBox でインターネット接続のないネットワークを作って、その中で VM を動かすまでの手順を紹介します。


【VirtualBox で外部とは繋がらないネットワークに VM を配置する】
まず VirtualBox のネットワークにはどんな種類があるのか調べてみます。適当な VM を選択して設定を開き、ネットワーク項目を確認します。有効化されているアダプターを見つけ(あるいは適当なアダプターを選んで有効化し)、割り当てボックスを開きます:
2025013101


私の環境は VirtualBox 7.0.12 なのですが、その場合はこのような選択肢が表示されました。これだけの種類のネットワークがあり、VirtualBox で指定できます:
2025013102


「NAT」や「ブリッジアダプター」は比較的わかりやすいのではないかと思ってます(ホスト PC がインターネットに繋がっていれば、どちらも外部接続可能です)。外部につながらないネットワークという意味では「内部ネットワーク」と「ホストオンリーアダプター」がありますが、後者はどちらかというと単体、他の VM との通信を行うネットワークに接続させたい場合は前者の「内部ネットワーク」を選択することになるようです。

「内部ネットワーク」を選ぶと、画面はこのようになります:
2025013103


この「名前」の値(上図では "intnet" となっている部分)が「内部ネットワークの名前」に相当するもので、デフォルト値は "intnet" です。複数の VM が同じ名前の内部ネットワークに接続されたアダプターを持っていれば、それらの VM は(同じネットワークアドレスの IP アドレスが割り当てられていれば)通信できることになります。2つ以上の異なる内部ネットワークを定義したい場合は、この "intnet" と書かれている部分を別の名前に書き換えることで「別のネットワーク」扱いになり、通信はできなくなります。

というわけで、VirtualBox で外部に繋がらないネットワーク上に VM を配置したい場合はネットワークアダプタの種類を「内部ネットワーク」に指定して VM を作ればよいことになります。

その上で VM を作成・起動し、まずは VirtualBox の OS 内でのネットワークインターフェース名を確認するため、以下のコマンドを入力します:
# nmcli device

この結果、例えばネットワークインターフェース名が eth0 であれば(CentOS や RHEL であれば)以下のような設定を実施します(赤字はコメントです):
# nmcli con add ifname eth0 con-name eth0 type ethernet eth0 をインターフェースとして追加

# nmcli con mod eth0 connection.autoconnect yes OS起動時に自動接続

# nmcli con mod eth0 ipv4.addresses 10.10.0.10/24 IPv4アドレスとネットマスク

# nmcli con mod eth0 ipv4.method manual 手動設定であることを明示

# nmcli con mod eth0 ipv4.dns 10.10.0.10 DNSサーバー

# nmcli con up eth0 ここまでの設定を有効化

これでインターネットには接続できないネットワーク 10.10.0.0/24 内に IP アドレス 10.10.0.10 で接続されたサーバーを作ることができます。

図で示すとこんな感じの VM1 に相当するサーバーを作ることができます:
2025020101


注意が必要な点として、オフライン(インターネット接続がない)なので、インストール時のネットワーク経由でのユーザー登録やサブスクリプション登録もできない、という点です。オフラインインストール方法は OS ごとに異なるはずですが、RHEL 9 の場合は過去に調べてまとめたことがあるので、(超面倒ですが)必要な方はこちらも参照ください:
RHEL 9.x のオフラインインストール


次回はこのエアギャップ(インターネット非接続)ネットワーク上に、インターネットとのデフォルトゲートウェイになるようなルータを構築する手順を紹介する予定です。こちらも図で示すとこちらの VM0 に相当するサーバーを作って、閉域ネットワークである intnet に接続したサーバー(VM1 など)がインターネット接続できるようにします:
2025020102




私自身は日本アイ・ビー・エム社員で、現在はクラウド/コンテナ廻りの技術業務を担当しています。比較的「新しめの技術」に携わっているという自己認識をしています。

一方で、レガシーな技術に興味がないわけではありません。PC-DOS や OS/2 は今でも仮想環境を残して使えるようにしています。

ただ、いわゆる「ホスト」の AS/400 (System i、i5/OS)はこれまで自分に縁のないテーマでした。「CPU やメモリ、ファイルシステムなどのハードウェアリソースは全て OS 内では仮想化されて、実体をほとんど意識することなく使える」とか、「専用のターミナルエミュレータから利用する」という説明を受けて興味は持つのですが、「これまで利用する機会も環境もなかった」というのが正直な所です。

そんな中、無料で AS/400 にアクセスできる環境があることを知り、まずは試してみました。その時の作業記録をブログとして残します。


【PUB400.COM にアカウントを作る】
www.powerbunker.com という所(会社?)が PUB400.COM というオンラインサインアップ可能なパブリック AS/400 を公開していることを知りました。

サインアップするにはウェブブラウザで https://pub400.com/ にアクセスします:
2025011702


トップページに PUB400 の説明やルールなどが記載されています。無償でコミュニティ向けに提供いただいている IBM i 7.5 サーバー環境なので、無茶なことはせず、丁寧に使いましょう。

画面を下までスクロールすると左下に "Sign Up Now!" と書かれたエリアが見つかります。サインアップはここをクリックします:
2025011703


リンク先ページを下までスクロールするとユーザー登録情報を入力するフォームが表示されます。名、姓、メールアドレス(2回)、希望ユーザー名を入力し、最後にユーザー登録する上での取り決めに関する内容に同意するチェックボックスにチェックを入れて Submit します。

なお、登録可能なメールアドレスの種類について、outlook や gmail 、hotmail といったフリーメールだと確認メールが届かない問題がある、と書かれている模様です(詳しくは不明)。この辺り注意してメールアドレスを指定してください:
2025011704


正しく PUB400 からの確認メールが受信できた場合、以下のようなメールが届くはずです(経験的にはすぐではなく、少し時間が経って届きました)。確認のため、メール内に書かれたリンク(赤枠)部をクリックします:
2025011705


ここまでの作業が全て正しく処理されるとユーザーが作成され、更に少し待つと PUB400 から以下のようなユーザープロファイル(赤枠部は初期パスワード)を報告するメールが届きます:
2025011706


これで PUB400 内の AS/400 にアカウントを作ることができました。


【5250 エミュレータをインストールする】
アカウントが作れたので早速ログインを・・・と考えてしまうのですが、AS/400 はログイン前にもう1ステップ必要です。それが 5250 接続するための準備です。

この PUB400 では SSH でログインする方法も提供されていて、それはそれで意味があるとは思っていますが、せっかく AS/400 のアカウントがあるなら AS/400 ネイティブな方法でログインしたいものです。それには 5250 と呼ばれるターミナル(現実的にはターミナルのエミュレーター)が必要です。

過去に AS/400 にアクセスしたことがある人であれば、IBM PCOMM などの 5250 エミュレーターを所有しているかもしれませんが、そこまで一般的ではないと思うので、ここではオープンソースの 5250 エミュレーター製品である tn5250 をビルドして使う方法を紹介します。

私自身は普段 Windows を使っています。Windows ユーザーの場合は WSL2 の Ubuntu を有効にするなどして Linux が使える環境を用意してください。Mac ユーザーや Linux ユーザー(ラズパイ含む)は同様に利用できると思います(が、以下で紹介する手順は Ubuntu など Debian ベースの Linux を想定したものになっている点にご注意を)。

まずは Ubuntu 環境にビルドに必要なツール類をまとめてインストールしておきます。ターミナルを開いて以下を実行します:
$ sudo apt install autoconf automake libtool


tn5250 を利用するにはソースコードからビルドする必要があります。ターミナル内で以下の手順を順次実行します:
$ git clone https://github.com/tn5250/tn5250

$ cd tn5250

$ ./autogen.sh

$ ./configure

$ make

$ sudo make install


ターミナルを一度終了して、再度起動することで tn5250 が使えるようになります。


【5250 エミュレータで PUB400 の AS/400 にアクセスする】
実際に PUB400 の AS/400 にアクセスするには以下のコマンドを実行します:
$ tn5250 pub400.com

すると tn5250 が起動して PUB400 に接続します。AS/400(正確には IBM i 7.5)のログイン画面が表示されているので、PUB400 にサインアップした時のユーザー名と初期パスワードでログインします。ちなみにユーザー名のフィールドからパスワードのフィールドに移るには TAB キーを使います(初回のみログイン直後にパスワードを更新する必要があります):
2025011801


ログインが成功すると AS/400 のメインメニュー画面が表示されます。が、ここから何を選ぶと何ができるのか、実はよくわかっていません。。これからこの環境で勉強します:
2025011602


ターミナル内で実行している tn5250 を終了するには Ctrl + Q です。これで元の(WSL などの)ターミナルに戻れます。

なお上でも少し触れましたが、PUB400 は SSH でログインすることも可能です。ホスト名は pub400.com 、ただしポート番号は 22 ではなく 2222 を指定して接続する必要があります。ユーザー名とパスワードは 5250 接続時と共通です:
2025011802


接続できるとプロンプトが表示されます。一般的な Linux 環境と比較して使えないコマンドも結構ありますが、UNIX/Linux に慣れた人であればある程度使いやすいのではないかと思います:
2025011803


この環境には Node.js v18 も導入されていました。Node.js のプログラミングはこの環境でできそうです:
2025011804


SSH は慣れているぶん使いやすいけど、せっかくの 5250 接続環境なのでネイティブな AS/400 の勉強もできる環境として使わせていただきます。RPG のプログラミングなどはできそうなので、生成 AI で RPG のコードを作ってもらって、この環境で実行、みたいな使い方もできるかな。

このページのトップヘ