計算機保守関係の備忘録#
(最終更新:2026年1月4日)
個人的な備忘録です.
tailscale#
NAT越えを簡単に実現して任意の端末にp2pでVPNできるすごいツール.p2pだから早いし無料版でもかなりのことができる(しかしこんな素晴らしいツールには課金しよう). しかもGoogleなどの代替の認証でポート穴あけせずにssh, 80番ポートなどの認証を通すことができる.
公式Doc に情報が豊富なので暇があれば色々調べるとできることが増えそう.まあgeminiとかChatGPTに聞きながら公式ドキュメントを参照するのが効率的であろう.
tailscale-ssh#
sshはリモートホストサーバーで
# tailscale up --ssh
で22ポートをtailnetのドメインに開放しなくてもtailnetに接続した端末から
$ ssh <hostname, hostname.tailnet-domain or tailnet.ip>
とすればweb認証を求められるので認証を通せばホストにsshできる. ファイヤーウォールufwじゃなくてnftableで制御してて設定ファイルの記述が面倒だったので助かる.
tailscale-serve#
tailscale-serveを使うとポート開放せずにwebサーバーを自身のtailnetに公開することができる.
# tailscale serve 80
Serve is not enabled on your tailnet.
To enable, visit:
https://login.tailscale.com/f/serve?node=xxxxxxxx
webでhttps cert の有効化を求められる.
Start using Serve
Tailscale Serve lets your serve content from your Tailscale node to your tailnet via HTTPS.
Learn more (https://tailscale.com/kb/1242/tailscale-serve)
Enabling HTTPS is required to use Serve:
☑️HTTPS certificates
☑️Tailscale Funnel (optional)
有効化すると
Success.
Available within your tailnet:
https://xxxx.yyyy.ts.net/
|-- proxy http://127.0.0.1:80
Press Ctrl+C to exit.
となりhttps://xxxx.yyyy.ts.net/ には自身のtailscale netからのみアクセス可能になる.
しかも暗号化されていない80番のhttp通信を暗号化してhttpsにしてくれるというありがたさ.
background でジョブを起動するには
# tailscale serve --bg 80
Available within your tailnet:
https://xxxx.yyyy.ts.net/
|-- proxy http://127.0.0.1:80
Serve started and running in the background.
To disable the proxy, run: tailscale serve --https=443 off
とすれば良い.ユーザーの追加やACLの設定も可能ときた.凄すぎ.
セキュリティは高そうなのだが,過信は危険なので,攻撃検知,侵入検知,改竄検知は必要かもしれない. httpsにしてくれるとはいえパスワードは使い捨で覚えないものに,ホストのルートパスワードとは異なるものにしておこう.
ちなみにtracerouteで経路を確認するとnext hopが該当の端末になっているのは通信がWireGuardで文字通りVPN接続になっているっぽい.
ちなみにx11 forwardingには対応していないので
X11 forwarding request failed
となる.画像とか描画を確認する場合は sshfs かNASのようにマウントしてしまった方が楽かもししれない.
Key expiry#
tailnetに参加したdeviceのnode key は180日で失効する(ちなみにauth keyはtailnetへの招待キーのことでこちらは1~90日で指定可能.無指定だと90日で失効).
それ以降は認証切れとなり再認証が必要なようだ.
管理画面に登録されたMachineだとDisable key expiry の設定が存在するので,絶対に再認証させたくないデバイス(管理地が遠方など)はキー失効を無効化した方が良いだろう.
TAGとACL#
複数のデバイスへのALC(Access control list)の設定はtagをつけると管理が容易になる. tailscaleでタグを作成して,tagをアサインしたいデバイスで
# tailscale up --advertise-tags=tag:<your-created-tag> --ssh
のようにすれば良い.ただしTagを設定するとほとんど全てのアクセスが拒否されてしまうのでACLのjsonをきちんと編集する必要があるので注意.
ACLの編集はそんなに大変ではなく,tailscaleの管理画面でAccess contolsから編集できる.
tagをつけたデバイスへのsshを許可する場合,管理画面Access controls/json editorで"ssh":のdstセクションでtag:<your-created-tag>を追記すれば良い.
"ssh": [
// Allow all users to SSH into their own devices in check mode.
// Comment this section out if you want to define specific restrictions.
{
"action": "check",
"src": ["autogroup:member"],
"dst": ["autogroup:self", "tag:<your-created-tag>"],
"users": ["autogroup:nonroot", "root"],
},
],
ちなみにdefaultの"action": "check"は毎回Web認証を要求するもので,"action": "accept"にするとtailnet接続時で認証を済ませ,Web認証は不要になる(らしい).詳しくはconfigure tailscale sshあたりが参考になる.
WebサーバーなどのALCの設定はremoteaccess to production environmentが参考になる.
"acls": [
{
"action": "accept",
"src": ["autogroup:member"],
"dst": ["tag:showa:80,443,8080"],
},
],
のように"acls"のセクションを追記すれば良い.なお"action": "check"はサポートしていないようだ.
8080もlistenするために
# tailscale serve --bg 8080
とすると最初に起動した# tailscale serve --bg 80 を上書きしてしまう.
私の環境ではうまくいかないのだがlocalhost:8080へのproxyは次のようにして設定できる.
# tailscale serve --bg --set-path /subdir http://127.0.0.1:8080
https://<your-tailnet-domain>.net/
|-- proxy http://127.0.0.1:80
https://<your-tailnet-domain>/subdir
|-- proxy http://127.0.0.1:8080
となる.ただ私のApplication(redmine, kibana)ではhttps://<your-tailnet-domain>/subdomainにアクセスすると
https://<your-tailnet-domain>/login?back_url=...
とsubdir抜きのURLにリダイレクトされるので,アプリケーション側でsub pathをちゃんと設定しなきゃいけないなぁ.
一応手動でhttps://<your-tailnet-domain>/subdir/login?back_url=... とすればアクセス可能だがlogin後のページもhttps://<your-tailnet-domain>/loginにリダイレクトされるのでアクセスできない...
kibanaは設定変更は容易だけどredmineはリビルドしなきゃいけないからちょっと面倒臭いだよな...
まあこの辺りはファイヤーウォール(ufw)で制御する方が楽. talescaleはend-to-endで暗号化されているとはいえhttps化してないことがネックだな.
設定をリセットする場合は
# tailscale serve reset
とすれば良い.
他には#
出口ノード を設定できるので必要があれば使えるかもしれない.
リソース監視#
サーバーの統合監視 zabbix を利用し,個別の端末では sysstat によるログ収集を行う.セキュリティは素人なのでなかなか難しい.
セキュリティ#
工事中
mlocate#
ファイルサーバーでファイル検索する際にfindでは時間が掛かるので,(m)locateを使う.ファイルindexのupdateは
# updatedb
で /var/lib/mlocate/mlocate.db にファイル名インデックスのデータベースが保存される. ただし,私はファイルサーバーのファイルシステムにbtrfsを採用しており,同ディレクトリ上にsnapshotを保存しているので,これを除外しないと mlocate.dbのファイルサイズが肥大化する. 具体的には5TB程度のデータでsystemのストレージ(128GB)を全て占有してしまい,updatedbが中断された.
updatedbの設定ファイルは /etc/updatedb.conf にあり,PRUNEPATHSで除外が可能なので,次のようにしてsnapshotのディレクトを除外する.
PRUNE_BIND_MOUNTS="yes"
# PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober /var/lib/ceph /data/snapshots"
PRUNEFS="NFS afs autofs binfmt_misc ceph cgroup cgroup2 cifs coda configfs curlftpfs debugfs devfs devpts devtmpfs ecryptfs ftpfs fuse.ceph fuse.glusterfs fuse.gvfsd-fuse fuse.mfs fuse.rozofs fuse.sshfs fusectl fusesmb hugetlbfs iso9660 lustre lustre_lite mfs mqueue ncpfs nfs nfs4 ocfs ocfs2 proc pstore rpc_pipefs securityfs shfs smbfs sysfs tmpfs tracefs udev udf usbfs"
これによって5TBのファイルサーバーのmlocate.dbのサイズは1GB程度に収まる.