こんにちは、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トンネル如何ですか?
ではまた。


