BeeX Tech blog

BeeXではクラウドネイティブアプリ開発、企業の基幹クラウド基盤構築、システム移行、運用保守を行っています。

SAProuterを構築し、SAP GUIから接続確認してみた

こんにちは、BeeX山本です。
業務でSAProuterを触る機会があったので、復習を兼ねて自社環境で構築してみました。 その過程を記事にまとめます。

はじめに

「SAProuterって名前は聞いたことがあるけど、実際どう構築するの?」
そんな疑問を持つ方向けに、Linux環境へのSAProuter構築手順をまとめました。

SAProuterはSAP通信を中継するスタンドアロンプログラムであり、SAPサポート接続やネットワークセグメント間の通信制御に利用されるコンポーネントです。
接続先や利用ポートを明確に制御できるため、SAPシステムへの接続経路を整理したい場合に非常に便利です。

本記事では、社内環境においてSAProuterを構築し、SAProuter Stringを使ってSAPGUIからSAPシステムへ接続確認するところまでを扱います。
一般的にSAProuterというとSAP Support接続やSAP Support Backbone連携をイメージしやすいと思いますが、本記事ではその用途やSNCの構成については扱いません。

SAProuterを初めて構築する方や、構築手順を整理したい方の参考になれば幸いです。


前提条件


構成/環境情報

今回の検証構成は以下の通りです。

[ SAP GUI ]
    |
    | TCP 3299
    v
[ SAProuter ]
    |
    | TCP 3200 / 3601
    v
[ S/4HANA (PAS00 + ASCS01) ]

また、今回の検証では参考にしたGitHub手順に合わせて、SAProuterの配置先を/usr/sap/<SID>/saprouterとしました。 そのため、本記事中でも同様の考え方で記載しています。

一方で、/usr/sap/<SID>配下は一般的にSAPシステム本体の配置先として認識されやすいため、SAProuter専用用途であれば/opt/saprouter/usr/sap/saprouterのようなSID非依存のディレクトリの方が推奨のようです。
実環境で採用する際は、自社のディレクトリ設計方針に合わせて選定するのがよいと思います。


手順

構築用パラメータ設定

以降の手順は以下の環境変数を設定したセッションで実施します。
※ 本記事では、検証環境のSIDとしてSR1を使用しています。コマンド例や設定ファイル中にSR1が登場する箇所は、適宜ご自身の環境に読み替えてください。

sudo su - root
bash
_SAPSID=SR1; export _SAPSID
_SAPDIR=/usr/sap/${_SAPSID}/saprouter; export _SAPDIR

ユーザ作成

ユーザsr1admとグループsapsysを作成します。

groupadd -g 79 sapsys
useradd -u 1001 -g sapsys -c "SAProuter Administrator" sr1adm -m -s /bin/bash

ディレクトリ作成

実行コマンド

mkdir -p /usr/sap/SR1/saprouter/{exe,log}

結果確認

[root@sltyosr1 ~]# ls -la ${_SAPDIR}
total 0
drwxr-xr-x 4 root root 28 Mar 24 13:54 .
drwxr-xr-x 3 root root 23 Mar 24 13:54 ..
drwxr-xr-x 2 root root  6 Mar 24 13:54 exe
drwxr-xr-x 2 root root  6 Mar 24 13:54 log
[root@sltyosr1 ~]#

ソフトウェア配置

/usr/sap/${_SAPSID}/上にソフトウェアをアップロードします。 今回使用したのはこちら。

・SAPCAR_1400-70007716.EXE
・saprouter_635-80007328.sar
・SAPCRYPTOLIBP_8602-20011697.SAR

SAR解凍

まず、SAPCAR準備します。
実行コマンド

cp SAPCAR ${_SAPDIR}/exe/
chown root:sapsys ${_SAPDIR}/exe/SAPCAR
chmod 755 ${_SAPDIR}/exe/SAPCAR

結果確認

[root@sltyosr1 SR1]# ls -l ${_SAPDIR}/exe/
total 5580
-rwxr-xr-x 1 root sapsys 5712584 Mar 24 14:45 SAPCAR
[root@sltyosr1 SR1]#

SARを展開します。まずはsaprouter。
実行コマンド

${_SAPDIR}/exe/SAPCAR -xvf /usr/sap/${_SAPSID}/saprouter_635-80007328.sar -R ${_SAPDIR}/exe/

