ブリッジ使いますか? SSHトンネル使いますか?

こんにちは、Qです。

今回はSSHトンネル・ネタを1つ紹介します。
さくらのクラウド以外でも利用できますのでご参照ください。

目次

SSHトンネルも使えるよ

さくらのクラウドは東京と石狩にリージョンがあるわけですが
東京と石狩のリージョン間で
「コンテンツファイルを同期したい」
「データベースレプリケーション構成を組みたい」
というリクエストをいただくことがあります。

さくらのクラウドを利用したことがある人はフツーなら「ブリッジ + スイッチ」ですよね。

大人の事情で「ブリッジ + スイッチ」は チョット・・・
という場合はSSHトンネルが利用できます。

ちなみに6/29現在の料金はこうなっています。
 ブリッジ接続月額 2,750円
 スイッチ月額   2,200円 x2
SSHトンネルを利用すれば 1年間 約85,000円 が浮きます。

SSHトンネルを利用してMySQL(MariaDB)のレプリケーションを構成してみます。

マスター:東京サーバ IPアドレス:1.2.3.4
レプリカ:石狩サーバ IPアドレス:5.6.7.8
SSHトンネル/レプリケーションポート:3307

SSHトンネルユーザー作成

SSHトンネルユーザーの作成から始めます。パスフレーズは 無し です。

【東京サーバ】
[tokyo ~]# useradd -m -s /sbin/nologin sshtunnel
[tokyo ~]# sudo -u sshtunnel ssh-keygen -t ed25519 -N “” -f /home/sshtunnel/.ssh/id_ed25519
[tokyo ~]# mv /home/sshtunnel/.ssh/id_ed25519.pub /home/sshtunnel/.ssh/authorized_keys
[tokyo ~]# chmod 600 /home/sshtunnel/.ssh/authorized_keys
[tokyo ~]# vi /etc/ssh/sshd_config
 ————————————————————
 AllowUsers sshtunnel user1 user2 ~ ~ ~
 ————————————————————
 SSH接続ユーザーを登録します
 
[tokyo ~]# sshd -t
[tokyo ~]#
[tokyo ~]# systemctl reload sshd
[tokyo ~]#
[tokyo ~]# cat /home/sshtunnel/.ssh/id_ed25519.pub
 ————————————————————
 ssh-ed25519 ABCD ・・・・・ sshtunnel@tokyo-web01
 ————————————————————

【石狩サーバ】
[ishikari ~]# useradd -m -s /sbin/nologin sshtunnel
[ishikari ~]# sudo -u sshtunnel ssh-keygen -t ed25519 -N “” -f /home/sshtunnel/.ssh/id_ed25519
[ishikari ~]# mv /home/sshtunnel/.ssh/id_ed25519.pub /home/sshtunnel/.ssh/authorized_keys
[ishikari ~]# chmod 600 /home/sshtunnel/.ssh/authorized_keys
[ishikari ~]# vi /etc/ssh/sshd_config
 ————————————————————
 AllowUsers sshtunnel user1 user2 ~ ~ ~
 ————————————————————
 SSH接続ユーザーを登録します
 
[ishikari ~]# sshd -t
[ishikari ~]#
[ishikari ~]# systemctl reload sshd
[ishikari ~]#
[ishikari ~]# cat /home/sshtunnel/.ssh/id_ed25519.pub
 ————————————————————
 ssh-ed25519 WXYZ ・・・・・ sshtunnel@ishikari-web01
 ————————————————————

東京サーバと石狩サーバの公開鍵を交換します。

【東京サーバ】
[tokyo ~]# vi /home/sshtunnel/.ssh/authorized_keys
 ————————————————————
 no-pty,no-X11-forwarding,no-agent-forwarding,permitopen=”127.0.0.1:3306″
 ssh-ed25519 WXYZ ・・・・・ sshtunnel@ishikari  ※ 1行です
 ————————————————————

【石狩サーバ】
[ishikari ~]# vi /home/sshtunnel/.ssh/authorized_keys
 ————————————————————
 no-pty,no-X11-forwarding,no-agent-forwarding,permitopen=”127.0.0.1:3306″
  ssh-ed25519 ABCD ・・・・・ sshtunnel@tokyo  ※ 1行です
 ————————————————————

SSHトンネル接続確認

sshtunnelユーザーで接続確認です。

東京サーバのポート3307を石狩サーバのポート3306に転送しています

【東京サーバ】
[tokyo ~]# sudo -u sshtunnel ssh -i /home/sshtunnel/.ssh/id_ed25519
-fN -L 3307:127.0.0.1:3306 sshtunnel@5.6.7.8  ※ 1行です
 ・・・・・
 Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
 ・・・・・
 
[tokyo-web01 ~]# netstat -plunt | grep :3307
tcp   0  0  127.0.0.1:3307  0.0.0.0:*  LISTEN   539741/ssh
tcp6   0  0  ::1:3307     :::*     LISTEN   539741/ssh
 
[tokyo ~]# kill 539741
[tokyo ~]#
[tokyo ~]# netstat -plunt | grep :3307
[tokyo ~]#

