WPP
YAMAHA RTX1210 を Asahiネット IPIP + 固定IPアドレスオプション で使って Synology NAS をインターネットからアクセスできるようにする。

自宅 LAN 環境のルーターを NEC の IX から YAMAHA の RTX に変更したのだがなかなか苦戦したのでその顛末をメモする。 RTX1210 が Hairpin ナットに対応していないことに設定を始めてから気づいたり、自宅の模様替え以降どうにも WiFi が遅かった理由がケーブルだったりといろいろあったがなんとか解消できたので、一旦様子見としよう。

動機

NEC IX だとどうにも IKEv2 リモートアクセスを構築できなそうってことに気づき、なんだかなーと思っていたの思い切ってネット上でも IKEv2 リモートアクセスの設定例が見つかる RTX に変えることにした。

自宅 LAN にリモートアクセスするだけなら他の方式の VPN でも問題はないが、Android OS ネイティブ対応が IKEv2 のみになったのでちょっと困っていた。

回避策として Synology NAS についている OpenVPN サーバーで対応していたが、難しくはないがちょっと面倒に感じていた。

今日の時点ではリモートアクセス VPN は張っていないが、そのうちにやろうと思う。

前提

インターネット回線はタイトルにもあるが以下の通り

  • Asahiネット 光 の 1G のコース 10G だと「固定IPアドレスオプション」が使えない
  • 固定IPアドレスオプション
  • その結果、IPv4 over IPv6接続 (IPIP)
  • ひかり電話なし
  • ONU のみ

が使えるようになるってことらしい。PPPoE の IPv4 セッションも張れるがわざわざ使う必要はないだろう。
にしても ISP 界隈やケータイキャリア界隈ののネーミングセンスは壊滅的にわかりにくいと思う。名前から機能の差異がつかみにくいし、製品群の構成と名前付けルールが部外者からは理解し難く、わざとやっているのか?勘繰ってしまいたくなる。
LAN 内は、

  • Synology NAS
  • PC やスマホなどの端末機器

という構成です。NAS があること以外は至って代わり映えのない環境です。

なのでネットワーク構成は、

  • IPv6 で接続し、
  • その中を IPIP トンネルで流し、
  • DMZ はなし
  • LAN 内に配置した NAS に NAPT (ヤマハだとマスカレード) で外からアクセス
  • LAN 内に広告排除のために PiHole という DNSフィルタ (DNSサーバー)を建てるている。

って形になります。

[ここに図を入れる]

IPアドレス設計

IPアドレスはこんなふうになる。

ルーターの WAN側

IPv6 をあまり理解していないので間違いがあるかもしれない。

IPv6: 自動
IPv4: 157.107.76ZZZ

LAN 側

ルーター: 192.168.1.254

NAS: 192.168.1.244

その他端末: 192.168.1.0/24 のどこか

DNSサーバ: 192.168.1.245 (PiHole を参照するように DHCP で配布)

Asahiネットの固定IP 情報

固定IP が開通すると Asahiネット のマイページで以下のような情報を見ることができる。これらを適宜 RTX に投入する必要がある。

とはいえ、RTX のWeb管理画面でプロバイダー接続の設定はできるので、そこで一旦設定を作成してから手動で微調整した。(ネットワークガチ勢の硬派な方は GUI なんて使わないと思うがそこまでネットワークに興味ないので GUI でいきます。)

  • インターフェースID: 0000:0000:0000:0000:0000:9D6B:ZZZZ:0000 (ZZZZ はダミー)
  • AFTRエンドポイントIPv6アドレス: 2001:0C28:0001:0300:0000:0000:0000:ZZZZ
  • 固定IPv4アドレス: 157.107.76.ZZZ
  • アップデートサーバURL: https://v6update.asahi-net.or.jp/prefix
  • 認証用ユーザーID: P12345
  • 認証用パスワード: XXXYYYZZZ

開通通知の各項目は、設定画面では、(Asahiネット > RTX の Web画面 に対応する)

インターフェイスID > インターフェイスID:
上のインターフェイスID のうち上位の 0000 の並びを取り除き、再下位の 0000 を 0 に正楽略した形を指定する必要がある、要するに 9D6B:ZZZZ:0 とする必要がある。

AFTRエンドポイントIPv6アドレス > IPv6 アドレス:

固定IPv4アドレス > IPv4 アドレス:

アップデートサーバURL > アップデートサーバーの URL:

認証用ユーザーID > ユーザー名:

認証用パスワード > パスワード

にそれぞれ対応する。

RTX の設定した内容

結局こんな感じの大分類になりそう。(分け方とか認識に異論はあると思いますが、現時点の自分の中の整理ではこんなかんじ。)

  1. LAN 設定
  2. IPIP と IPv4 フィルタ
  3. NAT と IPv4 固定アドレス
  4. IPoE (IPv6) と Pv6のフィルタ
  5. DHCP
  6. あと LAN とか NTP アップデートとかもろもも
  7. LUA スクリプト

コンフィグ中に項番を入れコメントします。が基本は設定ウィザードの内容をいくらか修正しただけです。なのでフィルタの内容は十分といえないかもしれないので調整が必要だと思う。

上記の条件でよければ、コメントで開通通知の [項目名] とした部分を変更すればそのままで動くはずです。