解凍完了

SAPCAR: processing archive /usr/sap/SR1/saprouter_635-80007328.sar (version 2.01)
x niping
x patches.mf
x saprouter
SAPCAR: 3 file(s) extracted

SAPCRYPTOLIBPも同様に解凍します。
実行コマンド

${_SAPDIR}/exe/SAPCAR -xvf /usr/sap/${_SAPSID}/SAPCRYPTOLIBP_8602-20011697.SAR -R ${_SAPDIR}/exe/

解凍完了

SAPCAR: processing archive /usr/sap/SR1/SAPCRYPTOLIBP_8602-20011697.SAR (version 2.01)
x libsapcrypto.so
x libslcryptokernel.so
x libslcryptokernel.so.sha256
x sapgenpse
x sapcrypto.mf
x sapcrypto.lst
SAPCAR: 6 file(s) extracted

ディレクトリ/usr/sap/${_SAPSID}/の所有者と権限変更をします。
実行コマンド

chown -R ${_SAPSID,,}adm:sapsys /usr/sap/${_SAPSID}/
chmod -R 755 /usr/sap/${_SAPSID}/

結果確認

[root@sltyosr1 SR1]# ls -l /usr/sap
total 0
drwxr-xr-x 3 sr1adm sapsys 128 Mar 24 14:41 SR1
[root@sltyosr1 SR1]#

saprouttab設定

SAProuterはsaprouttabと呼ばれるroute permission tableを参照して、通信を許可するか拒否するかを判断します。
このテーブルでは、SAProuterから見た接続元ホスト、接続先ホスト、接続先ポートなどを条件としてルールを定義します。
ルールは上から順に評価され、最初に一致した行が採用されるため、記載順も重要です。 初期設定として、まずは全通信拒否の状態でsaprouttabを作成し、権限等の調整をします。
※詳細な記載方法は、後ほど私の使用した例を参考に紹介します。

実行コマンド

echo "D * * *" > ${_SAPDIR}/saprouttab
chmod 600 ${_SAPDIR}/saprouttab
chown ${_SAPSID,,}adm:sapsys ${_SAPDIR}/saprouttab

結果確認

[root@sltyosr1 saprouter]# ls -l
total 4
drwxr-xr-x 2 sr1adm sapsys 213 Mar 24 14:46 exe
drwxr-xr-x 2 sr1adm sapsys   6 Mar 24 13:54 log
-rw------- 1 sr1adm sapsys   8 Mar 24 14:50 saprouttab
[root@sltyosr1 saprouter]#
[root@sltyosr1 saprouter]# cat saprouttab
D * * *
[root@sltyosr1 saprouter]#

環境変数設定(${_SAPSID,,}adm)

${_SAPSID,,}admユーザにスイッチして、.bashrcに下記を追加します。

export SAPSYSTEMNAME=SR1
export SAPBASE=/usr/sap/${SAPSYSTEMNAME}/saprouter
export LIBPATH=${SAPBASE}/exe
export SECUDIR=${SAPBASE}
export SNC_LIB=${SAPBASE}/exe/libsapcrypto.so
PATH=$PATH:${SAPBASE}/exe

編集後

[/home/${_SAPSID,,}adm/.bashrc]
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
    PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

#==================================================
export SAPSYSTEMNAME=SR1
export SAPBASE=/usr/sap/${SAPSYSTEMNAME}/saprouter
export LIBPATH=${SAPBASE}/exe
export SECUDIR=${SAPBASE}
export SNC_LIB=${SAPBASE}/exe/libsapcrypto.so
PATH=$PATH:${SAPBASE}/exe
#==================================================

systemdへ登録するserviceファイルを作成

${_SAPSID,,}admはログオフして、rootユーザで実行してください。

作成したファイル

[/etc/systemd/system/saprouter.service]
#==================================================
[Unit]
Description=SAProuter Service
After=network.target

[Service]
User=sr1adm
Group=sapsys
Type=simple
WorkingDirectory=/usr/sap/SR1/saprouter
Environment="SAPSYSTEMNAME=SR1"
Environment="SAPBASE=/usr/sap/SR1/saprouter"
Environment="LIBPATH=/usr/sap/SR1/saprouter/exe"
Environment="SECUDIR=/usr/sap/SR1/saprouter"
Environment="SNC_LIB=/usr/sap/SR1/saprouter/exe/libsapcrypto.so"

