z/OS 上で取得された IP パケット・トレースを Wireshark で見る

# はじめに

最近では、z/OS 上のミドルウェアやアプリケーションも TCP/IP 接続をすることが標準になり、セキュリティーの観点から TLS(SSL) の設定が必要となっています。一般に TLS 接続は、サーバー側とクライアント側に設定が必要で、設定不備によって TLS 接続ができないことがよくあります。この場合、TLS 接続が失敗したときの IP パケット・トレースを取得し、それを分析することで、原因が判明することが多いと思います。

この記事では、z/OS 上で取得された IP パケット・トレースを Wireshark で読み込むことが可能な Sniffer 形式に変換し、PC 上の Wireshark で読み込むまでの流れを説明します。

# IP パケット・トレースの取得

z/OS 上での IP パケットの取得方法はこちらの記事にまとまっています。
https://qiita.com/tomotagwork/items/418cf7bf120720aa54bf

幸いにも、私が利用している環境では、NetView が稼働していますので、NetView CLIST で手順を簡易化しています。
そのとき利用している、サンプルの NetView CLIST も載せておきます。
なお、当環境の TCP/IP スタック名は`TCPIP1` になっています。
```
/* REXX */                                                        
/* IP PACKET TRACE */                                             
                                                                  
TRACE E                                                           
                                                                  
TCPIPSTACK = 'TCPIP1'                                             
                                                                  
SAY '*** START IP PACKET TRACE ***'                               
                                                                  
'PIPE MVS V TCPIP,'TCPIPSTACK',PKT,ON | WAIT 10 | CONS'           
'PIPE MVS TRACE CT,WTRSTART=GSKWTR | WAIT 10 | CONS'              
'PIPE MVS TRACE CT,ON,COMP=SYSTCPDA,SUB=('TCPIPSTACK') | WAIT 3', 
'| EDIT "REPLY" 1 LASTLINE WORD 1 NW',                            
'",WTR=GSKWTR,END" NEXT',                                         
'| MVS | WAIT 3 | CONS'                                           

/***** ここでテストしたいコマンドを実行 *****/                                                                       
                                                                  
'PIPE MVS V TCPIP,'TCPIPSTACK',PKT,OFF | WAIT 10 | CONS'          
'PIPE MVS TRACE CT,ON,COMP=SYSTCPDA,SUB=('TCPIPSTACK') | WAIT 3',
'| EDIT "REPLY" 1 LASTLINE WORD 1 NW',                           
'",WTR=DISCONNECT,END" NEXT',                                    
'| MVS | WAIT 3 | CONS'                                          
'PIPE MVS TRACE CT,WTRSTOP=GSKWTR | WAIT 10 | CONS'              
                                                                 
SAY '*** END   IP PACKET TRACE ***'                              
                                                                 
EXIT 0                                                           
```

# Sniffer 形式への変換

メインとなる Sniffer 形式への変換ですが、 IPCS が正式にサポートしています。
https://www.ibm.com/docs/en/zos/2.5.0?topic=ipcs-options-keywords

以下のような IPCS を実行する JCL を実行することで、z/OS の IP パケット・トレースを Sniffer 形式に変換することができます。今回のケースでは、 IP パケット・トレースが書き込まれたデータ・セット名は`KATAYAM.SSLTRACE.D230124.T030550` になります。

Sniffer 形式の IP パケット・トレースが書かれるデータ・セットのレコード長は 8,000 あれば十分ですので、可変長のレコード形式 (`RECFM=VB`) で、レコード長を 8,000 (`LRECL=8000`) で定義しています。

```
//WSHARK1  PROC DSNAME=                                      
// EXPORT SYMLIST=(*)                                        
// SET DSNAME=&DSNAME.
//STEP01   EXEC PGM=IKJEFT01,DYNAMNBR=20,REGION=0M           
//SYSPROC  DD DSN=SYS1.SBLSCLI0,DISP=SHR                     
//SYSTSPRT DD SYSOUT=*                                       
//IPCSPRNT DD SYSOUT=*                                       
//IPCSTOC  DD SYSOUT=*                                       
//SYSUDUMP DD SYSOUT=*                                       
//SNIFFER  DD DISP=(,CATLG),DSN=&DSNAME..SNIFFER,            
//            VOL=SER=WRKVL1,UNIT=SYSDA,SPACE=(TRK,(15,15)), 
//            DCB=(LRECL=8000,RECFM=VB)                      
//SYSTSIN  DD *,SYMBOLS=JCLONLY                              
PROFILE MSGID                                                
%BLSCDDIR VOLUME (WRKVL1)                                    
IPCS NOPARM                                                          
SETDEF DA('&DSNAME.')                                                
CTRACE COMP(SYSTCPDA) OPTIONS((SNIFFER(7000,TCPDUMP) NOREASSEMBLY) + 
 GMT                                                                 
END                                                                  
/*                                                                   
// PEND                                                              
//*                                                                  
// EXEC WSHARK1,DSNAME=KATAYAM.SSLTRACE.D230124.T030550         
```

