Encrypt_storage

背景 サービスを利用するとき、提供者に悪意があることを前提にもの事を考えるべきである。 何かがあってからでは遅いからである。 クラウドサービスのストレージが暗号化されていないのが気に食わない。 万が一ストレージのデータが流出することに備え、ストレージを暗号化したい。 アプリケーションレイヤーではなく、fsレイヤーで暗号化したい。 さて、どうやるのかね。 透過的暗号 & 復号 gocryptfsという、透過的暗号化をディレクトリ単位でしてくれるツールがあります。 これが素晴らしい。ユーザランドで動く。すぐ動かせる。 インストール方法 sudo apt install gocryptfs # または公式のバイナリをダウンロード 暗号化されるディレクトリの作成方法 mkdir ~/secure_data.encrypted gocryptfs -init ~/secure_data.encrypted 復号されるディレクトリを暗号化されたディレクトリにマウント mkdir ~/decrypted_data gocryptfs ~/secure_data.encrypted ~/decrypted_data gocryptfs はシンプルで信頼性が高く、後付けでも運用しやすいです。 実際に、mongodbのデータを移植した方法がこちら # install sudo apt update sudo apt install gocryptfs # make directories mkdir -p /secure/mongodb.encrypted gocryptfs -init /secure/mongodb.encrypted # パスワードを設定 mkdir /secure/mongodb # mongodbのデータ領域の確認 docker volume inspect rocketchat_mongodb_data # コピーを/secure/mongodbに移動 (allow_otherでしないとmongodb(非rootユーザが読めなくなる)) gocryptfs -o allow_other /secure/mongodb.encrypted /secure/mongodb cp -a /var/lib/docker/volumes/rocketchat_mongodb_data/_data/* /secure/mongodb/ # バインドマウントからボリュームマウントに切り替える vim compose.yml volumes: - /secure/mongodb:/bitnami/mongodb # docker composeで再起動 docker compose up -d つまりポイント 権限回り。mongodbが実行するのですが、所有者と権限にはくれぐれもご注意。 1001をownerにしないとうまくいかないです。 ...

May 3, 2025 · 2 min · 353 words · Me

VPNがdefaultルートを書き換えずに全トラフィックを奪う方法とは?OpenVPNの0.0.0.0/1マジックを読み解く

背景 VPNを使ってトラフィックを中継する際、すべての通信をVPN経由にしたい──そんなときに現れるのが謎のルート 0.0.0.0/1 と 128.0.0.0/1。 一見すると「なんだこの中途半端なルートは?」と思われがちですが、これはOpenVPNが採用する非常に巧妙なテクニックです。本記事では、その目的、動作、実際のルーティングテーブルを紐解きながら、この仕組みの裏側を解説します。 ルーティングとは?ip route の基本 Linuxのルーティングテーブルは ip route で確認できます。このテーブルは、「どのIPアドレス宛の通信を、どのネットワークインターフェースから、どのゲートウェイ経由で送るか」という配送ルール一覧です。 $ ip route 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 default via 192.168.1.1 dev eth0 この場合、 192.168.1.0/24 に属する通信は eth0 から直接送られる それ以外(つまりインターネットなど)は 192.168.1.1(ゲートウェイ)を経由して送られる パケットを受信すると、カーネルはルートテーブルの上から順に一致するエントリを探し、一番一致度が高い(= プレフィックスが長い)ルートに従って出力先を決定します。 つまり、 どの通信もまずは「最も具体的な(最長一致の)ルート」を優先する これがVPNのルーティング操作にも大きく関わってきます。 defaultルートとは? default ルート(または 0.0.0.0/0)とは、どのルーティングエントリにも一致しない宛先のパケットをどこに送るかを決めるルールです。いわば「最後の砦」。 # 例: よくある default ルート default via 192.168.1.1 dev eth0 この例では、「どのルートにもマッチしなければ 192.168.1.1 に送れ」となっています。 通常、インターネットへの出口(ISPや上位ルータ)に向かうために使われます。 A (100.64.1.61) ↓ B (100.64.1.27) — VPN Client ↓ C (162.x.x.x) — VPN Server ↓ D (192.168.40.10) ↓ E (192.168.40.130) AからD・Eに通信を通したい。しかし同時に、Aのインターネット通信もVPN(サーバC)経由で出したい。 ...

May 2, 2025 · 2 min · 314 words · Me

Problem_site2site