ExecStart=/usr/sap/SR1/saprouter/exe/saprouter -r -S 3299 -R /usr/sap/SR1/saprouter/saprouttab -D -E -W 60000 -G /usr/sap/SR1/saprouter/log/saprouter.log -J 1048576 -T /usr/sap/SR1/saprouter/log/dev_rout -Y 0 -C 800

ExecStop=/usr/sap/SR1/saprouter/exe/saprouter -s
ExecReload=/usr/sap/SR1/saprouter/exe/saprouter -n

Restart=on-failure

[Install]
WantedBy=multi-user.target
#==================================================

今回のservice定義では、SAProuterの待受ポート、saprouttabの参照先、ログ出力先などを明示したうえで起動しています。
ExecStartに指定しているオプションは多いですが、接続確認やトラブルシュート時に意味を把握しておくと切り分けしやすくなります。

オプション 意味
-r SAProuterを起動する
-S <service> SAProuterが待ち受けるサービス(ポート)を指定する
-R <routtab> 使用するsaprouttabのファイル名とパスを指定する
-D DNSの逆引き名前解決を無効化する
-E トレースファイルとログファイルを上書きではなく追記する
-W <waittime> ブロッキングするネットワークコールでエラーが発生した場合のタイムアウトを指定する
-G <logfile> SAProuterの通常ログファイル名とパスを指定する
-J <size> SAProuterログファイルのサイズ制限を指定する
-T <tracefile> SAProuterのトレースファイル名とパスを指定する
-Y <n> クライアントテーブルが満杯になった場合の自動再起動制御に関する設定
-C <clients> SAProuterが管理する最大クライアント数を指定する

特に、-S-R-G-Tは今回の構成で意味を把握しておきたいオプションです。
それぞれ待受ポート、saprouttabの参照先、通常ログ、トレースログの出力先を示しており、接続確認や障害調査の際に直接関わってきます。

あわせて、-E オプションも押さえておきたいポイントです。
これを指定しない場合、SAProuter は再起動のたびにログファイルを上書きするため、過去の情報を残しておきたい場合は注意が必要です。

自動起動を有効化

saprouterの自動起動を有効化します。
実行コマンド

systemctl daemon-reload
systemctl enable saprouter
systemctl status saprouter

有効化完了