石狩サーバのポート3307を東京サーバのポート3306に転送しています

【石狩サーバ】
[ishikari ~]# sudo -u sshtunnel ssh -i /home/sshtunnel/.ssh/id_ed25519
-fN -L 3307:127.0.0.1:3306 sshtunnel@1.2.3.4  ※ 1行です
 ・・・・・
 Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
 ・・・・・
 
[ishikari ~]# netstat -plunt | grep :3307
tcp   0  0  127.0.0.1:3307   0.0.0.0:*  LISTEN  1424028/ssh
tcp6   0  0  ::1:3307      :::*    LISTEN  1424028/ssh
 
[ishikari ~]# kill 1424028
[ishikari ~]#
[ishikari ~]# netstat -plunt | grep :3307
[ishikari ~]#

SSHトンネル接続してMySQLポートを転送できることが確認できました。

autosshインストール

次、SSHトンネルを維持するために autosshパッケージをインストールして
systemdサービスに登録します。

【東京サーバ】
[tokyo ~]# dnf install autossh
 
[tokyo ~]# vi /etc/systemd/system/mysql-tunnel.service
[Unit]
Description=MySQL SSH Tunnel via autossh
After=network-online.target
Wants=network-online.target
 
[Service]
Type=simple
User=sshtunnel
Group=sshtunnel
Environment=”AUTOSSH_GATETIME=0″
Environment=”AUTOSSH_POLL=60″
ExecStart=/usr/bin/autossh -M 0 -o “ServerAliveInterval 30” -o “ServerAliveCountMax 3”
-N -L 3307:127.0.0.1:3306 sshtunnel@5.6.7.8  ※ 1行です
Restart=always
RestartSec=10
 
[Install]
WantedBy=multi-user.target
 
 
[tokyo ~]# systemctl daemon-reload
[tokyo ~]#
[tokyo ~]# systemctl start mysql-tunnel
[tokyo ~]#
[tokyo ~]# netstat -plunt | grep :3307
tcp   0   0  127.0.0.1:3307  0.0.0.0:*  LISTEN  1424313/ssh
tcp6   0   0  ::1:3307      :::*     LISTEN  1424313/ssh
 
[tokyo ~]# systemctl stop mysql-tunnel
[tokyo ~]#
[tokyo ~]# netstat -plunt | grep :3307
[tokyo ~]#

石狩サーバも同様にautosshパッケージを導入しますが
systemdサービスに登録する ExecStartに指定するIPアドレスには気を付けて下さい。

【石狩サーバ】
[ishikari ~]# vi /etc/systemd/system/mysql-tunnel.service
 ————————————————————
 ExecStart=/usr/bin/autossh -M 0 -o “ServerAliveInterval 30” -o “ServerAliveCountMax 3”
  -N -L 3307:127.0.0.1:3306 sshtunnel@1.2.3.4  ※ 1行です
 ————————————————————

レプリケーション

あともう一息です。次、レプリケーションです。

レプリカの石狩サーバからSSHトンネルを作成します。

【石狩サーバ】
[ishikari ~]# systemctl start mysql-tunnel
[ishikari ~]#
[ishikari ~]# netstat -plunt | grep :3307
tcp    0  0  127.0.0.1:3307  0.0.0.0:*  LISTEN  541135/ssh
tcp6    0  0  ::1:3307     :::*     LISTEN  541135/ssh

マスターの東京サーバでレプリケーションユーザーを作成します。

【東京サーバ】
[tokyo ~]# mysql
mysql> create user ‘repl’@’127.0.0.1’ identified with mysql_native_password by ‘〇〇〇〇〇’;
mysql> grant replication slave on . to ‘repl’@’127.0.0.1’;
mysql> flush privileges;

石狩サーバでレプリケーション開始
SOURCE_HOST、SOURCE_PORT の指定がミソです。

【石狩サーバ】
[ishikari ~]# mysql
mysql> CHANGE REPLICATION SOURCE TO
-> SOURCE_HOST = ‘127.0.0.1’,
-> SOURCE_PORT = 3307,
-> SOURCE_USER = ‘repl’,
-> SOURCE_PASSWORD = ‘〇〇〇〇〇’,
-> SOURCE_AUTO_POSITION = 1;
 
mysql> START REPLICA;
 
mysql> SHOW REPLICA STATUS \G
*************************** 1. row ***************************
       Replica_IO_State: Waiting for source to send event
         Source_Host: 127.0.0.1
         Source_User: repl
         Source_Port: 3307
       ・・・・・・・・・・・・・・・・
      Replica_IO_Running: Yes
     Replica_SQL_Running: Yes
       ・・・・・・・・・・・・・・・・
       Source_Server_Id: 1
       ・・・・・・・・・・・・・・・・
          SQL_Delay: 0
     SQL_Remaining_Delay: NULL
  Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates

こんな感じになっていたらOKです。

同期したい、レプリケーション組みたい、通信は暗号化したい、でもコストは抑えたい、SSHトンネル如何ですか?

ではまた。

お問い合わせ

この記事をシェアする
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ネットアシスト案件チーム
構築・設計担当

目次