# パスワードは encrypted な方がいいのはまちがいない
# このへんは、GUI で適当に
login password XXXXX
administrator password XXXXX
login user admin encrypted XXXXX
user attribute connection=serial,telnet,remote,ssh,sftp,http gui-page=dashboard,lan-map,config login-timer=1800
user attribute admin connection=serial,telnet,remote,ssh,sftp,http gui-page=dashboard,lan-map,config login-timer=1800

# コンソール文字化け対策
console character ja.utf8

# デフォルトで IPIP トンネルに抜ける
ip route default gateway tunnel 1

## 1. LAN設定 
ip lan1 address 192.168.1.254/24
# IPv6 アドレスを上から貰ってくる
ipv6 prefix 1 ra-prefix@lan2::/64

# 開通通知の [インターフェースID]
ipv6 lan1 address ra-prefix@lan2::9d6b:ZZZZ:0/64
ipv6 lan1 prefix change log on
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
switch control use lan1 on terminal=on

# これはようわからん、ウィザードが生成してきた。
# 削除するとイニシエーションに失敗するとか理由がありそうなので削らないほうが良さげ
lan linkup send-wait-time lan2 5

description lan2 AsahiNET

## 2. IPIP の設定 と  IPv4 フィルタ
tunnel select 1
 tunnel encapsulation ipip

#『IPv4 over IPv6接続(IPIP)接続設定情報』の
# [AFTRエンドポイントIPv6アドレス] まんま入力するとだめかも
 tunnel endpoint remote address 2001:c28:1:300::ZZZZ
 ip tunnel mtu 1460
 ip tunnel secure filter in 400003 400020 400021 400022 400023 400024 400025 400030 400032 400100 400101 400102 400103 dynamic 400082
 ip tunnel secure filter out 400013 400020 400021 400022 400023 400024 400025 400026 400027 400099 dynamic 400080 400081 400082 400083 400084 400085 400098 400099
 ip tunnel nat descriptor 20000
 tunnel enable 1
ip filter 1001 pass * * icmp * *
ip filter 400003 reject 192.168.1.0/24 * * * *
ip filter 400013 reject * 192.168.1.0/24 * * *
ip filter 400020 reject * * udp,tcp 135 *
ip filter 400021 reject * * udp,tcp * 135
ip filter 400022 reject * * udp,tcp netbios_ns-netbios_ssn *
ip filter 400023 reject * * udp,tcp * netbios_ns-netbios_ssn
ip filter 400024 reject * * udp,tcp 445 *
ip filter 400025 reject * * udp,tcp * 445
ip filter 400026 restrict * * tcpfin * www,21,nntp
ip filter 400027 restrict * * tcprst * www,21,nntp

# ping (icmp) を通しているが、落としてもいいと思う
ip filter 400030 pass * 192.168.1.0/24 icmp * *
ip filter 400032 pass * 192.168.1.0/24 tcp * ident
ip filter 400036 pass * 192.168.1.0/24 udp * ntp
ip filter 400037 pass * 192.168.1.0/24 udp ntp *
ip filter 400099 pass * * * * *

# Synology NAS に対する許可、ip tunnel secure filter in で使ってる 
ip filter 400100 pass * 192.168.1.244 tcp * 5000
ip filter 400101 pass * 192.168.1.244 tcp * 5001
ip filter 400102 pass * 192.168.1.244 tcp * 6690
ip filter 400103 pass * 192.168.1.244 tcp * https
ip filter 500000 restrict * * * * *
ip filter dynamic 400080 * * ftp
ip filter dynamic 400081 * * domain
ip filter dynamic 400082 * * www
ip filter dynamic 400083 * * smtp
ip filter dynamic 400084 * * pop3
ip filter dynamic 400085 * * submission
ip filter dynamic 400098 * * tcp
ip filter dynamic 400099 * * udp

## 3. NAT と IPv4 固定アドレス
nat descriptor type 20000 masquerade

# NAT の抜け先に固定 IP をあてる
nat descriptor address outer 20000 157.107.76.213
nat descriptor masquerade incoming 20000 reject 

# Synology NAS に対するアクセスを NAS の LANアドレスに向ける
nat descriptor masquerade static 20000 1000 192.168.1.244 tcp 5000
nat descriptor masquerade static 20000 1001 192.168.1.244 tcp 5001
nat descriptor masquerade static 20000 1002 192.168.1.244 tcp 6690
nat descriptor masquerade static 20000 1003 192.168.1.244 tcp https

## 4. IPv6 と IPv6フィルタ
ipv6 lan2 secure filter in 101000 101001 101002 101003 101010
ipv6 lan2 secure filter out 101099 dynamic 101080 101081 101082 101083 101084 101085 101097 101098 101099
ipv6 lan2 dhcp service client ir=on
ngn type lan2 ntt
ipv6 filter 101000 pass * * icmp6 * *
ipv6 filter 101001 pass * * tcp * ident
ipv6 filter 101002 pass * * udp * 546

# Synology NAS が使うポートを許可
ipv6 filter 101003 pass * * tcp * 5001

# IPIP を通す
ipv6 filter 101010 pass * * 4
ipv6 filter 101099 pass * * * * *
ipv6 filter dynamic 10197 * * https
ipv6 filter dynamic 101080 * * ftp
ipv6 filter dynamic 101081 * * domain
ipv6 filter dynamic 101082 * * www
ipv6 filter dynamic 101083 * * smtp
ipv6 filter dynamic 101084 * * pop3
ipv6 filter dynamic 101085 * * submission
ipv6 filter dynamic 101098 * * tcp
ipv6 filter dynamic 101099 * * udp