[root@sltyosr1 saprouter]# systemctl enable saprouter.service
Created symlink /etc/systemd/system/multi-user.target.wants/saprouter.service → /etc/systemd/system/saprouter.service.
[root@sltyosr1 saprouter]#
[root@sltyosr1 saprouter]# systemctl status saprouter
● saprouter.service - SAProuter Service
   Loaded: loaded (/etc/systemd/system/saprouter.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
[root@sltyosr1 saprouter]#

/etc/services調整

/etc/servicesは、サービス名とポート番号の対応関係を定義するファイルです。 一応バックアップを取って編集します。

実行コマンド

cp -p /etc/services /etc/services_bk
vi /etc/services

追加したのは下記です。ファイルの末尾に追加してます。

#==================================================
# SAPGUI connection
sapdp00   3200/tcp
sapgw00   3300/tcp
sapmsS4A  3601/tcp
sapmsS4B  3601/tcp

#==================================================

今回は、以下のSAP関連サービス定義を追加してます。

  • sapdp00:Dispatcher(SAP GUI接続用ポート)
  • sapgw00:Gateway(RFC通信等で使用)
  • sapms<SID>:Message Server(ログオンバランシング等で使用)

本構成ではDispatcher直接続のみであれば必須ではありませんが、ログオングループを利用して接続する場合に、 サービス名解決のため定義が必要なため設定してます。

saprouttab設定

saprouttabを下記に更新します。

[${_SAPDIR}/saprouttab]
#==================================================
# Permit connection to S4A
P * 172.16.0.210 3200
P * 172.16.0.210 3300
P * 172.16.0.210 3601

# Permit connection to S4B
P * 172.16.0.177 3200
P * 172.16.0.177 3300
P * 172.16.0.177 3601

# deny all other connections
D * * *

#==================================================

今回の設定では、S4A/S4B宛に以下のポートを許可しています。

  • 3200: SAP GUIの直接接続で使用するDispatcherポート
  • 3300: Gateway関連通信で使用するポート
  • 3601: Message Server関連で使用するポート

PはPermit(許可)を意味し、
例えば以下の設定は、

P * 172.16.0.210 3200

「任意の接続元から172.16.0.210の3200/TCPへの通信を許可する」という意味です。 今回は接続確認を優先し、接続元ホストは * として記載しています。実運用では、踏み台端末や特定セグメントに限定して接続元を絞り込む方がより安全です。

また、最後に

D * * *

を記載することで、それ以外の通信をすべて拒否しています。
このように、必要な通信のみを明示的に許可し、最後に全拒否する形にしておくと、意図しない経路を通しにくくなります。

※⚠️⚠️saprouttabを変更した場合は、systemctl reload saprouterで設定を再読み込みする必要があります。⚠️⚠️

saprouter起動

まずはサービス状態を確認します。
実行コマンド

systemctl start saprouter
systemctl status saprouter

問題なく起動できました。起動後のsystemctl statusの結果はこんな感じでした。

[root@sltyosr1 saprouter]# systemctl status saprouter
● saprouter.service - SAProuter Service
   Loaded: loaded (/etc/systemd/system/saprouter.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2026-03-24 15:30:20 JST; 15s ago
  Process: 5627 ExecReload=/usr/sap/SR1/saprouter/exe/saprouter -n (code=exited, status=0/SUCCESS)
 Main PID: 5624 (saprouter)
    Tasks: 1 (limit: 48456)
   Memory: 2.3M
   CGroup: /system.slice/saprouter.service
           mq5624 /usr/sap/SR1/saprouter/exe/saprouter -r -S 3299 -R /usr/sap/SR1/saprouter/saprouttab -D -E -W 60000 -G /usr/sap/SR1/saprouter/log/saprouter.log -J 1048576 -T /usr/sap/SR1>

Mar 24 15:30:20 sltyosr1 systemd[1]: Started SAProuter Service.
Mar 24 15:30:26 sltyosr1 systemd[1]: Reloading SAProuter Service.
Mar 24 15:30:26 sltyosr1 saprouter[5627]: Tue Mar 24 15:30:26 2026
Mar 24 15:30:26 sltyosr1 saprouter[5627]: SAP Network Interface Router, Version 40.4
Mar 24 15:30:26 sltyosr1 saprouter[5627]: peer SAProuter with NI version 40 ...
Mar 24 15:30:26 sltyosr1 saprouter[5627]: send new-routtab-request to running SAProuter ...
Mar 24 15:30:26 sltyosr1 saprouter[5627]: request successfully completed.
Mar 24 15:30:26 sltyosr1 systemd[1]: Reloaded SAProuter Service.
[root@sltyosr1 saprouter]#

加えて、ログファイルにも起動時メッセージが出力されていることを確認します。

今回の検証では、saprouter.logに以下のような出力があり、READ ROUTTAB ... o.k.となっていることから、
saprouttabの読込が成功していることを確認できました。

[${_SAPDIR}/log/saprouter.log]
Tue Mar 31 14:21:40 2026 INIT LOGFILE
Tue Mar 31 14:21:40 2026 READ ROUTTAB /usr/sap/SR1/saprouter/saprouttab o.k.

また、dev_routには SAProuterの起動時引数が記録されており、どのオプションで起動したかを後から確認できます。

[${_SAPDIR}/log/dev_rout]
command line arg 0:     /usr/sap/SR1/saprouter/exe/saprouter
command line arg 1:     -r
command line arg 2:     -S
command line arg 3:     3299
command line arg 4:     -R
command line arg 5:     /usr/sap/SR1/saprouter/saprouttab
command line arg 6:     -D
command line arg 7:     -E
command line arg 8:     -W
command line arg 9:     60000
command line arg 10:    -G
command line arg 11:    /usr/sap/SR1/saprouter/log/saprouter.log
command line arg 12:    -J
command line arg 13:    1048576
command line arg 14:    -T
command line arg 15:    /usr/sap/SR1/saprouter/log/dev_rout
command line arg 16:    -Y
command line arg 17:    0
command line arg 18:    -C
command line arg 19:    800
main: pid = 893, ppid = 1, port = 3299, parent port = 0 (0 = parent is not a saprouter)
reading routtab: '/usr/sap/SR1/saprouter/saprouttab'

さらに、停止→起動、またOS再起動後に起動しているかも確認するとGoodです。


確認方法

APサーバ直接

構築が完了したので動作確認をしていきます。まずは、APサーバに直接アクセスするパターンです。
エントリは以下のように登録しています。ポイントはSAPRouterStringの項目です。
ここでSAProuterのホストとサービスを指定します。ルートストリングは、/H/host/S/service/の形になっていて、hostとserviceはご自身の環境のものに適宜置き換えてください。

saprouter経由のGUIエントリ

登録したエントリで接続すると、無事ログオン画面が表示されました。

ログオン画面

接続後、以下のログが出力されました。

[${_SAPDIR}/log/saprouter.log]
Tue Mar 31 17:55:34 2026 CONNECT FROM C9/- host 172.16.0.120/49801
Tue Mar 31 17:55:34 2026 CONNECT TO   S9/17 host 172.16.0.210/3200 (172.16.0.210)
Tue Mar 31 17:55:34 2026 ESTABLISHED  S9/17

このログから、接続元172.16.0.120(GUIが入ってる踏み台)からの通信がSAProuterに到達し、172.16.0.210:3200へ中継されて接続が確立したことが分かります。

ログオングループ利用

次は、ログオングループを使用してアクセスするパターンを確認します。
connection typeでGroup/Server selectionを選択し、添付の通り入力します。 Group/Serverは、はじめ入力で来ませんがSystem ID,SAProuter,Message Serverの3項目を入力すると、ドロップダウン式でSPACEが選択できるようになると思います。

saprouter経由のGUIエントリ(ログオングループ使ver)

登録したエントリで接続すると、こちらもログオン画面が表示されました。(直前と同じ画像を添付することになるため、画面は割愛します。)

ログオングループ接続時には以下のログが出力されました。

[${_SAPDIR}/log/saprouter.log]
Tue Mar 31 17:57:31 2026 CONNECT FROM C10/- host 172.16.0.120/49803
Tue Mar 31 17:57:31 2026 CONNECT TO   S10/18 host 172.16.0.210/sapmsS4A (172.16.0.210)
Tue Mar 31 17:57:31 2026 ESTABLISHED  S10/18
Tue Mar 31 17:57:31 2026 DISCONNECT   C10/18 host 172.16.0.120/49803 (172.16.0.120)
Tue Mar 31 17:57:31 2026 CONNECT FROM C19/- host 172.16.0.120/49804
Tue Mar 31 17:57:31 2026 CONNECT TO   S19/11 host 172.16.0.210/sapmsS4A (172.16.0.210)
Tue Mar 31 17:57:31 2026 ESTABLISHED  S19/11
Tue Mar 31 17:57:31 2026 DISCONNECT   C19/11 host 172.16.0.120/49804 (172.16.0.120)
Tue Mar 31 17:57:31 2026 CONNECT FROM C12/- host 172.16.0.120/49805
Tue Mar 31 17:57:32 2026 CONNECT TO   S12/20 host 172.16.0.210/3200 (SLTYO101.beex-inc.local)
Tue Mar 31 17:57:32 2026 ESTABLISHED  S12/20
Tue Mar 31 17:57:37 2026 DISCONNECT   S12/20 host 172.16.0.210/3200 (SLTYO101.beex-inc.local)

こちらは、まずMessage Server(sapmsS4A)へ接続し、その後、最終的に172.16.0.210:3200のDispatcherへ接続していることが分かります。
つまり、ログオングループ接続では最初にMessage Serverへ問い合わせを行い、その結果に基づいてアプリケーションサーバへ振り分けられていることがログからも改めて確認できました。

まとめ

本記事ではSAProuterを構築し、SAP GUIからSAProuter経由でSAPシステムへ接続確認を行いました。

構築自体は難しくありませんが、saprouttabの設計が運用の安全性を大きく左右する点は特に押さえておきたいポイントです。
今回は検証優先で接続元をフルオープンにしていますが、本番環境では踏み台端末や特定セグメントに限定することを強くお勧めします。

また、トラブル発生時はまず以下の2ファイルを確認すると切り分けがしやすいです。困ったらまずここを見ましょう。

  • 通常ログ:${_SAPDIR}/log/saprouter.log
  • トレース:${_SAPDIR}/log/dev_rout

今後はSNCやSAPSupport接続など、より実運用に近いテーマについても理解を深めていけたらなと思っています。

参考