クラウド上でのメインフレーム開発環境構築 - (7) ネットワーク構成補足

# はじめに
ZD&Tインスタンス(z/OS)を使用する場合、主にPCOMなどの3270エミュレーターでの操作、および、TCP/IPでの各種通信(SSH, FTP, ミドルウェアの疎通など)を行いたい、ということになると思います。
その際ネットワーク構成を意識する必要がありますが、このネットワーク構成周りが少し分かりにくいので当記事で補足します。
※ちなみにZD&T(zPDT)がエミュレートするOSAではSNAの通信は正式サポートされません(テストされていない)。

## 関連記事
[クラウド上でのメインフレーム開発環境構築 - (1) 仮想サーバー作成](https://qiita.com/tomotagwork/items/3b0c918c37ccf54a9ce8)
[クラウド上でのメインフレーム開発環境構築 - (2) ZD&T管理サーバーのインストール](https://qiita.com/tomotagwork/items/c6f52fd6e4aadbde3275)
[クラウド上でのメインフレーム開発環境構築 - (3) ライセンス管理](https://qiita.com/tomotagwork/items/319475bcc924989260ef)
[クラウド上でのメインフレーム開発環境構築 - (4) ZD&Tインスタンス作成概要(ADCD)](https://qiita.com/tomotagwork/items/d14d35d3ab3c35c07545)
[クラウド上でのメインフレーム開発環境構築 - (5) ZD&Tインスタンス作成詳説(ADCD)](https://qiita.com/tomotagwork/items/b00934969af680a30392)
[クラウド上でのメインフレーム開発環境構築 - (6) DeviceMapファイル補足](https://qiita.com/tomotagwork/items/fa3f9099e125806c410e)
[クラウド上でのメインフレーム開発環境構築 - (7) ネットワーク構成補足](https://qiita.com/tomotagwork/items/369367bae3d3cd3c8a15)
[クラウド上でのメインフレーム開発環境構築 - (8) ADCD IPL, Shutdown補足](https://qiita.com/tomotagwork/items/61b26ee8e25a605442ab)
[クラウド上でのメインフレーム開発環境構築 - (9) DASD管理補足](https://qiita.com/tomotagwork/items/a863c57be2902b8943d0)
[クラウド上でのメインフレーム開発環境構築 - (10)既存ZD&Tからイメージ作成](https://qiita.com/tomotagwork/items/d7ce2fc489a9e3fa08e2)


# non-SNA端末接続
ZD&Tインスタンスが起動すると、non-SNA端末と呼ばれる端末接続用のポートがLinux上でListenされます。これはデフォルトでは3270番のポート番号が使用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/04eab0b6-7c69-3b03-da6a-4b46c3f3fe6e.png)
イメージとしては上の通りです。Linuxが持っているアドレスにアクセス可能なPCから、PCOMでLinuxアドレス+ポート番号指定でTN3270接続が行えます。
これは、z/OS側でTCP/IPやTN3270サーバーが起動していないくても3270端末(マスターコンソールやTSO)が使用できますので、環境構築時の問題判別やインフラ管理用に利用可能です。
PCOM接続については以下の箇所をご参照ください。
[クラウド上でのメインフレーム開発環境構築 - (4) ZD&Tインスタンス作成概要(ADCD) - PCOMからの接続](https://qiita.com/tomotagwork/private/d14d35d3ab3c35c07545#pcom%E3%81%8B%E3%82%89%E3%81%AE%E6%8E%A5%E7%B6%9A)

以下のTCP/IPの接続が行えるようになったら、一般的にz/OSを利用するのと同じようにz/OS上のTN3270サーバーに対してTCP/IP(TN3270)でPCOM接続することができます。

# TCP/IP接続
これ以降は、z/OS上でTCP/IPのアドレススペースを上げて外部とz/OS上のサービス(TN3270サーバー、SSH、CICS、Db2など)をTCP/IPで通信する場合の構成についてです。
外部とz/OS上のサービスをTCP/IPで通信する場合、ネットワークの構成としては主に2パターン考えられます。(1)外部から見た時にz/OSに固有のIPアドレスを持たせない構成と、(2)z/OSにも個別の外部IPアドレスを持たせる構成です。
前者は、外から見た場合ホストOSと同じIPアドレスでアクセスすることになり、後者はLinuxとは別のz/OS固有のIPアドレスでアクセスするイメージとなります。

(1)のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/34d9a5e9-700a-e190-2383-bf47ad8732ed.png)

(2)のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a9ca5d7a-d197-6f0f-4582-9f4cf3af50f1.png)


今回、クラウド上にZD&Tインスタンスを構成することを前提としており、ホストOSのLinuxはZD&T専用で使う想定です。クラウド上だとIPアドレスをLinuxとは別にもう一つ用意するのもハードルがある場合もありますし、汎用性という意味でも(1)の方が扱いやすいです。そのため、ZD&T EEの構成としては基本的には(1)を前提としているようです(先に上げた手順例でも(1)の構成になっています)。それで問題無い場合が多いと思いますが、要件にそぐわない場合もあると思いますので、ここでは(2)についても取り上げます。

## (1)z/OSに外部IPアドレスを持たせない構成
この構成は先の手順でZD&Tインスタンス作成を行った場合のネットワーク構成です。IPアドレスはLinux用にアサインされているものをz/OSでも流用するイメージになります。Linuxで使用するポートとz/OSで使用するポートを使い分けして、z/OSで使用するポートに対するリクエストはiptablesでz/OS側にフォワードする、という発想です。
iptablesを使用した細かい動作イメージを図示すると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ce6b2729-d796-a0bd-ddfa-1acc3152e875.png)

上の図の例は、外部からLinuxのSSHに接続する場合とz/OS(ZD&T)上のSSHに接続する場合の接続方法の違いを表しています。いずれもIPアドレスは同一でポート番号で使用するサービスを使い分けていることに注目してください。
この例では、ホストOSとしてのLinuxはZD&Tインスタンスを稼働させるための専用の環境という位置づけなので、ZD&Tで使用するもの+SSH以外は全てz/OS側にフォワードするような設定になっています。
Linuxのサービスとz/OSのサービスでポート番号がバッティングするような場合は別のポートにマッピングするなど工夫が必要になります。
上の例ではSSHを取り上げていますが、セキュリティの観点からLinux上のSSHポートはデフォルトの22から2222に変更しており、z/OS上のSSHについてもデフォルトの22をそのまま使うのではなく2022で受け付けてz/OS上の22番ポートにフォワードするようにしています。

さて、ここで、別のLinuxからz/OS上のSSHに接続した場合のTCP/IPのコネクションの見え方について確認してみましょう。Linux, z/OSではコネクションはこんな感じで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/25a5ab67-f806-2175-a9bd-f4b741f89164.png)

逆に、z/OS側から外部のLinuxのサービス(FTP)を利用した場合のコネクションの見え方はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/42ecaecf-70d5-e0f8-18d6-85caf14a216f.png)

ここではTCP/IP接続を行うサービスの例としてSSHやFTPを取り上げましたが、CICSやDb2などのミドルウェアでも考え方は同様です。TN3270サーバーを使う場合(ADCDだと自動起動されます)、今回2023ポートをz/OS上の23ポートにフォワードするようにしているので、外部のPCOMからはLinuxのアドレスの2023番ポートに対してTN3270接続構成をすれば接続できます。

今回の設定では、Linux側で必要なポート以外は全てz/OS側にフォワードするような設定にしていますが、セキュリティ対策の観点では、外部連携用に使用するポートをきちんと整理して、不要なポートへのアクセスは弾くようにしておく方がよいでしょう。

参考: 今回の構成で設定されたiptablesの内容は以下の通りです。
<details><summary><font color="blue">iptables</font></summary><div>

稼働時の状況

```xxx:nat
[ibmsys1@zdt02 ~]$ sudo iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 3110 packets, 203K bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DNAT       tcp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            tcp dpts:0:21 to:172.26.1.2
    8   348 DNAT       tcp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            tcp dpts:23:2021 to:172.26.1.2
    0     0 DNAT       tcp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            tcp dpts:2024:2221 to:172.26.1.2
    0     0 DNAT       tcp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            tcp dpts:2223:3269 to:172.26.1.2
    8   328 DNAT       tcp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            tcp dpts:3271:9449 to:172.26.1.2
    9   364 DNAT       tcp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            tcp dpts:9452:65535 to:172.26.1.2
 2314  139K DNAT       tcp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            tcp dpt:2022 to:172.26.1.2:22
    1    52 DNAT       tcp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            tcp dpt:2023 to:172.26.1.2:23
    0     0 DNAT       udp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            udp dpt:111 to:172.26.1.2
    0     0 DNAT       udp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            udp dpt:514 to:172.26.1.2
    0     0 DNAT       udp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            udp dpt:1023 to:172.26.1.2
    0     0 DNAT       udp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            udp dpts:1044:1049 to:172.26.1.2
    0     0 DNAT       udp  --  !tap0  *       0.0.0.0/0            0.0.0.0/0            udp dpt:2049 to:172.26.1.2

Chain INPUT (policy ACCEPT 2319 packets, 140K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 2637 packets, 166K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 2207 packets, 132K bytes)
 pkts bytes target     prot opt in     out     source               destination
 2701  169K MASQUERADE  all  --  *      !tap0   0.0.0.0/0            0.0.0.0/0
```

```xxx:filter
[ibmsys1@zdt02 ~]$ sudo iptables -L -n -v -t filter
Chain INPUT (policy ACCEPT 33585 packets, 69M bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 12459 packets, 678K bytes)
 pkts bytes target     prot opt in     out     source               destination
 8188  754K ACCEPT     all  --  tap0   *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.26.1.2           tcp dpts:0:21
  364 22292 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.26.1.2           tcp dpts:23:2021
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.26.1.2           tcp dpts:2024:2221
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.26.1.2           tcp dpts:2223:3269
    8   328 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.26.1.2           tcp dpts:3271:9449
    9   364 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.26.1.2           tcp dpts:9452:65535
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.26.1.2           tcp dpt:2022
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.26.1.2           tcp dpt:2023
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            172.26.1.2           udp dpt:111
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            172.26.1.2           udp dpt:514
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            172.26.1.2           udp dpt:1023
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            172.26.1.2           udp dpts:1044:1049
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            172.26.1.2           udp dpt:2049

Chain OUTPUT (policy ACCEPT 3195 packets, 196K bytes)
 pkts bytes target     prot opt in     out     source               destination
28575 4101K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
```

再起動時の設定

```xxx:/etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
/sbin/iptables-restore < /etc/iptables.rules
```

```xxx:/etc/iptables.rules
# Generated by iptables-save v1.4.21 on Tue Oct 27 19:51:08 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i tap0 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p tcp -m tcp --dport 0:21 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p tcp -m tcp --dport 23:2021 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p tcp -m tcp --dport 2024:2221 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p tcp -m tcp --dport 2223:3269 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p tcp -m tcp --dport 3271:9449 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p tcp -m tcp --dport 9452:65535 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p tcp -m tcp --dport 2022 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p tcp -m tcp --dport 2023 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p udp -m udp --dport 111 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p udp -m udp --dport 514 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p udp -m udp --dport 1023 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p udp -m udp --dport 1044:1049 -j ACCEPT
-A FORWARD -d 172.26.1.2/32 -p udp -m udp --dport 2049 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Tue Oct 27 19:51:08 2020
# Generated by iptables-save v1.4.21 on Tue Oct 27 19:51:08 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING ! -i tap0 -p tcp -m tcp --dport 0:21 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p tcp -m tcp --dport 23:2021 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p tcp -m tcp --dport 2024:2221 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p tcp -m tcp --dport 2223:3269 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p tcp -m tcp --dport 3271:9449 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p tcp -m tcp --dport 9452:65535 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p tcp -m tcp --dport 2022 -j DNAT --to-destination 172.26.1.2:22
-A PREROUTING ! -i tap0 -p tcp -m tcp --dport 2023 -j DNAT --to-destination 172.26.1.2:23
-A PREROUTING ! -i tap0 -p udp -m udp --dport 111 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p udp -m udp --dport 514 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p udp -m udp --dport 1023 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p udp -m udp --dport 1044:1049 -j DNAT --to-destination 172.26.1.2
-A PREROUTING ! -i tap0 -p udp -m udp --dport 2049 -j DNAT --to-destination 172.26.1.2
-A POSTROUTING ! -o tap0 -j MASQUERADE
COMMIT
# Completed on Tue Oct 27 19:51:08 2020
```


</div></details>


## (2)z/OSに外部IPアドレスを持たせる構成
z/OSと外部とのTCP/IP通信でNAT変換をかませたくない場合など、z/OSに直接外部IPアドレスを持たせたいという場合があるかもしれません。その場合、Linux用のIPアドレスとは別にz/OS用のIPアドレスも用意できればそれをz/OSに割り当てることも可能です。
イメージとしては、ホストOSとの通信のためのtapとの紐づけ用以外に、もう一つ外部接続用のOSAを定義してをれをNICと紐づけます。
イメージとしては以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a4bcd394-f1e7-5b66-35c9-6aa71d804ef7.png)

外部からはLinuxのIPアドレスとは別にz/OS用のIPアドレスでアクセスできますので、物理的に同じOS上に乗っかっているかどうかなどは意識せず、独立したマシンのようにアクセスすることができます。IPアドレスが別なので、Linux上にiptablesによるルーティングは不要ですし、Linuxとz/OSでポートの住み分けを考慮する必要もありません。
ただし、ホストOSのLinuxからだけはz/OS用の外部IPアドレス(上の例だと10.132.233.243)は認識できないので注意が必要です。ホストOSのLinuxからz/OSにアクセスしたい場合は、tap経由で172.26.1.2に対してアクセスする必要があります。

この構成の場合、z/OS(ZD&T)が直接外部IPアドレスで接続できるので使い勝手はよいのですが、外部のIPアドレスでz/OS環境が晒されているという言い方もできます。上の例だとPrivateのネットワークのアドレスを割り当てているイメージですが、パブリックのIPアドレスをz/OSに割り当てる場合、インターネット上から直接アクセスできるような状態になります。z/OSに割り当てられたIPアドレスに対する制御はホストOSのLinux側では制御できませんので、z/OS上、もしくは、Linuxの外のネットワークレイヤーでセキュリティ対策を考える必要がありますのでご注意ください。
また、z/OS側にIPアドレスという環境固有の情報を持ってしまうことで汎用性が損なわれます。例えばどこか1つのZD&Tをメンテナンス用として用意してカスタマイズし、そのDASDイメージを基にクローンの環境を作っていくというようなことを考えると、z/OS側に固有のIPアドレスを持たせているとその部分は個別に変更する必要が出てきます((1)の方式であれば、Linux側のIPアドレスのみを変更するだけでよくz/OS側のカスタマイズは不要)。
このようなメリット/デメリットを考慮してどちらの構成を取るかを選択してください。

### 構成方法

ADCDを使用する前提で(2)の構成を取る場合の構成変更例を示します。
ここではADCDのLOADPARM:AUで起動した場合に使用される定義をカスタマイズする前提で記載します。

#### TCP/IPプロファイル

z/OSのTCP/IPプロファイルで外部IPアドレスの設定を行います。TCP/IPのプロファイルとしてはADCD.Z24A.TCPPARMS(PROF2)が使用されますので、そちらを変更します。
このプロファイルには元々2つのIPアドレスが定義されているので、それがそのまま使えます。

```xxx:ADCD.Z24A.TCPPARMS(PROF2)
...

SACONFIG DISABLED                                                   
;This device defines the tunnel                                     
DEVICE PORTA  MPCIPA                                                
LINK ETH1  IPAQENET PORTA                                           
HOME 172.26.1.2 ETH1                                                
; This second device is optional                                    
DEVICE PORTB    MPCIPA                                              
LINK ETH2 IPAQENET  PORTB                                           
;HOME 192.168.0.61   ETH2                                           
HOME 10.132.233.243  ETH2                                           
BEGINRoutes                                                         
;     Destination   SubnetMask    FirstHop       LinkName  Size     
;ROUTE 192.168.0.0 255.255.255.0       =        ETH2 MTU 1492       
ROUTE 10.132.233.192 255.255.255.192   =        ETH2 MTU 1492       
;ROUTE 10.0.0.0    255.0.0.0           =        ETH1 MTU 1492       
ROUTE DEFAULT                     172.26.1.1     ETH1 MTU 1492      
ENDRoutes                                                           
ITRACE OFF                                                          
IPCONFIG NODATAGRAMFWD                                              
UDPCONFIG RESTRICTLOWPORTS                                          
TCPCONFIG RESTRICTLOWPORTS                                          
TCPCONFIG TTLS                                                      
START PORTA                                                         
START PORTB                                                         
```

192.168.0.61が元々定義されていた外部IPアドレスですが、これは環境に合わせてホストOSのIPアドレスと同じセグメントのIPアドレスを割り当てます。
上の例だと、以下の行を書き換えています(外部IPアドレスとしてここでは10.132.233.243を指定)。
`HOME 10.132.233.243  ETH2`
`ROUTE 10.132.233.192 255.255.255.192   =        ETH2 MTU 1492      `

#### VTAM TRL Major Node
上で定義した外部IPアドレスは"PORTB"というポートにマッピングされることになりますが、VTAMのTRL Major NodeでこのPORTBに関する定義を確認します。TRL Majore Nodeの定義としてはADCD.Z24A.VTAMLST(OSATRL2)が使われています。

```xxx:ADCD.Z24A.VTAMLST(OSATRL2)
OSATRL1 VBUILD TYPE=TRL                                                 
OSATRL1E TRLE LNCTL=MPC,READ=(0400),WRITE=(0401),DATAPATH=(0402),      X
               PORTNAME=PORTA,                                         X
               MPCLEVEL=QDIO                                            
OSATRL2E TRLE LNCTL=MPC,READ=(0404),WRITE=(0405),DATAPATH=(0406),      X
               PORTNAME=PORTB,                                         X
               MPCLEVEL=QDIO                                            
```

この定義中にPORTBについてのOSAの定義が含まれていますので、ここは特に変更の必要はありません。READ, WRITE, DATAPATHに指定されているデバイスのアドレスを確認します(0404～0406)。

ちなみに、READとWRITEは連続するアドレス、かつ、READは偶数のアドレスを指定する必要がありますのでご注意ください。

#### IODF
IODFの定義を確認して0404～0406がOSAとして定義されているか確認します。

```
                              I/O Device List         Row 1 of 86 More:       >
 Command ===> ___________________________________________ Scroll ===> CSR      
                                                                               
 Select one or more devices, then press Enter. To add, use F11.                
                                                                               
   ----------Device------ --#--- --------Control Unit Numbers + --------       
 / Number   Type +        CSS OS 1--- 2--- 3--- 4--- 5--- 6--- 7--- 8---       
 _ 000C     2540                 ____ ____ ____ ____ ____ ____ ____ ____       
 _ 000C     2540R-1           1  ____ ____ ____ ____ ____ ____ ____ ____       
 _ 000E,2   1403-N1           1  ____ ____ ____ ____ ____ ____ ____ ____       
 _ 0120     3380              1  0120 ____ ____ ____ ____ ____ ____ ____       
 _ 0121     3380              1  0121 ____ ____ ____ ____ ____ ____ ____       
 _ 0122     3380              1  0122 ____ ____ ____ ____ ____ ____ ____       
 _ 0123     3380              1  0123 ____ ____ ____ ____ ____ ____ ____       
 _ 0124     3380              1  0124 ____ ____ ____ ____ ____ ____ ____       
 _ 0125     3380              1  0125 ____ ____ ____ ____ ____ ____ ____       
 _ 0126     3380              1  0126 ____ ____ ____ ____ ____ ____ ____       
 _ 0127     3380              1  0127 ____ ____ ____ ____ ____ ____ ____       
 _ 0128,56  3380              1  ____ ____ ____ ____ ____ ____ ____ ____       
 _ 01C0,64  3390                 ____ ____ ____ ____ ____ ____ ____ ____       
 _ 0240,32  3380                 ____ ____ ____ ____ ____ ____ ____ ____       
 _ 0260,32  3390                 ____ ____ ____ ____ ____ ____ ____ ____       
 _ 0300,25  3390              1  0300 ____ ____ ____ ____ ____ ____ ____       
 _ 0400,16  OSA               1  ____ ____ ____ ____ ____ ____ ____ ____       
 _ 0550,16  3420-8            1  ____ ____ ____ ____ ____ ____ ____ ____       

...
```

これもDevice TypeがOSAになっているので特に変更の必要はありません。

#### DeviceMapファイル

Linux上にあるDeviceMapファイルを編集してOSA用のアドレスとNICの紐づけを行う必要があります。その前に、NICの情報をfind_ioコマンドで確認します。

```
[ibmsys1@zdt02 ~]$ find_io

 FIND_IO for "ibmsys1@zdt02.ibmj-cloud-freeusage-p052.cloud"

         Interface         Current          MAC                IPv4              IPv6
 Path    Name              State            Address            Address           Address
------   ----------------  ---------------- -----------------  ----------------  --------------
  F0     eth0              UP, RUNNING      06:40:83:f5:e3:54  10.132.233.241    fe80::440:83ff:fef5:e354%eth0
.
  A0     tap0              UP, RUNNING      0a:60:a1:ca:32:03  172.26.1.1        fe80::860:a1ff:feca:3203%tap0
  A1     tap1              DOWN             02:a1:a1:a1:a1:a1  *                 *
  A2     tap2              DOWN             02:a2:a2:a2:a2:a2  *                 *
  A3     tap3              DOWN             02:a3:a3:a3:a3:a3  *                 *
  A4     tap4              DOWN             02:a4:a4:a4:a4:a4  *                 *
  A5     tap5              DOWN             02:a5:a5:a5:a5:a5  *                 *
  A6     tap6              DOWN             02:a6:a6:a6:a6:a6  *                 *
  A7     tap7              DOWN             02:a7:a7:a7:a7:a7  *                 *


         Interface                         Current Settings
 Path    Name              RxChkSum      TSO     GSO     GRO     LRO    RX VLAN       MTU**
------   ----------------  ---------------- -----------------  ----------------  --------------
  F0     eth0                On*         On*     On*     On*     Off      Off         1500
.
  A0     tap0                Off         Off     On*     On*     Off      Off         1500

 *  Enabling these functions may lead to poor zPdt Performance,
    please refer to your zPdt documentation for details.

 ** To Enable Jumbo Frame Support, this MTU value and the MTU value for the
    Host Operating System must be set to > 1500.

 End of FIND_IO
```

今回、z/OSへのアクセスはPrivateネットワークに繋がっているNIC、つまり、上の例でいうとeth0を介して行わせようとしています。このeth0に相当するPath(CHPID)の値を確認します。この例では"F0"となります。つまりZD&Tとしては"F0"というCHPID(Channel Path ID)でeth0を識別しているということになります。

DeviceMapファイルに以下の定義を追加します。

```xxx:/mnt/ibmsys1/zdt/volumes/aprof1
...

[manager]
name    awsosa  0019    --path=F0       --pathtype=OSD
device  404     osa     osa    --unitadd=0
device  405     osa     osa    --unitadd=1
device  406     osa     osa    --unitadd=2

...
```

awsosaの右隣りのID(上の例だと0019)は他のmanagerの定義とバッティングしない値(HEX)を指定してください。
--path=には、find_ioで確認した、使用したいNICに紐づくCHPIDを指定します(ここでは"F0")。
deviceのアドレスには、TRL Major Nodeで指定されていたREAD, WRITE, DATAPATHのアドレスを指定します。
--unitaddはシーケンシャルに番号をふればOKです。

これで一通り定義は終了なので、ZD&Tインスタンスを再起動すれば外部から指定したIPアドレスで直接z/OSとTCP/IPの通信ができるようになります。


## TCP/IP接続構成まとめ
関連する定義を整理すると以下のイメージになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/869d0158-bc73-cdb9-6b57-c777b4b94a6d.png)

# おわりに
今回はIBM CloudのIaaS(Virtual Server for Classic)環境で試しています。使用する環境によってはもしかするとCloud上のネットワークの構成/制約が影響するかもしれないので、その辺りは別途確認が必要かと思います。