IP パケット・トレースは可読な形式ではありませんが、データ・セットの中身を見てみると、IPCS 実行前と実行後で以下のように変化していることが分かります。

変換前
```
 BROWSE    KATAYAM.SSLTRACE.D230124.T030550         Line 0000000000 Col 001 080 
 Command ===>                                                  Scroll ===> DATA 
********************************* Top of Data **********************************
.ﾗ...... {~ｭﾎ'sg..........ﾂﾔ. .......... ...EZBPTFM4CPAC    SYSTCPDA........TCPI
******************************** Bottom of Data ********************************
```

変換後
```
 BROWSE    KATAYAM.SSLTRACE.D230124.T030550.SNIFFER Line 0000000000 Col 001 080 
 Command ===>                                                  Scroll ===> DATA 
********************************* Top of Data **********************************
~¥CM....................                                                        
ｳ ....j ...3...3..!ﾝQ1..!ﾝQ...､..V`x.. . 7.ﾝQ1.ﾝQ..ﾃ.ﾃ.J#'.. ｽ.ﾝQ1.ﾃ.ﾜ...､¢､｢､+｣
ｳ ....ｸ....¢...¢..!ﾝ.-..!ﾝ.ｱ..､...Yf.. . ..ﾝ.ｱ.ﾝ.-jﾘ.~e.. ....‾...ｺ .....ﾑ......
ｳ ....ｹ....¢...¢..!ﾝ.-..!ﾝ.ｱ..､..... ...Zﾄ.ﾝ.-.ﾝ.ｱ.~jﾘｺmｮ e..,‾.ｻ..ｿ.....ﾕ.....ｾ
ｳ ....ｹ;...｡...｡..!ﾝ.-..!ﾝ.ｱ..､...Yg.. . ..ﾝ.ｱ.ﾝ.-jﾘ.~e..,ｺmｮ  . ..-.......e.ﾔ.ｾ
ｳ ....W ...ﾙ...ﾙ..!ﾝ.-..!ﾝ.ｱ..､..ﾏYh.. ..n.ﾝ.ｱ.ﾝ.-jﾘ.~e..,ｺmｮ  . .~ｰ.......e...ｾ
ｳ ....Xb...｡...｡..!ﾝ.-..!ﾝ.ｱ..､....､ ...I+.ﾝ.-.ﾝ.ｱ.~jﾘｺmｮ e..  ..T]･.......ｾ ｻ.e
ｳ ....X ...ｨ...ｨ..!ﾝ.-..!ﾝ.ｱ..､....･ ...I･.ﾝ.-.ﾝ.ｱ.~jﾘｺmｮ e..  ..T#........ｾ ｻ.e
ｳ ....YB...｡...｡..!ﾝ.-..!ﾝ.ｱ..､....ｦ ...I<.ﾝ.-.ﾝ.ｱ.~jﾘｺmｯ.e..  ..T]........ｾ ｻ.e
ｳ ....YH...｡...｡..!ﾝ.-..!ﾝ.ｱ..､...Yi.. . ..ﾝ.ｱ.ﾝ.-jﾘ.~e.. ｺmｯ. ." .........e...ｾ
ｳ .... {...｡...｡..!ﾝ.-..!ﾝ.ｱ..､...Yﾃ.. . ..ﾝ.ｱ.ﾝ.-jﾘ.~e.. ｺmｯ. ." .........e...ｾ
ｳ .... ﾍ...｡...｡..!ﾝ.-..!ﾝ.ｱ..､..... ...Zl.ﾝ.-.ﾝ.ｱ.~jﾘｺmｯ.e..S ..T]........ｾ ｽ.e
******************************** Bottom of Data ********************************
```

# Wireshark で見る

Sniffer 形式のデータ・セットを FTP のバイナリー・モードで PC にダウンロードし、Wireshark から Open でそのファイルを開くと、z/OS 上の IP パケット・トレースが Wireshark で見ることができます。
（IP アドレス部分はモザイクを施しています。）

![Wireshark_モザイク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259917/41cf5f0a-f298-0c9f-22c1-5b6124c16075.png)

Wireshark であれば、IP パケットの流れや、パケットの種類、その中身について簡単に確認できますし、大量の IP パケットが含まれる場合にはフィルターを簡単にかけることができます。
（モザイクだらけになりそうですので、画像はありません。。）

# おわりに

z/OS 上の IP パケット・トレースを Wireshark で見る方法を説明しました。
z/OS 上の IP パケット・トレースは IPCS でレポート形式に変換することができますが、レポートが縦長になってしまいますし、大量の IP パケットが含まれる場合、必要な情報を取得することは困難と思いますので、Wireshark などの Sniffer 形式をサポートするネットワーク分析ツールを使用することで、効率的に IP パケットの分析ができます。