#背景 VPNを使って拠点間通信(Site-to-Site Routing)を構成していると、 思ったようにパケットが届かないケースがあります。今回は以下の構成で発生した通信不通トラブルと、その解決方法を共有します。 🔧 ネットワーク構成 [A] 100.64.1.61 (100.64.1.0/22) ↓ [B] 100.64.1.27 (OpenVPNクライアント) → VPN → [C] OpenVPNサーバー → [D] 192.168.1.4 (192.168.1.0/24) 目標:AからD(192.168.1.4)への通信を通すこと。 ❗ 問題の症状 BからDには通信可能(VPN経由で192.168.1.4が見える) AからDへの通信は届かない しかしDからAへの通信(返信)は可能 🧠 原因 Aは 192.168.1.0/24 サブネットに属していないため、この宛先へのパケットをデフォルトゲートウェイに送ってしまっていた。 つまり、「行きのルート」が不在だったわけです。 ✅ 解決策:Aに静的ルートを追加 一時的にルートを追加する場合は以下のコマンドを実行: sudo ip route add 192.168.1.0/24 via 100.64.1.27 これで、Aは目的地 192.168.1.4 へのパケットをVPN中継ノードBに送るようになります。 UbuntuでNetplanを使用している場合、/etc/netplan/xxx.yaml を以下のように修正します: network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: false dhcp6: false addresses: [100.64.1.61/22] routes: - to: default via: 100.64.1.1 - to: 192.168.1.0/24 via: 100.64.1.27 nameservers: addresses: [100.64.1.1, 8.8.8.8, 8.8.4.4] ちなみに、netplan applyをやって疎通できなくなると困ることってありますよね。 そんな時のためにこれがあります ...

May 2, 2025 · 3 min · 619 words · Me

Make back-up mechanism of self-hosted drive using Rsync and nginx