## 5. dhcp
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.1.1-192.168.1.244/24

# まあこれは趣味、NAS に常時同じIP を降らせてる
dhcp scope bind 1 192.168.1.244 01 90 09 d0 4b 06 cd

# Pihole: 192.168.1.245 と RTX自身と、pubulic な DNS を降らせる
dhcp scope option 1 dns=192.168.1.245,192.168.1.254,9.9.9.9
dns host lan1
dns service fallback on
dns server dhcp lan2 edns=on
dns private address spoof on

## 6. そのたもろもろ
tftp host lan
telnetd host lan1

# スクリプト実行(スクリプト自体は生成されたものを編集して使っている)
schedule at 1 startup * lua emfs:/v6plus_map_e.lua

# 時刻動機
schedule at 2 */* 05:43:21 * ntpdate ntp.nict.jp syslog
httpd host lan1
alarm usbhost off
alarm sd off
alarm entire off
sshd service on
sshd host key generate 57712 ZZZZZZZ
# any ホストはまずいかも
sftpd host any
statistics traffic on
statistics nat on

embedded file v6plus_map_e.lua <<EOF

#『IPv4 over IPv6接続(IPIP)接続設定情報』の
# [アップデートサーバURL]、[認証用ユーザーID]、[認証用パスワード] を貼り付け
UPD_SV = "https://v6update.asahi-net.or.jp/prefix"
USERNAME = "P1234"
PASSWORD = "XXXYYYZZZ"

# ここはウィザードがやってくれるのでいじらない
WAN_IF = "LAN1"

LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. WAN_IF .. "%s+by"
LOG_LEVEL = "info"
LOG_PFX = "[v6plus]"
FAIL_MSG = "Failed to notify IPv6 address to the update server. (remaining retry: %d time(s))"

function logger(msg)
rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end

local rtn, count, log, result
local req_t = {}
local res_t
req_t.url = string.format("%s?user=%s&pass=%s", UPD_SV, USERNAME, PASSWORD)
req_t.method = "GET"
while true do
rtn = rt.syslogwatch(LOG_PTN)
if rtn then
count = 3
while true do
res_t = rt.httprequest(req_t)
if res_t.rtn1 then
logger("Notified IPv6 address to the update server.")
if res_t.code == 200 then
result = "Succeeded"
else
result = "Failed"
end
log = string.format("%s to update IPv6 address. (code=%d, body=%s)", result, res_t.code, res_t.body)
logger(log)
break
end
count = count - 1
if count > 0 then
logger(string.format(FAIL_MSG, count))
rt.sleep(10)
else
logger("Failed to notify IPv6 address to the update server.")
break
end
end
end
end
EOF

LAN内から固定IPあての通信をPiHoleで解決

上が完成形なのだが、当初は DHCP で PiHole のアドレスを配布していなかった。

というのもヘアピンNAT機能が RTX1210 に無いため、LAN内から固定IPあての通信ができないことに気づいた。詳しくいうと独自ドメインに固定IP を紐付けインターネットに公開しているサーバがあり、それにアクセスできなくなっていた。

そのサーバは実際には、 Synology NAS でホストしているのだが、Synology の NAS の画面に接続できていたので、接続 OK と思い込んでいた。

スマホからは、独自ドメインのそのサーバにに、スマホの5G / 4G からはアクセスできていたので、IPv4 で通信はできていることになる。

さいわい、 PiHole をすでに使っていたので DCHP から配布するようにし、
PiHole の ローカル DNS レコードで独自ドメインを内向けに設定した (つまり NASの 192.168.1.244 を独自ドメインの FQDN にした)。

これにより、LAN 側から独自ドメインのサービスへのアクセスも疎通するようになった。

一時は面倒なので RTX830 か 840 あるいは 1220 を買うのかとも思ったが買わずにすんでよかった。

結局のところ NAS の画面には、IPv6 で接続していることなんだろうな。個人で使える固定 IPv6 というのを見たことがないが、それがあれば、単に DNS に登録するだけで済む話なんだろう。

駄話

部屋の模様替えをしてからというもの WiFi が遅いなーとは思っていたのですが、RTX の Web 画面で見てみると 100Base で接続されていました。レイアウト変更時に間に合わせでつないだケーブルを変更するのを忘れていました。

ケーブルをカテ 6A に交換すると常時100Mbps 以下だったところが、いいときは 500Mbps 越えも記録するようになった。物理的に 100Mbps が上限だったので当然といえば当然。世間的には決して早くはないですが、前がひどかったのでだいぶ良くなった。

教訓

事前準備は周到に!

参考

IPv4 over IPv6接続(IPIP) | IPv6接続機能 | オプション | 各種サービス | プロバイダ・インターネット接続は ASAHIネット
Asahiネットの対応機種リスト

IPv4 over IPv6接続(IPIP) 固定IP接続を設定する (Asahi-Net v6プラス) – YAMAHA RTXルーターの操作方法 設定 Tips | iPentec

公式の設定サンプル v6 コネクト接続設定例

introduction for YAMAHA remote router series
RTPro 公式の資料集

コマンドリファレンス
公式のリファレンス

RTX1200のv6コネクト接続設定でハマる – GentooやIoTの覚え書きブログ
RTX1200 でもやれるらしい

RTX830 の設定、IPv6 の話 – 記憶力が無い
さらっとしか見ていないがこれとほぼ同じでできるはず。

RTXルータでパケットフィルタのログを確認する – 3流プログラマのメモ書き
これも参考になる。

【ヘアピンNATができない!】LANからだとアクセスできない問題を解決する。【ローカルDNS】
ヘアピンNATはこのページをヒントに今回は PiHole で回避した

YAMAHAルータでヘアピンNAT(NATループバック)を有効にする – OpenTecMemo / オープンテックメモ
これはよくわからなかった。pp のアドレスと固定IPを別にすると向き先が違うので NAT が効くってことらしいが、IPIP トンネルでどうしたらいいかわからなかった。できなそうな気もする。

YAMAHA RTX1200 – maruko2 Note.
チートシート的なページ

ヤマハルータのコマンド | muchbow
これもチートシート的なページ

どうでもいい話だが、AsahiネットはAasahiNet なのかASAHINETなのか表記がゆれててよくわからん

synology NAS に pi-hole をインストールするも “Failed to set capabilities for pihole-FTL. Cannot run as non-root.” ではまった話

暑いあまりにも暑い。

それはともかく、 iPhone があまりに広告に対し脆弱なので pi-hole をインストールした。

クライアント側にアプリを入れる対策もあるが、正直毎回入れるのは面倒なので、dhcp で参照先 DNS として配布できる pi-hole を入れてみた。

ここまで来るまでには Adguardhome (Adgurad のサーバー版) も試したのだがちょっと自分には機能が豊富すぎる気がしたので pi-hole に一旦落ち着いたところだ。

以下の設定は、docker の動く synology なら動作する。もちろん単独のサーバーでもいい。

docker を bridge モードで動かすと アクセス元のクライアントがみんな一緒になってしまう問題があるが、 fetburner.core の情報を参考にして以下のようになった。

環境

LAN 側の状況

IP: 192.168.1.0/24
デフォルトゲートウェイ: 192.168.1.254

コンテナにも、LAN 側の IP を別個で割り当てる。

IP: 192.168.1.245
まあ、他とかぶらなければなんでもいい。
(当然だが、LAN 内の他のホストと衝突しないように調整する。必要ならルーター dhcp の除外範囲も調整する)

ブラウザでダッシュボードにアクセスするとセキュリテイ警告がでるが、インターネット側からアクセスする必要はないと判断して外部からアクセスするための設定は省略した。

必要なら synology のリバースプロキシとルータのポート開放を設定すること。

docker-compose.yml

実は、公式の docker-compose.yml をコピーしても起動時に ”Failed to set capabilities for pihole-FTL. Cannot run as non-root.” というメッセージを吐いてコケる問題があったが、DNSMASQ_USER を指定してやると回避できた。

# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    volumes:
      - /volume1/docker/pihole/conf:/etc/pihole
      - /volume1/docker/pihole/dnsmasq.d:/etc/dnsmasq.d
    environment:
      TZ: 'Asia/Tokyo'
      FTLCONF_webserver_api_password: 'なんかパスワードをしていすること'
      DNSMASQ_LISTENING: 'all'
      DNSMASQ_USER: 'root'
    networks:
        macvlan:
             ipv4_address: 192.168.1.245
    cap_add:
      - NET_ADMIN
    security_opt:
        - no-new-privileges:true
    restart: unless-stopped

networks:
    macvlan:
        name: macvlan
        driver: macvlan
        driver_opts:
            parent: ovs_eth0
        ipam:
            config:
                - subnet: 192.168.1.0/24
                   gateway: 192.168.1.254

起動後の設定

上記の設定ならブラウザで http://192.168.1.245/admin にアクセスするとダッシュボードが表示される。

左側の settings から DNS に進みお好みの上位 DNS を指定すれば設定は完了。
必要なら、Custom DNS にローカルのルーターを指定してやってもいい。なんにもしなくても動くようになっているので楽ちん。

dhcp から DNS を配布

DNS タイプの広告ブロッカーはインストールしただけでは、クライアントから使うことはできない。クライアントが今までとは別の新しい DNSサーバー を参照しないと意味がない。これは Pi-hole もAdguradhome も同様だ。

手順は割愛するが、iPhone だと手動で DNS を切り替えることができる。

Android12 以降では、手動での切り替えはできない。

何れにしても手動で設定するのは面倒なので、しばらく使ってみて問題がなさそうならルーターの dhcp から pi-hole の ip アドレスを DNS として配布するように設定するつもりだ。

多くの場合、ルーター自身の参照 DNS や dhcp の設定で配布する参照 DNS を決定をすればいい。

補足

実は synology で動かす前に、ROCK64 といラズベリーパイ3B 互換の SBC で試してみた。が明らかにインターネットの参照が遅くなったので、最終的に synology NAS で動かすことにした。

ROCK64 では dietpi という軽量 Linux に直接インストールしてみたがそれでも遅かったのでしかたない。PI4 か PI5 なら違った結果になったのかもしれない。

参考

IME辞書を自動で Synology Drive にバックアップ

最近こっている事の一つにIME辞書にショートカットを登録することがある。そうすると IME 辞書をバックアップしたくなる。

IME 辞書そのものは普通のファイルなので単にコピーするだけで OK ですが、まあ面倒くさい。Win11 で試した限り辞書の保存場所を変える方法はなさそう。

自分の 場合辞書は
C:\Users\ユーザー名\AppData\Roaming\Microsoft\IME\15.0\IMEJP\UserDict
に保存されている。

これをなんとかして Synology Drive のフォルダにコピーできればバックアップができて、それを定期的に実行すれば自動バックアップの完成という訳。

NAS がなくとも、この自動コピーの仕組みでバックアップは実現できます。

手順

  1. 辞書ファイルのコピー

まずは、辞書をコピーするスクリプトを作成する。コピーには個人的な好みで cwRsync を使用する。

こんな感じになる。/cygdrive/c/ からはじめると c:\ の意味になるようだ。

rsync -av /cygdrive/c/Users/172369/AppData/Roaming/Microsoft/IME/15.0/IMEJP/UserDict/* /cygdrive/c/synologydriveのフォルダ/

cwrsync (rsync) は実際に試す前に -n を追加して (-avn) で実行する内容を試した方がいい。特にデリートコマンド系は危険。

もし、Windows標準の Robocopoy を使うならこんな感じ。(恥ずかしながらこのコマンド初めて知りました。)

Robocopy.exe C:\Users\172369\AppData\Roaming\Microsoft\IME\15.0\IMEJP\UserDict\ . C:\synologydriveのフォルダ /XO

Robocopy はかなり複雑なのでちょっと難しい印象。それで避けていたのかもしれない。

スクリプトを書く際に注意しなくてはいけないのは後段のタスクスケジューラで実行する時にカレントディレクトリがシステムディレクトリ(確か system32 だったか)になってしまうので .\ とかするとコピーができずに永遠に終わらなくなったりする。

  1. タスクスケジューラに登録

2つの参考リンクをミックスした感じで

[start] -> tasks と入力してタスクスケジューラを起動する。

新しいタスクの作成にすすみ、名前を適当に入れる。
今回は、コピー元、コピー先ともに自分自身がオーナーのユーザーフォルダなので実行するユーザーを変更する必要はない。

[トリガー]タブは、[毎日]、[繰り返し間隔] [1時間] に設定する。

[操作]タブ、
プログラム: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加: 作成したスクリプトのフルパス
自分の環境では ExecutionPolicy を許可ずみなので -ExecutionPolicy Bypass は不要でした。

ちょっと面倒ですがここまですると、 Synology Drive へ定期コピーし Synology Drive が NAS へ同期

することで自動バックアップする一連の流れを設定とすることができました。

参考

cwRsync – Rsync for Windows | itefix.net

Robocopyの基本動作とコマンドオプション解説

Windows10でPowerShellスクリプトをスケジュール実行する – 3テラバイト

タスクスケジューラでPowerShell スクリプトを実行する | Windows 実践ガイド

Synology NAS で Forgejo をちょっと試してみる

自宅 NAS では Gitlab を動かしています。これは機能しているのでいいといえばいいのですが、遅いです。それほど強力でない NAS 上の docker とはいえ起動して使い始めるまで大体 5 分位かかります。

それから、Gitlab のアップデートは異常に早いです。大抵 2、3 週間放置しているとアップデートされ、critical update も非常に頻繁です。そのたびにアップデートするのですが正直面倒なのと失敗するかもしれないというドキドキはあまり嬉しいものではありません。

なのでちょっと違うものを試してみることにしました。Gitea が良さそうと思いましたが、更に Forgejo が fork されているようです。なので Forgejo を動かしてみることにします。

Forgejo は dockerhub でホストされていないようなので、Project を作成します。

Create Project ダイアログは以下のように指定します。

Project name: 適当な名前
Path: NAS 上の composer.yaml を置く場所
Source: docker-compose.yaml の作成を選択する
テキストボックスに docker-compose.yaml の内容を指定して [Next] へ進む
Web ポータルの設定はせずに先に進む。

version: '3'

networks:
  forgejo:
    external: false

services:
  server:
    image: codeberg.org/forgejo/forgejo:7
    container_name: forgejo
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - forgejo
    volumes:
      - /volume1/docker/forgejo:/data
      #- /etc/timezone:/etc/timezone:ro
      #- /etc/localtime:/etc/localtime:ro
    ports:
      - '8002:3000'
      - '8003:22'

ポート番号は適当に変えています。適宜、状況に合わせて調整してください。

リバースプロキシ設定で https://forgejo.xxx.myds.me を 8002 に流して https の設定は終わり。

ssh 接続は確認していないので後ほど追記することになると思う。

参考

Installation with Docker | Forgejo – Beyond coding. We forge.

synology の Docker で code-server を動かす

タブレットをせっかく買ったので個人開発をタブレットでもできるようにということでいろいろと調べてみる。

coder っていう Web IDE が見つかり、それはどうやら VS Code を動かしているものっぽい。その coder が出している code-server ってので Docker で動くらしいのでやってみた。

自分の環境では、Docker と Synology NAS のリバースプロキシを使っているが Docker だけの場合は R.P. 部分は読み飛ばせばいい。リバースプロキシで SSL しているので Docker 側では何もしていない。

Docker 設定

Docker の設定は、 Synology NAS にならう感じで書いてくので、いい感じで読み替えて Dockerfile なりを書いてほしい。

イメージ

codercom/code-server を duckerhub からダウンロードする

ポート

ここでは、ホスト側 9001 をコンテナ側 8080 になるように expose した。

ボリューム

ここは、dockerhub の説明とは少し変えた。というのもボリュームリンクなしで起動してみると /home/config の中には、.config や、 .local の他にもいろいろ保存されそうなだったのでざっくりと指定した。まとめると

ホスト側はあくまで自分の環境でのことなので、好きな場所に変えてください。

ホスト側コンテナ側
/volume1/docker/code-server/config/home/coder
/volume1/docker/code-server/project/home/project

ここまでで、 9001 ポートに http アクセスすれば使えるようになっている。

ログインパスワード

コンテナははじめからパスワード認証が有効になっている。そのパスワードは初期値が config.yaml に生成されるようだ。

場所は上の例で行くと、/volume1/docker/code-server/config/.config/code-server/config.yaml です。

リバースプロキシ設定

ここも、synology NAS のでやる場合の内容です。

外側 443ポートに対しネームベースで振り分けるように設定します。また、code-server は WebSocket を使っているらしいので ws が通るように設定します。

xxx.myds.me は、NAS に付属の DDNS ホスト名です。そのサブドメインを作成し、コンテナに流す設定をします。

コンテナは、先程 9001 を開けたので 9001 に流します。

[ソース側]

Protocol: HTTPS
Hostname: code.xxx.myds.me
Port: 443

[転送先 (destination) ]

Protocol: HTTP
Hostname: localhost
Port: 9001

[カスタムヘッダー]

WebSocket を通すためにカスタムヘッダーを設定します。 Synology のリバースプロキシの実態は nginx なのでその設定と言ったらわかりやすいでしょうか?

Custom Header タブに行き Create > Websocket を選択すうと結果こうなります

Upgrade => $http_upgrade
Connection => $connection_upgrade

ここまで終えると、

https:/code.xxx.myds.me/ でアクセルすると、VS-Code っぽい画面がでてきます。初回はパスワード認証で先程のパスワードを入力すると認証をパスします。

エディタで開くフォルダは、 ?folder=/home/project とかすればいいようです。場所によってかけなかったり、コンテナ停止で消えたりするので注意が必要ですね。

code-server のコンテナには python とか入っていないので、ちゃんとやりたければ別のコンテナかサーバーに ssh したほうがよさそう。直接コンテナにインスールしても消えてしまう。(コンテナの / をどっかにマウントするのもちょっとなんだし)

参考

codercom/code-server – Docker Image | Docker Hub

Install – code-server Docs

Websoc kets for Synology DSM – Matthias Lohr – Synology のリバースプロキシで websocket を通す方法

Linux Mint カレンダーで CalDAV/CardDAV を扱うには Evolution を入れる

さてカレンダーアプリは Synology NAS のカレンダーをメインで使っているのですが、Linux Mint をメインで使うようになってちょっと困っていたのがカレンダーの管理です。

Linux Mint には gnome カレンダーがついているっぽいのですが、そこで CalDAV アカウントを追加する方法がありませんでした。そのため避難先として Vivaldi ブラウザのカレンダ機能を使っていました。

Vivaldi も決して悪くはないのですがブラウジング中に予定を見たいときに、見ているタブが隠れてしまうのと、操作性と画面のウルサイ感じが地味にストレスでした。

とはいえ メールは完全に Web ベースしか使っていないので Evolution 使うのはちょっと大げさだとかんじていましたが、Chienomi さんのページをみると
「 Evolution 入れて CalDAV カレンダーを追加すると gnome カレンダーから参照できるようになる。」
なんですと ?!。ということでやってみました。

Evolution を起動し、カレンダーを追加した後、gnome カレンダーを起動するとあっさりとカレンダーのアイテムが表示されるようになりました。

CardDAVアドレス帳も同じように、Evolution で追加してやると gnome Contats (日本語表示していないのでわからないのですが、恐らくアドレス帳じゃないかと思う) で CardDAV の参照ができるようになった。

1 つ課題が解決しました。

参照

Linux環境でCalDavを使ったカレンダー利用 – Chienomi

Using a CalDAV calendar

Synology NAS の 5001 ポートを何とかする

Synology の NAS では Web アプリが 5001 で待受けをしています。制限のゆるいネット環境では恐らくなんの問題もなくアクセスできるでしょう。

しかし会社等 PROXY 経由でインターネットに抜ける環境などの制限がきついネットワークでは 5001 ポートにアクセスできないことがあります。逆向きにいうと 443 ポートでないと自由に外に抜けられないことが多いということです。

そんなときに NAS のリバースプロキシを使って解決することができます。

手順

  1. コントロールパネルを開きます。
  2. ログインポータルから Advanced を開きます。
  3. Reverse Proxy をクリックします。
  4. Create ブタンをクリックします。
  5. イメージのように
    Source側
    Protocol: HTTPS
    Hostname: 新サブドメイン.自分のDDNS (例 dsm.ZZXXYY.myde.me 適宜アジャストしてください。)
    Port: 443
    Destination側
    Protocol: HTTPS
    Hostname: localhost
    Port: 5001
    と設定します。
  6. ブラウザで https://dsm.ZZXXYY.myds.me にアクセスして DSM の Web が表示するはずです。

解説

リバースプロキシの設定では外側のプロトコル、ホスト名、ポートの組をどこか他に流すという設定をします。

ところで NSA ホスト名は Synology の DDNS で振り出されるサブドメインを利用していることが多いと思います。自分の環境では、myds.me のサブドメインが振り出されています。ここではダミーサンプルとして ZZXXYY という名前を使用します。実際にはご自分で決めたサブドメインになっているはずです。

ここがポイントなのですが、Synology のDDNS は自分で決めた ZZXXYY の更にしたのレベルのサブドメインを作ってもちゃんと NASに向けて名前解決してくれます。DDNS の内部では * で全部のサブドメインを受けてくれているようです。

要するに、dsm.ZZXXYY.myds.me としても自分の NAS に向けてアクセスしにくるということです。

この tips がインターネットを検索しても見当たらないので記事にしました。せっかく NAS 使用していてもリバースプロキシ使ったらいいのにと思う記事が多く、少しでも知識が広まってくれれば嬉しいです。

Synology SFTP をアクティブにする

個人的に忘れがちなので、というのも他の Linux と異なり Synology の NAS のコントロールパネルでは、SSH をオープンにしても SFTP は使えないので別途、有効にする必要がある。
もしかすると、Linux 系サーバで使用する OpenSSH とかではデフォルト値がたまたま両方アクティブになるだけかもしれないが、いつも小ハマりするのでメモする。

操作方法

  1. コントロールパネルを開き
  2. File Services を選択し、FTP タブを表示する
  3. FTP/FTPS を通りすぎ、SFTP セクションががあるので、ここをチェックする
  4. 必要ならポートを変更する

これで SFTP できるようになるので SSHFS が使えるようになった。

NEC IX ルータで AsahiNet IPv6 固定IPを割り当て Synology NAS に外部からアクセスする

自宅インターネット回線を楽天ひかりから AsahiNET に切り替えました。というのも数週間前から転送速度が顕著に低下し、ついには常時10mbps 以下になり耐え難い状態で引越しすることに。。。

「固定IPアドレスが比較的安価」。「何となく老舗だし」という非常に安易な考えで AsahiNet に決めましたが結果満足してます。楽天ひかりの Xpass (クロスパス) では少なくとも手軽な固定 IP サービスはなかった為、外部から NAS にアクセスする目的で PPPoE の IPv4 接続を併用してサーバから外に出ていくときは、PPPoE 側にトラフィックを流していました。

ばりばりのネットワークエンジニアではないので、IX ルータ設定が面倒だなと思っていましたが、IPv6 (IPv4 over IPV6)接続で固定の IP となったのでトラフィックを一本化してポート転送できるようで設定がシンプルになり見通しがよくなりました。

で、NEC のサンプルのほぼパクリですが設定をさらしていきます。

固定IPの為の情報

AsahiNet 光 で固定 IP アドレスオプションを申し込むと以下のような情報がきます。これをサンプルに当てはめていくだけです。

一番難しかったのはインターフェースID を IX ルータの要求する xx : xx : xx : xx : xx : xx : xx : xx 形式(xx が 8個) にするとこが一番難しかった。

下の例のインターフェースID だったら 00:00:12:34:56:78:00:00 となるようです。こういう形式とか変換の仕方をなん呼ぶのかわかりませんが、動いているの多分大丈夫だと思う。(あっているという根拠が弱いので少し不安ではある。)

自動設定取得IDP12345678
自動設定取得パスワードpass1234
インターフェースID0000:0000:0000:0000:0000:1234:5678:0000
AFTRエンドポイント
IPv6アドレス
2001:1234:1234:1234:0000:0000:0000:1234
固定IPv4アドレス123.123.123.123
アップデートサーバhttps://v6update.asahi-net.or.jp/prefix
 認証用ユーザーIDP12345678
 認証用パスワードpass1234

ネットワーク構成

IX ルータは AsahiNet に IPIP 接続(固定IP)でインターネットに抜けます。

Synology NAS は 192.168.1.244 と 192.168.2.244 のアドレスを持ちます。
(一つのアドレスで構いませんが、以前の設定の名残りです。あまり気になさらずに。。。)

192.168.2.244 の 80, 443, 5000, 5001 ポートを外部に開けます。(static napt してます。)

192.168.1.0/24 のセグメントに PC やら スマートフォンやらが DHCP でつながっています。

本題に全く関係ない部分は消していますが、おおよそこんな感じて動いています。

古い IX 2105 で動いているのでそれより新しい機種+ ファームバージョンなら動くはずです。

設定

AsahiNet に直接関係ある部分は ! の後にコメントをいれています。

! NEC Portable Internetwork Core Operating System Software
! IX Series IX2105 (magellan-sec) Software, Version 10.2.42, RELEASE SOFTWARE
! Compiled Sep 09-Fri-2022 13:40:53 JST #2
! Last updated Feb 15-Thu-2024 21:50:53 JST
!
timezone +09 00
!
logging buffered 131072
logging subsystem all warn
logging timestamp datetime
!
username admin password hash xxxx@ administrator
!
ntp server 133.243.238.164
ntp interval 3600
!
ip ufs-cache max-entries 20000
ip ufs-cache enable
ip route default Tunnel1.0
ip dhcp enable
ip access-list client-list permit tcp src 192.168.1.0/24 sport any dest any dport any
ip access-list client-list permit udp src 192.168.1.0/24 sport any dest any dport any
ip access-list server-list permit tcp src 192.168.2.244/32 sport eq 80 dest any dport any
ip access-list server-list permit tcp src 192.168.2.244/32 sport eq 443 dest any dport any
ip access-list server-list permit tcp src 192.168.2.244/32 sport range 5000 5001 dest any dport any
ip access-list web-http-acl permit ip src any dest 192.168.1.0/24
!
arp auto-refresh
!
ipv6 ufs-cache max-entries 10000
ipv6 ufs-cache enable
ipv6 dhcp enable
ipv6 access-list block-list deny ip src any dest any
ipv6 access-list dhcpv6-list permit udp src any sport any dest any dport eq 546
ipv6 access-list dhcpv6-list permit udp src any sport any dest any dport eq 547
ipv6 access-list icmpv6-list permit icmp src any dest any
ipv6 access-list permit-list permit ip src any dest any
ipv6 access-list dynamic cache 65535
ipv6 access-list dynamic dflt-list access permit-list
!
!
dns cache enable
dns cache max-records 512
no dns fqdn-database roundrobin
!
proxy-dns ip enable
proxy-dns ip request both
!
!
ssh-server ip enable
ssh-server ipv6 enable
!
!
ddns enable
!
ip dhcp profile dhcpv4-sv
  assignable-range 192.168.1.100 192.168.1.199
  dns-server 192.168.1.254
  fixed-assignment 192.168.1.244 70:09:d0:4b:06:cd
!
ip dhcp profile dhcpv4-out
  dns-server 192.168.1.254
  fixed-assignment 192.168.2.244 70:09:d0:4b:06:ce
!
ipv6 dhcp client-profile dhcpv6-cl
  information-request
  option-request dns-servers
  ia-pd subscriber GigaEthernet1.0 ::/64 eui-64
!
ipv6 dhcp server-profile dhcpv6-sv
  dns-server dhcp
!
!===========================================================
! 固定IP用の「アップデートサーバ」「 認証用ユーザーID」「 認証用パスワード」を設定する
!===========================================================
ddns profile asahi-ddns
  url https://v6update.asahi-net.or.jp/prefix
  query key=P12345678&pass=pass1234
  transport ipv6
  source-interface GigaEthernet1.0
  update-interval 30
!
device GigaEthernet0
!
device GigaEthernet1
!
interface GigaEthernet0.0
  no ip address
  ipv6 enable
  ipv6 dhcp client dhcpv6-cl
  ipv6 traffic-class tos 0
  ipv6 nd proxy GigaEthernet1.0
  ipv6 filter dhcpv6-list 1 in
  ipv6 filter icmpv6-list 2 in
  ipv6 filter tunnel-list 3 in
  ipv6 filter block-list 100 in
  ipv6 filter dhcpv6-list 1 out
  ipv6 filter icmpv6-list 2 out
  ipv6 filter dflt-list 100 out
  no shutdown
!
!===========================================================
! 固定IP用の「インターフェースID」を設定する
!===========================================================
interface GigaEthernet1.0
  ip address 192.168.1.254/24
  ip dhcp binding dhcpv4-sv
  ipv6 enable
  ipv6 interface-identifier 00:00:12:34:56:78:00:00
  ipv6 dhcp server dhcpv6-sv
  ipv6 nd ra enable
  ipv6 nd ra other-config-flag
  no shutdown
!
interface GigaEthernet1.1
  encapsulation dot1q 100 tpid 8100
  auto-connect
  ip address 192.168.2.254/24
  ip dhcp binding dhcpv4-out
  no shutdown
!
interface Loopback0.0
  no ip address
!
interface Null0.0
  no ip address
!
!===========================================================
! 固定IPv4 と対向になるAFTRエンドポイントIPv6アドレス を指定する
!===========================================================
interface Tunnel1.0
  tunnel mode 4-over-6
  tunnel destination 2001:1234:1234:1234::1234
  tunnel source GigaEthernet1.0
  ip address 157.107.76.213/32
  ip tcp adjust-mss auto
  ip napt enable
  ip napt hairpinning
  ip napt static 192.168.2.244 tcp 5000-5001
  ip napt static 192.168.2.244 tcp 80
  ip napt static 192.168.2.244 tcp 443
  no shutdown
!

参考

v6コネクト「固定IPサービス」 設定ガイド : UNIVERGE IXシリーズ | NEC

synology NAS に time machine でバックアップできない場合

久々の synology ネタです。

通常なら NAS の UI で SMB を有効にして、共有フォルダを作成して、Bonjour broadcast を有効にするだけで OK なはずですが、自分の環境ではある時点から time machine が動作していなかったようです。

状況としては「 time machine で synology のボリュームを選択してもいつまでたってもマウントできない」という現象が発生しています。

参考の 2番目を実行すると問題が解決しましたので記事にします。

原因は定かではないですが、もしかすると OS をアップデートしているからかもしれません。

前提となる環境

  • AD / LDAP ドメインなし (Windows なし環境なので、無いと思っている)
  • SMB のみ、AFP なし

手順

参考リンクの2番目の通りですが、1 つだけ注意点があります。

例 3 Synology NASはADドメインに加わりましたが、SMBを介してDSMユーザー(例:TMuser)としてバックアップしたい場合:
のパターンで動作しました。

説明がわかりにくいのですが、DSM ユーザー となっているので AD ドメインではなく localhost (つまりワークグループ) を使うよってことを示しているようです。

ともかくコマンドを抜粋するとこんな感じです。

$ sudo tmutil setdestination -p "smb://localhost\\TMUser@aa.bb.cc.dd/timemachine-folder"

無事、time machine が復旧しました。最近 PC も 光回線も調子が悪いのでせめてバックアップだけでも取っておこう。

参考

Time Machine を使って Mac から Synology NAS にファイルをバックアップするには? – Synology ナレッジセンター
通常ならこちらだけでいい

Time Machineを使ってSynology NASに接続するとき、この問題を解決するにはどうしたらいいですか? – Synology ナレッジセンター
UI で設定してもダメだった場合、下の方法 2 で動作するようになった。