実践Linux
RockyLinux8        RockyLinux8 目次へ  TOP(HOME)へ


SSHトンネル             2021年9月


SSHトンネル(SSHポートフォアディング)

SSHの真価はトンネルにあります。これを使うと、様々なネットワークアプリケーションの通信を、SSHの暗号回線の中に入れて送受信することが可能となります。
SSHトンネルはSSHポートフォワーディングとも呼ばれており、SSHによって確立した通信経路を利用して、クライアントが直接アクセスできないサーバーのポートへ転送してくれる仕組みのことです。これによって、外部からインターネットでアクセスして、通常では直接接続できないイントラネット内へアクセスすることが可能になります。



クライアントの1111番ポート接続を、10055ポートで受け、DBサーバーの3306番ポートに転送(ポートフォワーディング)する。DBサーバー側(B)では、 SSHサーバー(A)からの3306アクセスを許可するようにしておく。この10055というポートはSSHで設定したもの。
(A)と(B)を同じサーバーマシンで構築していれば、自分自身に送るだけなのでより簡単。


WindowsのSSHクライアント(Putty)

●Windows SSHクライアントPuTTY-ranvisの導入
入手 PuTTYrv (PuTTY-ranvis) - Ranvis software(https://www.ranvis.com/puttyより)
puttygen.exe(秘密キー、公開キーの生成・変換ツール)、pageant.exe(認証エージェント)も同梱されている。

●鍵セットの作成(windowsクライアント側で作成する方法)
puttygen.exeを実行。
RSAが選択されていることを確認して、Generateボタンを押す。
途中でランダムシード作成のためマウスを動かすように促されるのでマウスを動かし続ける。
パスフレーズを入力する。(2カ所同じパスワードを入力)
「公開鍵を保存」を押して、公開キーを保存する。(分かりやすくkeyフォルダを作成して保存とよい。)
「秘密鍵を保存」を押して、秘密キーを保存する。
ここではputty_rsa.pub、secret.ppk名で保存したとする。

Windows10でのキーの使用について注意
秘密キーをユーザー/ディスクトップ/アプリケーションフォルダ/キーフォルダなどに入れた場合、作動しないので注意。(windows7では問題なかったのだが。)

●linuxサーバーへの公開キー登録
公開キーputty_rsa.pubをlinuxサーバーにコピー。
これをopenSSHが使用可能な形式に変換する。(ここではputty.pub名で変換するとする。)
# ssh-keygen -i -f putty_rsa.pub > putty.pub
変換した公開キーをSSH接続したいユーザーの~/.ssh/authorized_keysファイルに登録する。(当然このユーザーはbashなどのログインシェルが必要。nologin等ではssh接続できない。)

fooに登録する例。
# mkdir /home/foot/.ssh
# cat putty.pub >> /home/foot/.ssh/authorized_keys
# chmod 644 /home/foot/.ssh/authorized_keys
authorized_keysファイルには複数の公開キーを登録することができる。
.sshディレクトリの所有者をfooに。.ssh以下のファイルの所有者はrootでもよいようだ。

rootの場合も同様
# mkdir /root/.ssh
# cat putty.pub >> /root/.ssh/authorized_keys
# chmod 644 /root/.ssh/authorized_keys

●通常のSSH接続をやってみる(ここではrootの例)
puttyjp.exeを実行。
セッション  接続先のIPアドレス root@333.333.333.210 ポート10055 プロトコルSSH
接続→SSH→認証  プライベート鍵の場所を指定(ここではsecret.ppk)
ウィンドウ→変換  文字コードの設定 UTF-8を指定
セッションに戻り以上の設定を保存しておくと次回接続から便利。
「開く」で接続開始。
鍵のパスフレーズの入力。
サーバーのターミナルが開く。

●トンネルの設定(例として、MariaDBサーバーにトンネル接続)
上記「通常のSSH接続」に次の設定を加えてやる。
接続→SSH→トンネル
 受け側ポート  1111
 送り先     192.168.7.100:3306 (SSHサーバーから見たDBサーバーを指定。SSHサーバーと接続先ホストが同一の場合は、localhost:3306または127.0.0.1:3306と記述する。)
 「ローカル」がチェックされていることを確認。
 追加ボタン。
この設定もセッションに戻り保存しておくとよい。

「開く」でトンネル接続開始。
鍵のパスフレーズの入力。
サーバーのターミナルが開く。

複数のDBサーバーへ接続したい場合にはローカルのポートを変えて行う。(1111、1112 linuxで使われていないポートを選ぶ。Linuxでの使用ポート一覧は、 # lsof -i)
  L1111 192.168.7.100:3306
  L1112 192.168.7.200:3306


●ExcelなどWindowsアプリケーション
MariaDBサーバーから見ると、ユーザーは SSHサーバーからアクセスしているように見えるが、一方、アクセスするアプリケーション側は、自分のマシンをMariaDBサーバーとして設定する必要がある。つまり、アプリケーションにはアクセスするMariaDBサーバーとして自分自身localhost:1111を指定する=自分自身をMariaDBサーバーと見立ててポート1111に送るとSSHトンネルを通して本物のMariaDBサーバー(ポート3306)に届くことになる。
つまり、SERVER=localhost;PORT=1111を指定(自分自身を指定)。

1.MariaDBクライアントは自分自身にアクセスをする
2.SSHのトンネルを通り、SSHサーバへアクセス
3.SSHからMariaDBへアクセス
4.MariaDBがSSHサーバーへレスポンス
5.SSHのトンネルを通り、クライアントへ帰る
6.自分自身からレスポンスが返ってくる

●puttyトンネル設定例と接続
puttyトンネル(SSHサーバーにVNC、データーベース、Sambaが同居しているとする)
1234 127.0.0.1:5092  VNC
1235 127.0.0.1:5432  postgreSQL
1236 127.0.0.1:3306  MySQL
169.254.0.1:4451 127.0.0.1:445  Samba  次の項目「sambaの場合」参照
169.254.0.2:4452 192.168.7.100:445   ファイル共有  同じく「sambaの場合」参照

接続例
データベース
 SERVER=localhost PORT=1235  postgreSQL
 SERVER=localhost PORT=1236  MySQL
VNC localhost:1234
ファイル共有(ネットワーク)  次の項目「sambaの場合」参照
 \\169.254.0.1  SSHサーバーのsamba
 \\169.254.0.2  SSHサーバーからみた192.168.7.100(ファイル共有)


samba(あるいはファイル共有)の場合 --- Windows10クライアントでの操作 (それ以前のwinOSの場合はCentOS5/6.5参照)

Windowsクライアントは既に139番などのポートを使っているので、そのままでは転送できません。そこでループバックデバイス(Windows10にはMicrosoft KM-TEST Loopback Adapterというループバックデバイスが用意されています)を使い、そのポートとサーバ側のポートを繋ぐことで使えるようになります。

・ハードウェアの追加でMicrosoft KM-TEST Loopback Adapterを追加
・Microsoft Loopback Adapterに例えばIP: 169.254.0.1, Netmask: 255.255.255.0を設定
・PortForwarderやPuTTYなどで169.254.0.1の445番ポートを転送するように設定

●仮想ネットワークインターフェースLoopback Adapterのインストール(Windows10)
(1)デバイスマネージャを開きます。「ネットワークアダプタ」を選択。
(2)[操作][レガシーハードウェアの追加]を選択します。
(3)[次へ]
(4)[一覧から選択したハードウェアをインストールする]を選択し[次へ]
(5)[ネットワークアダプタ]を選択し[次へ]
(6)[Microsoft] - [Microsoft KM-TEST Loopback Adapter]を選択し[次へ]
以上でインストールが完了します。

削除は、
デバイスマネージャ → ネットワークアダプタ → 当該アダプターを右クリックでアンインストールを選択

●Loopback Adapterの設定
・ネットワーク/プロパティ→アダプタの設定変更
・デバイス名が「Microsoft KM-TEST Loopback Adapter 」であるアイコンを探します。
・「インターネットプロトコルバージョン4(TCP/IPv4)」のチェック以外はすべてはずします。 (結局、「インターネットプロトコルバージョン4(TCP/IPv4)」だけチェックされた状態となる。)
・TCP/IPv4のプロパティを押します。
・169.254.0.1/255.255.255.0 を設定。ゲートウェイ、DNS の項目を入力する必要はありません。
・「詳細設定」を開きます。
「IP設定」のタブで一番下の「自動メトリック」のチェックを外し、「インターフェイスメトリック」に9999と入力する。(インターフェイスメトリックとは、ネットワークインターフェースの優先順位を設定する値です。)
「WINS」のタブで「NetBIOS over TCP/IP を無効にする」を選択します。
・それぞれ OK で決定して閉じます。

また、「詳細設定」→「IP 設定」タブ→「IP アドレス」で,さらにIPアドレスを追加できるので,それらも転送元にすることにより,複数拠点を同時に使うこともできます。ここでは、このIPアドレスの追加で、169.254.0.2/255.255.255.0も設定しておきます。

●LanmanServerドライバ(Serverサービス)の設定
ファイルの共有等を行うサービス。administratorのパスワードが盗難された場合、リモートからコンピュータを操作されたりファイルを盗まれたりする危険性があるので通常は無効化する。
以下の設定は、「コントロールパネル>管理ツール>サービス>Server>スタートアップの種類」で設定できるが(なお「無効」となっていても「実行中」となっている??)、ここではコマンドで設定してみる。
コマンドプロンプトを管理者権限(PowerShell(管理者))で実行(左下のウインドウアイコン=スタートボタンを右クリック→PowerShell(管理者)を選択)し、下のコマンドを実行する。
> sc config lanmanserver start= delayed-auto (これをPowershell(管理者)で実行すると、sc がコマンドレットである set-contentとバッティングしエラーとなる。したがって、次のフルパスで実行する。)
> C:\Windows\System32\sc.exe config lanmanserver start= delayed-auto
start=のイコールのあとに半角スペースがあるのに注意。
start= 値(開始方法を指定する)
 auto:自動
 delayed-auto:自動(遅延) OSの起動に時間がかかるのを防ぐ
 demand:手動
 disabled:無効  =デフォルト値
注意 delayed-autoに設定しても、PCを再起動すると「無効」に戻っている。しかし、「無効」でも常に「実行中」となっているので、この設定は不要なのかもしれない。

デフォルト値「無効」に戻すには
> C:\Windows\System32\sc.exe config lanmanserver start= disabled

●portproxy の設定
IPv4 および IPv6 のネットワークとアプリケーション間でプロキシとして機能させるために、netsh interface portproxy コマンドを使用します(PowerShell(管理者)で実行)。
> netsh interface portproxy add v4tov4 listenaddress=169.254.0.1 listenport=445 connectaddress=169.254.0.1 connectport=4451
listenaddressとconnectaddressは、先程Loopback Adapterのところで設定したアドレス。
> netsh interface portproxy add v4tov4 listenaddress=169.254.0.2 listenport=445 connectaddress=169.254.0.2 connectport=4452

削除するには
削除は、> netsh interface portproxy delete v4tov4 listenaddress=169.254.0.2 listenport=445等

設定確認 > netsh interface portproxy show v4tov4
設定を有効にするために、一旦Windowsを再起動する。
再起動後に次のコマンドを打ち込んで、169.254.0.1:455等が出力されればOK。
> netstat -an | find ":445"
Powershell(管理者)で実行する場合は、> netstat -an | find '":445"'
0.0.0.0:455 しか表示されていなかった場合は、ポートプロクシの設定がうまくいっていない。

●PuTTYの設定
源ポート「169.254.0.1:4451」、送り先「127.0.0.1:445」
源ポート「169.254.0.2:4452」、送り先「192.168.7.100:445」

参考
http://hmhr.ath.cx/?p=782
http://masaoo.blogspot.com/2020/01/samba-over-ssh-windows10-proxy-samba.html
http://tooljp.com/Windows10/doc/Service/Server.html
https://docs.microsoft.com/ja-jp/windows-server/networking/technologies/netsh/netsh-interface-portproxy


windowsファイル共有での注意点
接続したいイントラネット内windows10マシン(例えば192.168.7.100)があったとします。このときファイル共有アクセスは、外部クライアントからSSH接続して、「ネットワーク」→\\169.254.0.2で行うことになります(上の例では)。
しかし、時間がたてば、この内部マシン192.168.7.100(ここではwindows10を想定しています)はスリープ状態になりアクセスできなくなります。これを防ぐには、この内部マシンのネットワークアダプターを常にアクティブにしておく必要があります。

内部マシンwindows10のネットワークアダプター設定
デバイスマネージャー > ネットワークアダプター > 当該ネットワークアダプターを右クリックして[プロパティ] > 電源の管理 > [電力節約のために、コンピューターでこのデバイスの電源をオフにできるようにする]のチェックを外し、常にネットワークアダプターを有効にします。



TOP(HOME)へ

目 次
HOME
 全体のシステム構成&目次


RockyLinux

RockyLinux8.4のインストール

旧サーバーからのデータ移行

ネットワークの設定ほか
ダイレクトルールを使ったfirewallの強化
DNS(BIND)サーバー
DHCPサーバー
FTPサーバー
FTPS(FTP over SSL/TLS)
Webサーバー
  アクセス解析ツールAwstats
Mail(Dovecot&Postfix)サーバー
MariaDB(MySQL)サーバー
SSHサーバー
SSHトンネル
SSH+MariaDB+Exel
Sambaサーバー
openVPNサーバー
VNCサーバー(リモートディスクトップ)

systemdとfirewalldについて


CentOS8
CentOS7
CentOS5〜6

SELinux

Cプログラミング


●その他
クラウド Amazon EC2
Raspberry Piで遊ぶ
印刷機関連開発 刷版絵柄面積率測定
数独をExcelで解く


●趣味の世界
相対性理論
量子力学
群論
熱力学・統計力学
解析力学
物理でつかう数学
超弦理論(ノート作成中)