背景 自宅でfilebrowserというOSSを使ってwebからアクセス可能なドライブを作ったのですよ。 ただね、なんとこの間、5年間動かし続けた自作PCが壊れてしまい、直すまでドライブが使えないという問題が発生した。 Mean Time Between Failureをなるべく短くするために以下の二つの手段でドライブを冗長化する。 (しかも、リージョンが分かれているという。自宅で停電が発生しても、実家のドライブにアクセスするようになります。) filebrowserの下準備 メインのノードとは別にバックアップノードを用意しておき、rsyncで定期的にファイルを同期する filebrowserの前にnginxが動いているが、ここでHCを導入。メインがぶっ壊れた時にはバックアップにLBする。 0. filebrowserの下準備 Details filebrowserの立て方を簡単に教えますね。 バイナリをビルドするかダウンロードする(https://github.com/filebrowser/filebrowser) /usr/local/binに移動する。 パスワードとかゴニョゴニョする。パスワードのハッシュを生成。そして、–passwordの引数で渡す filebrowser hash mypassword ユニットファイルを作る。 例: [Unit] Description=FileBrowser Web UI After=network.target [Service] ExecStart=/usr/local/bin/filebrowser -a 0.0.0.0 -p 10001 -r /home/ray/hdd/filebrowser -d /etc/filebrowser/filebrowser.db --username hogehoge --password hogehoge --log /var/log/filebrowser.log WorkingDirectory=/etc/filebrowser Restart=always User=root Group=root [Install] WantedBy=multi-user.target sudo systemctl daemon-reload する sudo systemctl hogehogeが出力されたら、それを–passwordで渡す。 以上 1. rsyncで定期的にファイルを同期する 以下のコマンドを実行するcronジョブを作っておきましょう。毎時間ファイルを同期してくれます。 rsync -avz -e ssh ray@evn:~/hdd/filebrowser/ /opt/filebrowser_drive/ cronジョブの作り方は簡単 sudo crontab -e これで開いて、以下のジョブを登録する */1 * * * * rsync -avz -e "ssh -i /home/ray/.ssh/id_ed25519" ray@100.64.1.61:~/hdd/filebrowser/ /opt/filebrowser_drive/ cronはrootで実行されるので、鍵を指定しないと/home/root/.ssh の鍵を使いますが、めんどいので自分のを使うようにする。 ...

May 2, 2025 · 1 min · 186 words · Me

Grafana_variables

事始め いやね、だんだんと管理するインスタンス数が増えてくるわけですよ。そうすると一辺に全部のメトリクスが出てきてわかりずらいわけです。 それを解消するためにラベルを張って、どれがどれくらいか見たいよね、というお話です。 grafanaでラベルを変数化する方法 dashboard > setting > variablesから変数を用意できます。 変数にも種類があり、customやtextがあります。 おすすめはcustomですね。自分が好きな名前で候補を登録できます。 例えば以下のように evn : 100.64.1.61:9100, jhonny : localhost:9100, これ、カンマ区切りでkey:valueになってる。そして最後もカンマが必要ってのが大事。 そして、promqlでは以下のように書くことで変数を自分で選べるようになります。 rate(node_disk_written_bytes_total{instance=~"$host"}[1m])/1024/1024

March 27, 2025 · 1 min · 21 words · Me

Introduce_ups

背景 実家は太陽光発電を備えている。 ただ、商用電源と太陽光発電の切り替えの際に一瞬電気が落ちる。この時にコンピュータの電源も落ちる。これがいやなのでUPSを買った。 しかし、UPSをリモートモニタリングできないことが判明した。 USBでUPSに接続して、専用のソフトをインストールしないとモニタリングできないことがわかった。 なので、UPSモニタリングをするためのサーバを導入する。 ラズパイで監視する。 1. NUTをインストール sudo apt update sudo apt install nut -y 2. UPSのUSB接続を確認 UPSがUSBで認識されているか確認します。 pi@alpha:/etc/nut $ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0764:0601 Cyber Power System, Inc. PR1500LCDRT2U UPS Bus 001 Device 003: ID 0c45:1202 Microdia Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Cyber Powerが接続されていることがわかる。 ...

March 9, 2025 · 2 min · 300 words · Me

Systemctl_ope

February 27, 2025 · 0 min · 0 words · Me

O11y

oss o11y 最強セット 題名の通り。 o11yを実施するためのoss最強セットです。 構築していきたいと思います。 環境 hugo_server : Grafana, Gateway hugo_server -> jhonny : Openvpn tunneling jhonny : Prometheus, Opensearch, (maybe kafka?) 集めたいデータ GSLB周り GSLBのHCデータ GSLBのアクセスログ GSLB clusterの各ノードの状態 openvpn周り vpnserverのログ vpnserverのステータス 構築 Grafana apt install grafana-serverでインストール sudo systemctl enable grafana-serverでデーモン化 sudo vim /etc/grafana/grafana.ini でホストヘッダーを設定 sudo vim /etc/nginx/nginx.confでプロキシの設定 grafanaにアクセス。初期ユーザ、パスワード:admin,admin prometheus 公式からprometheusのbinary + 設定ファイルのtarをダウンロード ref 設定ファイルやbinaryを移動する /etc/prometheus/prometheus.yml、/var/lib/prometheus/data/、 ユニットファイルを作る(/lib/systemd/system/prometheus.service) [Unit] Description=Prometheus Server Wants=network-online.target After=network-online.target [Service] User=root Group=root ExecStart=/usr/local/bin/prometheus \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/var/lib/prometheus/data \ --web.listen-address=0.0.0.0:9090 Restart=always LimitNOFILE=65536 [Install] WantedBy=multi-user.target sudo systemctl daemon-reload sudo systemctl start prometheus という感じですね。完璧ですー。 ...

February 23, 2025 · 3 min · 608 words · Me

Site2site_vpn2

事始め site2site routingができるようになり、vpn_clientのネットワーク内のサーバとvpn_server間で通信ができるようになったわけだが。 今回、新たにもう一つvpn_clientをつなぎ、新しいローカルネットワークをこのVPNネットワークに参加させようとしたわけだ。 しかしこれがうまくいかない。 環境の整理 ネットワークA : 100.64.0.0/22 ネットワークB : 192.168.1.0/24 で、以下のような設定をvpn_serverに書き込むわけです。 port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh.pem crl-verify crl.pem ifconfig-pool-persist ipp.txt server 10.8.0.0 255.255.255.0 # client側から通信させたい、server側のLanセグメントを指定 push "redirect-gateway def1 bypass-dhcp" push "route 10.8.0.0 255.255.255.0" push "dhcp-option DNS 8.8.8.8" # server側から通信させたい、client側のlanセグメントを指定 client-config-dir /etc/openvpn/ccd route 100.64.0.0 255.255.252.0 route 192.168.3.0 255.255.255.0 #fragment 1400 #mssfix tun-mtu 1400 client-to-client keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status /var/log/openvpn-status.log log /var/log/openvpn.log log-append /var/log/openvpn.log verb 3 duplicate-cn これをやればA -> vpn_server B -> vpn_serverにつながると思っていた。 ...

February 22, 2025 · 6 min · 1073 words · Me

Port_forwarding_using_iptables

事始め openVPN + nginxを使うことでhttpリクエストをリバースプロキシして自宅ネットワークから配信することはできるようになった。 しかしこれあくまでもL7レイヤーの話であり、http以外は無理だという話だ。 例えば、kafkaのトピックにデータを登録するにはhttpではなく独自のプロトコルを使う必要がある。つまり、nginxではだめだということ。 どうするかというと、L3レイヤーでトラフィックの宛先を変えてあげる必要がある。 関連 ovpnを使ってsite2site routing iptalbesを使ってポートフォワーディングする方法 # 10001番ポートのトラフィックを 100.64.1.61:10001 に転送 iptables -t nat -A PREROUTING -p tcp --dport 10001 -j DNAT --to-destination 100.64.1.61:10001 # フォワードを許可 iptables -A FORWARD -p tcp -d 100.64.1.61 --dport 10001 -j ACCEPT # 外部に返すためのMASQUERADE(オプション) iptables -t nat -A POSTROUTING -d 100.64.1.61 -p tcp --dport 10001 -j MASQUERADE という感じですね。 今更だけどopenvpnがフリーソフトなのって普通にやばい こちら

February 19, 2025 · 1 min · 59 words · Me