Tailscaleの使い方、その6:レンタルVPSサーバにアクセスする

VPNまとめを参照されたい。

Tailscaleの使い方、その5では、レンタルVPSサーバをExit Nodeにしてみた。つまり、VPSの目的2である。以下では、VPSの目的1、つまり、Tailscale経由で安全にVPSサーバの中をいじくることを考えてみる。

安全でないサービスの立ち上げ

Tailscale経由の暗号化された通信路を使うので、その通信路の中では、昔ながらの安全でない単純なサービスを使うことができる。例えば、telnetやftpである。これらは送受信データが暗号化されていないため、インターネットを生のままでそのデータを送受信するケースはあまりないだろう。しかし、Tailscaleによる「仮想的なLAN」の中では誰も見ることができないので構わない。

dnf install telnet-server
systemctl enable telnet.socket
systemctl start telnet.socket

dnf install vsftpd
systemctl enable vsfftpd
systemctl start vsftpd

これでtelnetとftpのサーバが起動したはずだ。

※ちなみにrootアカウントでftpにアクセスするには、/etc/vsftpdにあるuser_list, ftpusersからrootを削除しておく。

Firewallに穴を開ける

これだけでは、まだファイアウォールに阻まれてアクセスができない。Tailscaleをインストールして起動した時点で、仮想的なネットワークインターフェース(NIC)のtailscale0というのが作成されているはずで、Tailscale経由の通信はすべてここを通る。したがって、このNICは全面的に信頼できるものと指定しなければならない。デフォルトでは、telnetやftpの通信はブロックされてしまう。

TailsaleのAdmin Consoleを見た場合、このマシンは以下になる。

このマシン上で調べてみると、以下の表示になる。

# ifconfig tailscale0
tailscale0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1280
        inet 100.68.68.69  netmask 255.255.255.255  destination 100.68.68.69
        inet6 fd7a:115c:a1e0:ab12:4843:cd96:6244:4445  prefixlen 128  scopeid 0x0<global>
        inet6 fe80::7afd:4cd0:25be:5c28  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 35  bytes 1486 (1.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 43  bytes 1984 (1.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ファイアウォールの状態は以下である(長いのでかなり省略)

# firewall-cmd --list-all-zones
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ssh http https
  ports:
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

trusted
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

publicというゾーンには外向けのNICであるeth0が属している。ここでは、最小限のポートしか開けておらず、それ以外の外からの通信はブロックされる。trustedは全面的に信頼できるNIC用の設定で、ここにtailscale0という仮想的なNICを所属させることにする。

firewall-cmd --add-interface=tailscale0 --zone=trusted

※巷の例では、ここに–permanentをつけてすぐに恒久化させる例があるが、なぜか–permanentをつけるとうまく行かない。そもそも、そういった使い方はfirewall-cmdの想定するところではないだろう。設定がうまく行ったら、最後に恒久化させることにする。つまり、メモリ上だけの設定ではなく、設定ファイルとしてセーブし、OS再起動後にも有効にする。

すると以下になる。

# firewall-cmd --list-all --zone=trusted
trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: tailscale0
  sources: 
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

接続テスト

telnet

この状態で、Tailscale上のIPアドレスを指定すれば、telnetに接続できるはずである。手元のWindowsでtelnetを動かしてみる。

telnet 100.68.68.69

すると、プロンプトが返ってくる。これだけで成功だとわかる。

login:

ちなみに、外向けのNICからtelnetに接続してみる。このNIC経由ではtelnetポートにアクセスできないことがわかる。

ftpテスト

Filezillaを使ってアクセスしてみた。入力は以下の三つ。

  • 100.68.68.69
  • root
  • rootのパスワード

簡単にアクセスできる。

アクセス図

図で書くと以下のようなイメージだ。

もちろん、上の暗号化された通信路は実際には以下のような具合だ。正確ではないかもしれないが、おおよそこんな感じだろう。

firewall設定を恒久化する

設定がうまく行ったら、firewallを恒久化する。何かしらうまく行かず、今回の作業ではありえないが、例えば、外側からSSHでさえも接続できなくなってしまったなどの事態があれば、OSを再起動すれば変更前の状態で起動する。

以下で、現在のメモリ上のみのルールを、再起動後にも適用するように設定ファイルに書き込む。

firewall-cmd --runtime-to-permanent

Tailscaleの使い方、その7:MagicDNSを使うに続く。