【デジタル自主】自宅サーバーからWireGuardを使ったホスティング方法

このコミットが含まれているのは:
守矢諏訪子 2023-07-03 01:18:03 +09:00
コミット 72627d37c6
7個のファイルの変更1490行の追加85行の削除

バイナリ
ass/kanrinya.jpg ノーマルファイル

バイナリファイルは表示されません。

変更後

幅:  |  高さ:  |  サイズ: 523 KiB

ファイルの表示

@ -3,13 +3,461 @@
<id>gemini://technicalsuwako.moe</id>
<title>テクニカル諏訪子</title>
<updated>2023-06-23T19:20:00Z</updated>
<updated>2023-07-03T00:00:00Z</updated>
<author><name>テクニカル諏訪子</name></author>
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
<entry>
<id>blog/digital-autonomy-with-wireguard-home-host.gmi</id>
<author><name>凛</name></author>
<title type="html">【デジタル自主】自宅サーバーからWireGuardを使ったホスティング方法</title>
<published>2023-07-03T00:00:00Z</published>
<category term="ja"></category>
<category term="blog"></category>
<category term="デジタル自主"></category>
<category term="wireguard"></category>
<category term="linux"></category>
<category term="bsd"></category>
<category term="devuan"></category>
<category term="openbsd"></category>
<category term="freebsd"></category>
<link href="gemini://technicalsuwako.moe/blog/digital-autonomy-with-wireguard-home-host.gmi" rel="alternate"></link>
<content type="html">
&lt;p&gt;WireGuardは非常に便利ですね。&lt;br /&gt;
自宅からウェブサイトをホスティングしたり、どこからでも自宅のサーバーやパソコンにアクセスしたりといった事が可能です。&lt;br /&gt;
今回はウェブホスティングの方法についてお伝えします。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;材料&lt;/h2&gt;
&lt;p&gt;食べ物じゃないけど(ジョーダンダヨー)、必要な物は下記で御座います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;好みのVPSホスティング会社から最も安いVPS(日本のOpenBSDサーバーはオススメ、ConoHaまたはVultrは良い)&lt;/li&gt;
&lt;li&gt;自宅にあるサーバー(1台でも複数台でも可)&lt;/li&gt;
&lt;li&gt;高速光回線インターネット接続&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;静的IPは不要です。&lt;br /&gt;
動的IPでも問題がありません。&lt;/p&gt;
&lt;p&gt;OS等は何でも良いですが、この記事ではVPSはConoHaのOpenBSDで、自宅サーバーは2台のThinkCentreとOpenBSD、及びNECとFreeBSDを使用しています。&lt;br /&gt;
また、どこへでも持ち運べるThinkPad(Artix)というノートパソコンも用いています。&lt;br /&gt;
FreeBSDでPeerTubeをインストールし、URLロリはOpenBSDで行い、さまざまな静的なホームページはOpenBSDで実行しています。&lt;br /&gt;
インターネット接続サービスは何でも良いですが、高速光回線インターネット接続が推奨されます。&lt;/p&gt;
&lt;h2 id=&#34;wireguard&#34;&gt;WireGuardのインストール&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OpenBSD&lt;/th&gt;
&lt;th&gt;FreeBSD&lt;/th&gt;
&lt;th&gt;Artix (runitの場合)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;doas pkg_add wireguard-tools&lt;/td&gt;
&lt;td&gt;sudo pkg install wireguard-tools&lt;/td&gt;
&lt;td&gt;sudo pacman -S wireguard-tools wireguard-runit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Artixの場合、インストール後に再起動が必要な場合があります。&lt;br /&gt;
インストールしたlinux-kernelのバージョンが現在実行中のバージョンと異なると、WireGuardが起動出来なくなります。&lt;/p&gt;
&lt;h2 id=&#34;wireguard-1&#34;&gt;WireGuardの設定&lt;/h2&gt;
&lt;h3 id=&#34;vps&#34;&gt;VPS側&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;doas su
mkdir /etc/wireguard
chmod &lt;span style=&#34;color:#666&#34;&gt;600&lt;/span&gt; /etc/wireguard
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /etc/wireguard
wg genkey | tee private.key | wg pubkey &amp;gt; public.key
nvim wg0.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;[Interface]
Address = 192.168.10.1/24
PrivateKey = (VPSのprivate.keyの内容)
ListenPort = 51820
[Peer]
PublicKey = (ThinkPadのpublic.keyの内容)
PreSharedKey = (ThinkPadのpreshared.keyの内容)
AllowedIPs = 192.168.10.100/32
PersistentKeepalive = 25
[Peer]
PublicKey = (ThinkCentreのpublic.keyの内容)
PreSharedKey = (ThinkCentreのpreshared.keyの内容)
AllowedIPs = 192.168.10.101/32
PersistentKeepalive = 25
[Peer]
PublicKey = (NECのpublic.keyの内容)
PreSharedKey = (NECのpreshared.keyの内容)
AllowedIPs = 192.168.10.102/32
PersistentKeepalive = 25
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;nvim /etc/pf.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;set skip on lo
exsrv1 = (VPSのIPアドレス)
insrv1 = 192.168.10.101
insrv2 = 192.168.10.102
insrv3 = 192.168.10.103
block return
pass
pass in on wg0
pass in inet proto udp from any to any port 51820
# PeerTube
pass in inet proto udp from any to $insrv2 port 9000
pass in on egress proto tcp from any to $insrv2 port {1935, 1936} rdr-to $insrv2
# URLロリ
pass in inet proto udp from any to $insrv1 port 9910
# Gemini
pass in on egress proto tcp from any to $insrv3 port { 1965 } rdr-to $insrv3
# HTML
pass out on egress inet from (wg0:network) nat-to (vio0:0)
# SSHはWireGuardネットワーク内のみ許可する
pass in on wg0 proto tcp from 192.168.10.0/24 to any port 22
block in on egress proto tcp from any to any port 22
...
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;pfctl -f /etc/pf.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最高レベルのセキュリティを保つ為に:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;nvim /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;...
AllowUsers (貴方のユーザー名)@192.168.10.0/24
PermitRootLogin no
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
...
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f&#34;&gt;exit&lt;/span&gt;
ssh-keygen -t ed25519
&lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;最後までそのままEnterキーを押して&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;
cat ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;出力内容をコピーし、各サーバーとノートパソコンの「~/.ssh/authorized_keys」ファイルに貼り付けて下さい。&lt;br /&gt;
次に、上記のステップを各サーバー及びノートパソコンで実行し、その結果をVPSの「/.ssh/authorized_keys」ファイルに貼り付けて下さい。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;doas rcctl restart sshd
wg-quick up wg0
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;heading-1&#34;&gt;自宅サーバーとノートパソコンの設定&lt;/h3&gt;
&lt;p&gt;各デバイスの設定は基本的に同じです。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;doas su
mkdir /etc/wireguard
chmod &lt;span style=&#34;color:#666&#34;&gt;600&lt;/span&gt; /etc/wireguard
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /etc/wireguard
wg genkey | tee private.key | wg pubkey &amp;gt; public.key
wg genpsk &amp;gt; preshared.key
nvim wg0.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;[Interface]
PrivateKey = (現在のデバイスのprivate.keyの内容)
Address = 192.168.10.10x/24
[Peer]
PublicKey = (VPSのpublic.keyの内容)
PreSharedKey = (現在のデバイスのpreshared.keyの内容)
Endpoint = (VPSの公開IPアドレス):51820
AllowedIPs = 192.168.10.0/24
PersistentKeepalive = 25
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Address部分の「x」は、各サーバーで設定した通りです。&lt;br /&gt;
この記事では、Artix0、OpenBSD1、FreeBSD2となります。&lt;/p&gt;
&lt;h4 id=&#34;openbsd&#34;&gt;OpenBSDサーバー&lt;/h4&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt;
wget https://lab.abiscuola.org/gmnxd/tarball/v1.2.0/gmnxd-v1.2.0.tar.gz
tar zxfv gmnxd-v1.2.0.tar.gz
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; gmnxd-v1.2.0/src
make
make install
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt;
useradd -g &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;=uid&amp;#39;&lt;/span&gt; -L daemon -s /sbin/nologin -c &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;Gmnxd user&amp;#39;&lt;/span&gt; -d /var/gemini _gmnxd
chown -R _gmnxd:_gmnxd /var/gemini
nvim /etc/inetd.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;0.0.0.0:11965 stream tcp nowait _gmnxd /usr/local/libexec/gmnxd gmnxd
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;rcctl &lt;span style=&#34;color:#a2f&#34;&gt;enable&lt;/span&gt; inetd
rcctl start inetd
nvim /etc/pf.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;set skip on lo
block return
pass
# HTTP
pass in inet proto tcp from any to (self) port {80, 443}
# URLロリ
pass in inet proto tcp from any to (self) port 9910
# Gemini
pass in inet proto tcp from any to (self) port 11965
...
anchor &amp;#34;relayd/*&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;pfctl -f /etc/pf.conf
wg-quick up wg0
mkdir -p /var/www/htdocs/&lt;span style=&#34;color:#666&#34;&gt;{&lt;/span&gt;076,minmi&lt;span style=&#34;color:#666&#34;&gt;}&lt;/span&gt;.moe/www
mkdir -p /var/gemini/076.moe
&lt;span style=&#34;color:#a2f&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;わーい&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /var/www/htdocs/&lt;span style=&#34;color:#666&#34;&gt;{&lt;/span&gt;076,minmi&lt;span style=&#34;color:#666&#34;&gt;}&lt;/span&gt;.moe/www/index.html
&lt;span style=&#34;color:#a2f&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;わーい&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /var/gemini/076.moe/index.gmi
nvim /etc/httpd.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;eth_addr=192.168.0.103 # 自宅のルーターで設定した固定IPアドレス
wg0_addr=192.168.10.103 # WireGuardで設定したIPアドレス
## 076.moe
server &amp;#34;076.moe&amp;#34; {
listen on $wg0_addr port 8080
root &amp;#34;/htdocs/076.moe/www&amp;#34;
directory index &amp;#34;index.html&amp;#34;
location &amp;#34;/repo/*&amp;#34; {
directory auto index
}
location &amp;#34;/.well-known/acme-challenge/*&amp;#34; {
root &amp;#34;/acme&amp;#34;
request strip 2
}
}
server &amp;#34;l3nbzyxgrkmd46nacmzf2sy6tpjrwh4iv3pgacbrbk72wcgxq5a.b32.i2p&amp;#34; {
listen on $eth_addr port 8450
root &amp;#34;/htdocs/076.moe/www&amp;#34;
directory index &amp;#34;index.html&amp;#34;
location &amp;#34;/repo/*&amp;#34; {
directory auto index
}
}
server &amp;#34;7dt6irsmfvbrtgn4nuah56kky6mvr472fbwwaltuxpf26qdqkdhfvnqd.onion&amp;#34; {
listen on $eth_addr port 8500
root &amp;#34;/htdocs/076.moe/www&amp;#34;
directory index &amp;#34;index.html&amp;#34;
location &amp;#34;/repo/*&amp;#34; {
directory auto index
}
}
## minmi.moe
server &amp;#34;minmi.moe&amp;#34; {
listen on $wg0_addr port 8087
root &amp;#34;/htdocs/minmi.moe/www&amp;#34;
directory index &amp;#34;index.html&amp;#34;
location &amp;#34;/.well-known/acme-challenge/*&amp;#34; {
root &amp;#34;/acme&amp;#34;
request strip 2
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;mkdir -p /var/www/htdocs/urlo.li
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /var/www/htdocs/urlo.li
git clone https://gitler.moe/suwako/urloli.git .
nvim Makefile
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一部編集は必要となります。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;# Linux、Cruxの場合は必須。他のディストリビューションはどうでも良い
#PREFIX=/usr
# FreeBSDとOpenBSD
PREFIX=/usr/local
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;rcctl &lt;span style=&#34;color:#a2f&#34;&gt;enable&lt;/span&gt; httpd
rcctl start httpd
make
make install
nvim /etc/urloli/config.json
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;{
&amp;#34;domain&amp;#34;: &amp;#34;https://(ドメイン名)&amp;#34;,
&amp;#34;webpath&amp;#34;: &amp;#34;/var/www/htdocs/urlo.li&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;freebsd&#34;&gt;FreeBSDサーバー&lt;/h4&gt;
&lt;p&gt;公式ガイドに従って、nginxとcertbotをインストールが必要とされていますが、今回の場合は不要です。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;wg-quick up wg0
pkg install -y sudo bash wget git python pkgconf postgresql13-server postgresql13-contrib redis openssl node npm yarn ffmpeg unzip
visudo
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;%wheel ALL=(ALL) ALL
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;sysrc &lt;span style=&#34;color:#b8860b&#34;&gt;postgresql_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
sysrc &lt;span style=&#34;color:#b8860b&#34;&gt;redis_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
sysrc &lt;span style=&#34;color:#b8860b&#34;&gt;nginx_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
sudo pw useradd -n peertube -d /var/www/peertube -s /usr/local/bin/bash -m
sudo passwd peertube
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /var/www/peertube
sudo -u postgres createuser -P peertube
sudo -u postgres createdb -O peertube -E UTF8 -T template0 peertube_prod
sudo -u postgres psql -c &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;CREATE EXTENSION pg_trgm;&amp;#34;&lt;/span&gt; peertube_prod
sudo -u postgres psql -c &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;CREATE EXTENSION unaccent;&amp;#34;&lt;/span&gt; peertube_prod
&lt;span style=&#34;color:#b8860b&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 4&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Latest Peertube version is &lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$VERSION&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /var/www/peertube
sudo -u peertube mkdir config storage versions
sudo -u peertube chmod &lt;span style=&#34;color:#666&#34;&gt;750&lt;/span&gt; config/
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /var/www/peertube/versions
sudo -u peertube wget -q &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;https://github.com/Chocobozzz/PeerTube/releases/download/&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;/peertube-&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;.zip&amp;#34;&lt;/span&gt;
sudo -u peertube unzip -q peertube-&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}&lt;/span&gt;.zip &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo -u peertube rm peertube-&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}&lt;/span&gt;.zip
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /var/www/peertube
sudo -u peertube ln -s versions/peertube-&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}&lt;/span&gt; ./peertube-latest
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; ./peertube-latest &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo -H -u peertube yarn install --production --pure-lockfile
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /var/www/peertube
sudo -u peertube cp peertube-latest/config/default.yaml config/default.yaml
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /var/www/peertube
sudo -u peertube cp peertube-latest/config/production.yaml.example config/production.yaml
nvim config/production.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;listen:
hostname: &amp;#39;0.0.0.0&amp;#39;
port: 9000
webserver:
https: true
hostname: &amp;#39;(ドメイン名)&amp;#39;
port: 443
...
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;sudo install -m &lt;span style=&#34;color:#666&#34;&gt;0555&lt;/span&gt; /var/www/peertube/peertube-latest/support/freebsd/peertube /usr/local/etc/rc.d/
sudo sysrc &lt;span style=&#34;color:#b8860b&#34;&gt;peertube_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
sudo service peertube start
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;artix&#34;&gt;Artixノートパソコン&lt;/h4&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;wg-quick up wg0
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;vps-1&#34;&gt;再度、VPSの設定&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;nvim /etc/acme-client.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;authority letsencrypt {
api url &amp;#34;https://acme-v02.api.letsencrypt.org/directory&amp;#34;
account key &amp;#34;/etc/acme/letsencrypt-privkey.pem&amp;#34;
}
domain 076.moe {
alternative names { www.076.moe }
domain key &amp;#34;/etc/ssl/private/076.moe.key&amp;#34;
domain full chain certificate &amp;#34;/etc/ssl/076.moe.crt&amp;#34;
sign with letsencrypt
}
domain video.076.moe {
domain key &amp;#34;/etc/ssl/private/video.076.moe.key&amp;#34;
domain full chain certificate &amp;#34;/etc/ssl/video.076.moe.crt&amp;#34;
sign with letsencrypt
}
domain urlo.li {
domain key &amp;#34;/etc/ssl/private/urlo.li.key&amp;#34;
domain full chain certificate &amp;#34;/etc/ssl/urlo.li.crt&amp;#34;
sign with letsencrypt
}
domain minmi.moe {
domain key &amp;#34;/etc/ssl/private/minmi.moe.key&amp;#34;
domain full chain certificate &amp;#34;/etc/ssl/minmi.moe.crt&amp;#34;
sign with letsencrypt
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;nvim /etc/relayd.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;relayd_addr=&amp;#34;0.0.0.0&amp;#34;
insrv1_addr=&amp;#34;192.168.10.101&amp;#34;
insrv2_addr=&amp;#34;192.168.10.102&amp;#34;
table &amp;lt;home&amp;gt; { $insrv1_addr }
table &amp;lt;urloli&amp;gt; { $insrv1_addr }
table &amp;lt;minmi&amp;gt; { $insrv1_addr }
table &amp;lt;video&amp;gt; { $insrv2_addr }
http protocol reverse {
tcp { nodelay, sack }
tls ciphers &amp;#34;TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256&amp;#34;
tls keypair &amp;#34;076.moe&amp;#34;
tls keypair &amp;#34;video.076.moe&amp;#34;
tls keypair &amp;#34;urlo.li&amp;#34;
tls keypair &amp;#34;minmi.moe&amp;#34;
match request header append &amp;#34;X-Forwarded-For&amp;#34; value &amp;#34;$REMOTE_ADDR&amp;#34;
match request header append &amp;#34;X-Forwarded-Port&amp;#34; value &amp;#34;$REMOTE_PORT&amp;#34;
match response header set &amp;#34;Referrer-Policy&amp;#34; value &amp;#34;same-origin&amp;#34;
match response header set &amp;#34;X-Frame-Options&amp;#34; value &amp;#34;deny&amp;#34;
match response header set &amp;#34;X-XSS-Protection&amp;#34; value &amp;#34;1; mode=block&amp;#34;
match response header set &amp;#34;X-Content-Type-Options&amp;#34; value &amp;#34;nosniff&amp;#34;
match response header set &amp;#34;Strict-Transport-Security&amp;#34; value &amp;#34;max-age=31536000; includeSubDomains; preload&amp;#34;
match response header set &amp;#34;Cache-Control&amp;#34; value &amp;#34;max-age=86400&amp;#34;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;076.moe&amp;#34; forward to &amp;lt;home&amp;gt;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;www.076.moe&amp;#34; forward to &amp;lt;home&amp;gt;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;video.076.moe&amp;#34; forward to &amp;lt;video&amp;gt;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;urlo.li&amp;#34; forward to &amp;lt;urloli&amp;gt;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;minmi.moe&amp;#34; forward to &amp;lt;minmi&amp;gt;
return error
pass
}
http protocol reverse80 {
match request header append &amp;#34;X-Forwarded-For&amp;#34; value &amp;#34;$REMOTE_ADDR&amp;#34;
match request header append &amp;#34;X-Forwarded-Port&amp;#34; value &amp;#34;$REMOTE_PORT&amp;#34;
match response header set &amp;#34;Referrer-Policy&amp;#34; value &amp;#34;same-origin&amp;#34;
match response header set &amp;#34;X-Frame-Options&amp;#34; value &amp;#34;deny&amp;#34;
match response header set &amp;#34;X-XSS-Protection&amp;#34; value &amp;#34;1; mode=block&amp;#34;
match response header set &amp;#34;X-Content-Type-Options&amp;#34; value &amp;#34;nosniff&amp;#34;
match response header set &amp;#34;Strict-Transport-Security&amp;#34; value &amp;#34;max-age=31536000; includeSubDomains; preload&amp;#34;
match response header set &amp;#34;Cache-Control&amp;#34; value &amp;#34;max-age=86400&amp;#34;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;076.moe&amp;#34; forward to &amp;lt;home&amp;gt;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;www.076.moe&amp;#34; forward to &amp;lt;home&amp;gt;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;video.076.moe&amp;#34; forward to &amp;lt;video&amp;gt;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;urlo.li&amp;#34; forward to &amp;lt;urloli&amp;gt;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;minmi.moe&amp;#34; forward to &amp;lt;minmi&amp;gt;
return error
pass
}
protocol gemini {
tcp { nodelay, sack }
tls ciphers &amp;#34;TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256&amp;#34;
tls keypair &amp;#34;076.moe&amp;#34;
}
relay www_tls {
listen on $relayd_addr port 443 tls
protocol reverse
forward to &amp;lt;video&amp;gt; port 9000 check tcp
forward to &amp;lt;home&amp;gt; port 8080 check tcp
forward to &amp;lt;urloli&amp;gt; port 9910 check tcp
forward to &amp;lt;minmi&amp;gt; port 8087 check tcp
}
relay www_http {
listen on $relayd_addr port 80
protocol reverse80
forward to &amp;lt;video&amp;gt; port 9000 check tcp
forward to &amp;lt;home&amp;gt; port 8080 check tcp
forward to &amp;lt;urloli&amp;gt; port 9910 check tcp
forward to &amp;lt;minmi&amp;gt; port 8087 check tcp
}
relay gemini {
listen on $relayd_addr port 1965 tls
protocol gemini
forward to &amp;lt;home&amp;gt; check tcp port 11965
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;rcctl &lt;span style=&#34;color:#a2f&#34;&gt;enable&lt;/span&gt; relayd
rcctl start relayd
acme-client -v 076.moe
acme-client -v video.076.moe
acme-client -v urlo.li
acme-client -v minmi.moe
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/kanrinya.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;ねぇー!簡単でしょー!&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/hozonsite-100.gmi</id>
<author><name>凛</name></author>
@ -189,89 +637,5 @@ Yahooでスパイウェアが多すぎるため、CLI用のフロントエンド
</content>
</entry>
<entry>
<id>blog/neko-sampo.gmi</id>
<author><name>凛</name></author>
<title type="html">【ペット】猫との散歩をトレーニング方法</title>
<published>2023-06-18T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="ペット"></category>
<category term="猫"></category>
<link href="gemini://technicalsuwako.moe/blog/neko-sampo.gmi" rel="alternate"></link>
<content type="html">
&lt;p&gt;本ブログはテクノロジー専門ですが、青猫ちゃんと一緒に散歩する様子に興味を示す方が多くいらっしゃいます。&lt;br /&gt;
今回は愛猫ちゃんと散歩する方法についてご紹介します。&lt;br /&gt;
青猫ちゃんはあたしの愛猫ちゃんです。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;猫との散歩のメリット&lt;/h2&gt;
&lt;p&gt;猫との散歩には多くのメリットがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;家で猫がおとなしくなる&lt;/li&gt;
&lt;li&gt;猫が知らない人に慣れやすくなる&lt;/li&gt;
&lt;li&gt;散歩しながら新たな友達を作りやすくなる&lt;/li&gt;
&lt;li&gt;猫とより深く絆を深める&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;トイレとトラブルの心配なし&lt;/h2&gt;
&lt;p&gt;猫は犬とは異なり、数時間外に出ていても、家に帰るまでトイレやトラブルはしません。&lt;/p&gt;
&lt;h2 id=&#34;heading-2&#34;&gt;必要なもの&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2種類のトリーツ(おやつ):ペットが好むものをオススメします。&lt;/li&gt;
&lt;li&gt;脱げないハーネス&lt;/li&gt;
&lt;li&gt;リード&lt;/li&gt;
&lt;li&gt;ペットキャリアーバッグ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;heading-3&#34;&gt;トリーツ&lt;/h2&gt;
&lt;p&gt;目的は、ハーネスの装着と散歩に慣れる事です。&lt;br /&gt;
その為、評価の高いトリーツをあげる事をおすすめします。&lt;br /&gt;
同じ種類でも大丈夫ですが、2種類あった方がより効果的です。&lt;br /&gt;
青猫ちゃんの場合はこちら:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/aoneko0.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;左はハーネスを装着後にあげます。&lt;br /&gt;
右は散歩から帰ったらあげます。&lt;/p&gt;
&lt;h2 id=&#34;heading-4&#34;&gt;脱けないハーネス&lt;/h2&gt;
&lt;p&gt;サイズ選びは非常に重要です。&lt;br /&gt;
小さすぎると動きにくくなりますし、大きすぎると脱げやすくなります。&lt;br /&gt;
ハーネスを装着したら、2本指が入る程度がちょうどよいです。&lt;/p&gt;
&lt;h2 id=&#34;heading-5&#34;&gt;リード&lt;/h2&gt;
&lt;p&gt;長めのリードをおすすめします。&lt;br /&gt;
10メートル以上が良いと思います。&lt;br /&gt;
その理由は後ほど説明します。&lt;/p&gt;
&lt;h2 id=&#34;heading-6&#34;&gt;ペットキャリアーバッグ&lt;/h2&gt;
&lt;p&gt;必須ではありませんが、キャリアーバッグがあればドアダッシュを覚える事はありません。&lt;br /&gt;
あたしのやり方は以下の通りです:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ハーネスを装着する&lt;/li&gt;
&lt;li&gt;第1のトリーツをあげる&lt;/li&gt;
&lt;li&gt;キャリアーバッグに入れる&lt;/li&gt;
&lt;li&gt;公園に連れて行く&lt;/li&gt;
&lt;li&gt;キャリアーバッグから出す&lt;/li&gt;
&lt;li&gt;リードを装着する&lt;/li&gt;
&lt;li&gt;散歩を開始する&lt;/li&gt;
&lt;li&gt;散歩が終わったら、リードを外し、バッグに戻す&lt;/li&gt;
&lt;li&gt;自宅に帰ったら、バッグから出し、ハーネスを外し、第2のトリーツをあげる&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;heading-7&#34;&gt;猫≠犬&lt;/h2&gt;
&lt;p&gt;猫は犬とは異なる為、散歩の方法も異なります。&lt;br /&gt;
犬は気にせずずっと歩きますが、猫は常に周囲を注意深く観察します。&lt;br /&gt;
猫の場合、歩く→止まる→観察→歩く→止まる→観察というパターンが一般的です。&lt;/p&gt;
&lt;h2 id=&#34;heading-8&#34;&gt;青猫ちゃんとの散歩の写真&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/aoneko1.jpg&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;https://ass.technicalsuwako.moe/aoneko2.jpg&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;https://ass.technicalsuwako.moe/aoneko3.jpg&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;https://ass.technicalsuwako.moe/aoneko4.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
</feed>

ファイルの表示

@ -2,6 +2,7 @@
# 記事一覧
=> /blog/digital-autonomy-with-wireguard-home-host.gmi 2023年07月03日 【デジタル自主】自宅サーバーからWireGuardを使ったホスティング方法
=> /blog/hozonsite-100.gmi 2023年06月23日 【076】保存サイト 1.0.0登場
=> /blog/norikae-101.gmi 2023年06月23日 【076】乗換 1.0.1登場
=> /blog/rofi-youtube-101.gmi 2023年06月23日 【】rofi-youtube 1.0.1登場

ファイルの表示

@ -0,0 +1,519 @@
=> /blog.gmi ブログ一覧へ
#【デジタル自主】自宅サーバーからWireGuardを使ったホスティング方法
投稿日2023-07-03
WireGuardは非常に便利ですね。
自宅からウェブサイトをホスティングしたり、どこからでも自宅のサーバーやパソコンにアクセスしたりといった事が可能です。
今回はウェブホスティングの方法についてお伝えします。
## 材料
食べ物じゃないけど(ジョーダンダヨー)、必要な物は下記で御座います。
* 好みのVPSホスティング会社から最も安いVPS(日本のOpenBSDサーバーはオススメ、ConoHaまたはVultrは良い)
* 自宅にあるサーバー(1台でも複数台でも可)
* 高速光回線インターネット接続
静的IPは不要です。
動的IPでも問題がありません。
OS等は何でも良いですが、この記事ではVPSはConoHaのOpenBSDで、自宅サーバーは2台のThinkCentreとOpenBSD、及びNECとFreeBSDを使用しています。
また、どこへでも持ち運べるThinkPad(Artix)というノートパソコンも用いています。
FreeBSDでPeerTubeをインストールし、URLロリはOpenBSDで行い、さまざまな静的なホームページはOpenBSDで実行しています。
インターネット接続サービスは何でも良いですが、高速光回線インターネット接続が推奨されます。
## WireGuardのインストール
| OpenBSD | FreeBSD | Artix (runitの場合) |
| ---------------------------- | -------------------------------- | ---------------------------------------------- |
| doas pkg_add wireguard-tools | sudo pkg install wireguard-tools | sudo pacman -S wireguard-tools wireguard-runit |
Artixの場合、インストール後に再起動が必要な場合があります。
インストールしたlinux-kernelのバージョンが現在実行中のバージョンと異なると、WireGuardが起動出来なくなります。
## WireGuardの設定
### VPS側
```sh
doas su
mkdir /etc/wireguard
chmod 600 /etc/wireguard
cd /etc/wireguard
wg genkey | tee private.key | wg pubkey > public.key
nvim wg0.conf
```
```
[Interface]
Address = 192.168.10.1/24
PrivateKey = (VPSのprivate.keyの内容)
ListenPort = 51820
[Peer]
PublicKey = (ThinkPadのpublic.keyの内容)
PreSharedKey = (ThinkPadのpreshared.keyの内容)
AllowedIPs = 192.168.10.100/32
PersistentKeepalive = 25
[Peer]
PublicKey = (ThinkCentreのpublic.keyの内容)
PreSharedKey = (ThinkCentreのpreshared.keyの内容)
AllowedIPs = 192.168.10.101/32
PersistentKeepalive = 25
[Peer]
PublicKey = (NECのpublic.keyの内容)
PreSharedKey = (NECのpreshared.keyの内容)
AllowedIPs = 192.168.10.102/32
PersistentKeepalive = 25
```
```sh
nvim /etc/pf.conf
```
```
set skip on lo
exsrv1 = (VPSのIPアドレス)
insrv1 = 192.168.10.101
insrv2 = 192.168.10.102
insrv3 = 192.168.10.103
block return
pass
pass in on wg0
pass in inet proto udp from any to any port 51820
# PeerTube
pass in inet proto udp from any to $insrv2 port 9000
pass in on egress proto tcp from any to $insrv2 port {1935, 1936} rdr-to $insrv2
# URLロリ
pass in inet proto udp from any to $insrv1 port 9910
# Gemini
pass in on egress proto tcp from any to $insrv3 port { 1965 } rdr-to $insrv3
# HTML
pass out on egress inet from (wg0:network) nat-to (vio0:0)
# SSHはWireGuardネットワーク内のみ許可する
pass in on wg0 proto tcp from 192.168.10.0/24 to any port 22
block in on egress proto tcp from any to any port 22
...
```
```sh
pfctl -f /etc/pf.conf
```
最高レベルのセキュリティを保つ為に:
```sh
nvim /etc/ssh/sshd_config
```
```
...
AllowUsers (貴方のユーザー名)@192.168.10.0/24
PermitRootLogin no
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
...
```
```sh
exit
ssh-keygen -t ed25519
(最後までそのままEnterキーを押して)
cat ~/.ssh/id_ed25519.pub
```
出力内容をコピーし、各サーバーとノートパソコンの「~/.ssh/authorized_keys」ファイルに貼り付けて下さい。
次に、上記のステップを各サーバー及びノートパソコンで実行し、その結果をVPSの「/.ssh/authorized_keys」ファイルに貼り付けて下さい。
```sh
doas rcctl restart sshd
wg-quick up wg0
```
### 自宅サーバーとノートパソコンの設定
各デバイスの設定は基本的に同じです。
```sh
doas su
mkdir /etc/wireguard
chmod 600 /etc/wireguard
cd /etc/wireguard
wg genkey | tee private.key | wg pubkey > public.key
wg genpsk > preshared.key
nvim wg0.conf
```
```
[Interface]
PrivateKey = (現在のデバイスのprivate.keyの内容)
Address = 192.168.10.10x/24
[Peer]
PublicKey = (VPSのpublic.keyの内容)
PreSharedKey = (現在のデバイスのpreshared.keyの内容)
Endpoint = (VPSの公開IPアドレス):51820
AllowedIPs = 192.168.10.0/24
PersistentKeepalive = 25
```
Address部分の「x」は、各サーバーで設定した通りです。
この記事では、Artix0、OpenBSD1、FreeBSD2となります。
OpenBSDサーバー
```sh
cd
wget https://lab.abiscuola.org/gmnxd/tarball/v1.2.0/gmnxd-v1.2.0.tar.gz
tar zxfv gmnxd-v1.2.0.tar.gz
cd gmnxd-v1.2.0/src
make
make install
cd
useradd -g '=uid' -L daemon -s /sbin/nologin -c 'Gmnxd user' -d /var/gemini _gmnxd
chown -R _gmnxd:_gmnxd /var/gemini
nvim /etc/inetd.conf
```
0.0.0.0:11965 stream tcp nowait _gmnxd /usr/local/libexec/gmnxd gmnxd
```
```sh
rcctl enable inetd
rcctl start inetd
nvim /etc/pf.conf
```
```
set skip on lo
block return
pass
# HTTP
pass in inet proto tcp from any to (self) port {80, 443}
# URLロリ
pass in inet proto tcp from any to (self) port 9910
# Gemini
pass in inet proto tcp from any to (self) port 11965
...
anchor "relayd/*"
```
```sh
pfctl -f /etc/pf.conf
wg-quick up wg0
mkdir -p /var/www/htdocs/{076,minmi}.moe/www
mkdir -p /var/gemini/076.moe
echo "わーい" >> /var/www/htdocs/{076,minmi}.moe/www/index.html
echo "わーい" >> /var/gemini/076.moe/index.gmi
nvim /etc/httpd.conf
```
```
eth_addr=192.168.0.103 # 自宅のルーターで設定した固定IPアドレス
wg0_addr=192.168.10.103 # WireGuardで設定したIPアドレス
## 076.moe
server "076.moe" {
listen on $wg0_addr port 8080
root "/htdocs/076.moe/www"
directory index "index.html"
location "/repo/*" {
directory auto index
}
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
}
server "l3nbzyxgrkmd46nacmzf2sy6tpjrwh4iv3pgacbrbk72wcgxq5a.b32.i2p" {
listen on $eth_addr port 8450
root "/htdocs/076.moe/www"
directory index "index.html"
location "/repo/*" {
directory auto index
}
}
server "7dt6irsmfvbrtgn4nuah56kky6mvr472fbwwaltuxpf26qdqkdhfvnqd.onion" {
listen on $eth_addr port 8500
root "/htdocs/076.moe/www"
directory index "index.html"
location "/repo/*" {
directory auto index
}
}
## minmi.moe
server "minmi.moe" {
listen on $wg0_addr port 8087
root "/htdocs/minmi.moe/www"
directory index "index.html"
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
}
```
```sh
mkdir -p /var/www/htdocs/urlo.li
cd /var/www/htdocs/urlo.li
git clone https://gitler.moe/suwako/urloli.git .
nvim Makefile
```
一部編集は必要となります。
```
# Linux、Cruxの場合は必須。他のディストリビューションはどうでも良い
#PREFIX=/usr
# FreeBSDとOpenBSD
PREFIX=/usr/local
```
```sh
rcctl enable httpd
rcctl start httpd
make
make install
nvim /etc/urloli/config.json
```
```
{
"domain": "https://(ドメイン名)",
"webpath": "/var/www/htdocs/urlo.li"
}
```
FreeBSDサーバー
公式ガイドに従って、nginxとcertbotをインストールが必要とされていますが、今回の場合は不要です。
```sh
wg-quick up wg0
pkg install -y sudo bash wget git python pkgconf postgresql13-server postgresql13-contrib redis openssl node npm yarn ffmpeg unzip
visudo
```
```
%wheel ALL=(ALL) ALL
```
```sh
sysrc postgresql_enable="YES"
sysrc redis_enable="YES"
sysrc nginx_enable="YES"
sudo pw useradd -n peertube -d /var/www/peertube -s /usr/local/bin/bash -m
sudo passwd peertube
cd /var/www/peertube
sudo -u postgres createuser -P peertube
sudo -u postgres createdb -O peertube -E UTF8 -T template0 peertube_prod
sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" peertube_prod
sudo -u postgres psql -c "CREATE EXTENSION unaccent;" peertube_prod
VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest Peertube version is $VERSION"
cd /var/www/peertube
sudo -u peertube mkdir config storage versions
sudo -u peertube chmod 750 config/
cd /var/www/peertube/versions
sudo -u peertube wget -q "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.zip"
sudo -u peertube unzip -q peertube-${VERSION}.zip && sudo -u peertube rm peertube-${VERSION}.zip
cd /var/www/peertube
sudo -u peertube ln -s versions/peertube-${VERSION} ./peertube-latest
cd ./peertube-latest && sudo -H -u peertube yarn install --production --pure-lockfile
cd /var/www/peertube
sudo -u peertube cp peertube-latest/config/default.yaml config/default.yaml
cd /var/www/peertube
sudo -u peertube cp peertube-latest/config/production.yaml.example config/production.yaml
nvim config/production.yaml
```
```
listen:
hostname: '0.0.0.0'
port: 9000
webserver:
https: true
hostname: '(ドメイン名)'
port: 443
...
```
```sh
sudo install -m 0555 /var/www/peertube/peertube-latest/support/freebsd/peertube /usr/local/etc/rc.d/
sudo sysrc peertube_enable="YES"
sudo service peertube start
```
Artixノートパソコン
```sh
wg-quick up wg0
```
### 再度、VPSの設定
```sh
nvim /etc/acme-client.conf
```
```
authority letsencrypt {
api url "https://acme-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-privkey.pem"
}
domain 076.moe {
alternative names { www.076.moe }
domain key "/etc/ssl/private/076.moe.key"
domain full chain certificate "/etc/ssl/076.moe.crt"
sign with letsencrypt
}
domain video.076.moe {
domain key "/etc/ssl/private/video.076.moe.key"
domain full chain certificate "/etc/ssl/video.076.moe.crt"
sign with letsencrypt
}
domain urlo.li {
domain key "/etc/ssl/private/urlo.li.key"
domain full chain certificate "/etc/ssl/urlo.li.crt"
sign with letsencrypt
}
domain minmi.moe {
domain key "/etc/ssl/private/minmi.moe.key"
domain full chain certificate "/etc/ssl/minmi.moe.crt"
sign with letsencrypt
}
```
```sh
nvim /etc/relayd.conf
```
```
relayd_addr="0.0.0.0"
insrv1_addr="192.168.10.101"
insrv2_addr="192.168.10.102"
table <home> { $insrv1_addr }
table <urloli> { $insrv1_addr }
table <minmi> { $insrv1_addr }
table <video> { $insrv2_addr }
http protocol reverse {
tcp { nodelay, sack }
tls ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"
tls keypair "076.moe"
tls keypair "video.076.moe"
tls keypair "urlo.li"
tls keypair "minmi.moe"
match request header append "X-Forwarded-For" value "$REMOTE_ADDR"
match request header append "X-Forwarded-Port" value "$REMOTE_PORT"
match response header set "Referrer-Policy" value "same-origin"
match response header set "X-Frame-Options" value "deny"
match response header set "X-XSS-Protection" value "1; mode=block"
match response header set "X-Content-Type-Options" value "nosniff"
match response header set "Strict-Transport-Security" value "max-age=31536000; includeSubDomains; preload"
match response header set "Cache-Control" value "max-age=86400"
pass request quick header "Host" value "076.moe" forward to <home>
pass request quick header "Host" value "www.076.moe" forward to <home>
pass request quick header "Host" value "video.076.moe" forward to <video>
pass request quick header "Host" value "urlo.li" forward to <urloli>
pass request quick header "Host" value "minmi.moe" forward to <minmi>
return error
pass
}
http protocol reverse80 {
match request header append "X-Forwarded-For" value "$REMOTE_ADDR"
match request header append "X-Forwarded-Port" value "$REMOTE_PORT"
match response header set "Referrer-Policy" value "same-origin"
match response header set "X-Frame-Options" value "deny"
match response header set "X-XSS-Protection" value "1; mode=block"
match response header set "X-Content-Type-Options" value "nosniff"
match response header set "Strict-Transport-Security" value "max-age=31536000; includeSubDomains; preload"
match response header set "Cache-Control" value "max-age=86400"
pass request quick header "Host" value "076.moe" forward to <home>
pass request quick header "Host" value "www.076.moe" forward to <home>
pass request quick header "Host" value "video.076.moe" forward to <video>
pass request quick header "Host" value "urlo.li" forward to <urloli>
pass request quick header "Host" value "minmi.moe" forward to <minmi>
return error
pass
}
protocol gemini {
tcp { nodelay, sack }
tls ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"
tls keypair "076.moe"
}
relay www_tls {
listen on $relayd_addr port 443 tls
protocol reverse
forward to <video> port 9000 check tcp
forward to <home> port 8080 check tcp
forward to <urloli> port 9910 check tcp
forward to <minmi> port 8087 check tcp
}
relay www_http {
listen on $relayd_addr port 80
protocol reverse80
forward to <video> port 9000 check tcp
forward to <home> port 8080 check tcp
forward to <urloli> port 9910 check tcp
forward to <minmi> port 8087 check tcp
}
relay gemini {
listen on $relayd_addr port 1965 tls
protocol gemini
forward to <home> check tcp port 11965
}
```
```sh
rcctl enable relayd
rcctl start relayd
acme-client -v 076.moe
acme-client -v video.076.moe
acme-client -v urlo.li
acme-client -v minmi.moe
```
=> /static/kanrinya.jpg
ねぇー!簡単でしょー!
以上

バイナリ
gemini/static/kanrinya.jpg ノーマルファイル

バイナリファイルは表示されません。

変更後

幅:  |  高さ:  |  サイズ: 523 KiB

ファイルの表示

@ -3,6 +3,7 @@
# avatar = gemini://076.moe/static/suwako.jpg
# description = テクニカル諏訪子様のtwtxtフィード
# link = ホームページ gemini://technicalsuwako.moe
2023-07-03T00:00:00Z09:00 【デジタル自主】自宅サーバーからWireGuardを使ったホスティング方法 - gemini://technicalsuwako.moe/blog/blog/digital-autonomy-with-wireguard-home-host.gmi
2023-06-23T19:20:00Z09:00 【076】保存サイト 1.0.0登場 - gemini://technicalsuwako.moe/blog/blog/hozonsite-100.gmi
2023-06-23T08:15:00Z09:00 【076】乗換 1.0.1登場 - gemini://technicalsuwako.moe/blog/blog/norikae-101.gmi
2023-06-23T08:00:00Z09:00 【】rofi-youtube 1.0.1登場 - gemini://technicalsuwako.moe/blog/blog/rofi-youtube-101.gmi

ファイルの表示

@ -0,0 +1,520 @@
title: 【デジタル自主】自宅サーバーからWireGuardを使ったホスティング方法
author: 凛
date: 2023-07-03
tags: ja,blog,デジタル自主,wireguard,linux,bsd,devuan,openbsd,freebsd
----
WireGuardは非常に便利ですね。\
自宅からウェブサイトをホスティングしたり、どこからでも自宅のサーバーやパソコンにアクセスしたりといった事が可能です。\
今回はウェブホスティングの方法についてお伝えします。
## 材料
食べ物じゃないけど(ジョーダンダヨー)、必要な物は下記で御座います。
* 好みのVPSホスティング会社から最も安いVPS(日本のOpenBSDサーバーはオススメ、ConoHaまたはVultrは良い)
* 自宅にあるサーバー(1台でも複数台でも可)
* 高速光回線インターネット接続
静的IPは不要です。\
動的IPでも問題がありません。
OS等は何でも良いですが、この記事ではVPSはConoHaのOpenBSDで、自宅サーバーは2台のThinkCentreとOpenBSD、及びNECとFreeBSDを使用しています。\
また、どこへでも持ち運べるThinkPad(Artix)というノートパソコンも用いています。\
FreeBSDでPeerTubeをインストールし、URLロリはOpenBSDで行い、さまざまな静的なホームページはOpenBSDで実行しています。\
インターネット接続サービスは何でも良いですが、高速光回線インターネット接続が推奨されます。
## WireGuardのインストール
| OpenBSD | FreeBSD | Artix (runitの場合) |
| ---------------------------- | -------------------------------- | ---------------------------------------------- |
| doas pkg_add wireguard-tools | sudo pkg install wireguard-tools | sudo pacman -S wireguard-tools wireguard-runit |
Artixの場合、インストール後に再起動が必要な場合があります。\
インストールしたlinux-kernelのバージョンが現在実行中のバージョンと異なると、WireGuardが起動出来なくなります。
## WireGuardの設定
### VPS側
```sh
doas su
mkdir /etc/wireguard
chmod 600 /etc/wireguard
cd /etc/wireguard
wg genkey | tee private.key | wg pubkey > public.key
nvim wg0.conf
```
```
[Interface]
Address = 192.168.10.1/24
PrivateKey = (VPSのprivate.keyの内容)
ListenPort = 51820
[Peer]
PublicKey = (ThinkPadのpublic.keyの内容)
PreSharedKey = (ThinkPadのpreshared.keyの内容)
AllowedIPs = 192.168.10.100/32
PersistentKeepalive = 25
[Peer]
PublicKey = (ThinkCentreのpublic.keyの内容)
PreSharedKey = (ThinkCentreのpreshared.keyの内容)
AllowedIPs = 192.168.10.101/32
PersistentKeepalive = 25
[Peer]
PublicKey = (NECのpublic.keyの内容)
PreSharedKey = (NECのpreshared.keyの内容)
AllowedIPs = 192.168.10.102/32
PersistentKeepalive = 25
```
```sh
nvim /etc/pf.conf
```
```
set skip on lo
exsrv1 = (VPSのIPアドレス)
insrv1 = 192.168.10.101
insrv2 = 192.168.10.102
insrv3 = 192.168.10.103
block return
pass
pass in on wg0
pass in inet proto udp from any to any port 51820
# PeerTube
pass in inet proto udp from any to $insrv2 port 9000
pass in on egress proto tcp from any to $insrv2 port {1935, 1936} rdr-to $insrv2
# URLロリ
pass in inet proto udp from any to $insrv1 port 9910
# Gemini
pass in on egress proto tcp from any to $insrv3 port { 1965 } rdr-to $insrv3
# HTML
pass out on egress inet from (wg0:network) nat-to (vio0:0)
# SSHはWireGuardネットワーク内のみ許可する
pass in on wg0 proto tcp from 192.168.10.0/24 to any port 22
block in on egress proto tcp from any to any port 22
...
```
```sh
pfctl -f /etc/pf.conf
```
最高レベルのセキュリティを保つ為に:
```sh
nvim /etc/ssh/sshd_config
```
```
...
AllowUsers (貴方のユーザー名)@192.168.10.0/24
PermitRootLogin no
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
...
```
```sh
exit
ssh-keygen -t ed25519
(最後までそのままEnterキーを押して)
cat ~/.ssh/id_ed25519.pub
```
出力内容をコピーし、各サーバーとノートパソコンの「~/.ssh/authorized_keys」ファイルに貼り付けて下さい。\
次に、上記のステップを各サーバー及びノートパソコンで実行し、その結果をVPSの「/.ssh/authorized_keys」ファイルに貼り付けて下さい。
```sh
doas rcctl restart sshd
wg-quick up wg0
```
### 自宅サーバーとノートパソコンの設定
各デバイスの設定は基本的に同じです。
```sh
doas su
mkdir /etc/wireguard
chmod 600 /etc/wireguard
cd /etc/wireguard
wg genkey | tee private.key | wg pubkey > public.key
wg genpsk > preshared.key
nvim wg0.conf
```
```
[Interface]
PrivateKey = (現在のデバイスのprivate.keyの内容)
Address = 192.168.10.10x/24
[Peer]
PublicKey = (VPSのpublic.keyの内容)
PreSharedKey = (現在のデバイスのpreshared.keyの内容)
Endpoint = (VPSの公開IPアドレス):51820
AllowedIPs = 192.168.10.0/24
PersistentKeepalive = 25
```
Address部分の「x」は、各サーバーで設定した通りです。\
この記事では、Artix0、OpenBSD1、FreeBSD2となります。
#### OpenBSDサーバー
```sh
cd
wget https://lab.abiscuola.org/gmnxd/tarball/v1.2.0/gmnxd-v1.2.0.tar.gz
tar zxfv gmnxd-v1.2.0.tar.gz
cd gmnxd-v1.2.0/src
make
make install
cd
useradd -g '=uid' -L daemon -s /sbin/nologin -c 'Gmnxd user' -d /var/gemini _gmnxd
chown -R _gmnxd:_gmnxd /var/gemini
nvim /etc/inetd.conf
```
```
0.0.0.0:11965 stream tcp nowait _gmnxd /usr/local/libexec/gmnxd gmnxd
```
```sh
rcctl enable inetd
rcctl start inetd
nvim /etc/pf.conf
```
```
set skip on lo
block return
pass
# HTTP
pass in inet proto tcp from any to (self) port {80, 443}
# URLロリ
pass in inet proto tcp from any to (self) port 9910
# Gemini
pass in inet proto tcp from any to (self) port 11965
...
anchor "relayd/*"
```
```sh
pfctl -f /etc/pf.conf
wg-quick up wg0
mkdir -p /var/www/htdocs/{076,minmi}.moe/www
mkdir -p /var/gemini/076.moe
echo "わーい" >> /var/www/htdocs/{076,minmi}.moe/www/index.html
echo "わーい" >> /var/gemini/076.moe/index.gmi
nvim /etc/httpd.conf
```
```
eth_addr=192.168.0.103 # 自宅のルーターで設定した固定IPアドレス
wg0_addr=192.168.10.103 # WireGuardで設定したIPアドレス
## 076.moe
server "076.moe" {
listen on $wg0_addr port 8080
root "/htdocs/076.moe/www"
directory index "index.html"
location "/repo/*" {
directory auto index
}
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
}
server "l3nbzyxgrkmd46nacmzf2sy6tpjrwh4iv3pgacbrbk72wcgxq5a.b32.i2p" {
listen on $eth_addr port 8450
root "/htdocs/076.moe/www"
directory index "index.html"
location "/repo/*" {
directory auto index
}
}
server "7dt6irsmfvbrtgn4nuah56kky6mvr472fbwwaltuxpf26qdqkdhfvnqd.onion" {
listen on $eth_addr port 8500
root "/htdocs/076.moe/www"
directory index "index.html"
location "/repo/*" {
directory auto index
}
}
## minmi.moe
server "minmi.moe" {
listen on $wg0_addr port 8087
root "/htdocs/minmi.moe/www"
directory index "index.html"
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
}
```
```sh
mkdir -p /var/www/htdocs/urlo.li
cd /var/www/htdocs/urlo.li
git clone https://gitler.moe/suwako/urloli.git .
nvim Makefile
```
一部編集は必要となります。
```
# Linux、Cruxの場合は必須。他のディストリビューションはどうでも良い
#PREFIX=/usr
# FreeBSDとOpenBSD
PREFIX=/usr/local
```
```sh
rcctl enable httpd
rcctl start httpd
make
make install
nvim /etc/urloli/config.json
```
```
{
"domain": "https://(ドメイン名)",
"webpath": "/var/www/htdocs/urlo.li"
}
```
#### FreeBSDサーバー
公式ガイドに従って、nginxとcertbotをインストールが必要とされていますが、今回の場合は不要です。
```sh
wg-quick up wg0
pkg install -y sudo bash wget git python pkgconf postgresql13-server postgresql13-contrib redis openssl node npm yarn ffmpeg unzip
visudo
```
```
%wheel ALL=(ALL) ALL
```
```sh
sysrc postgresql_enable="YES"
sysrc redis_enable="YES"
sysrc nginx_enable="YES"
sudo pw useradd -n peertube -d /var/www/peertube -s /usr/local/bin/bash -m
sudo passwd peertube
cd /var/www/peertube
sudo -u postgres createuser -P peertube
sudo -u postgres createdb -O peertube -E UTF8 -T template0 peertube_prod
sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" peertube_prod
sudo -u postgres psql -c "CREATE EXTENSION unaccent;" peertube_prod
VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest Peertube version is $VERSION"
cd /var/www/peertube
sudo -u peertube mkdir config storage versions
sudo -u peertube chmod 750 config/
cd /var/www/peertube/versions
sudo -u peertube wget -q "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.zip"
sudo -u peertube unzip -q peertube-${VERSION}.zip && sudo -u peertube rm peertube-${VERSION}.zip
cd /var/www/peertube
sudo -u peertube ln -s versions/peertube-${VERSION} ./peertube-latest
cd ./peertube-latest && sudo -H -u peertube yarn install --production --pure-lockfile
cd /var/www/peertube
sudo -u peertube cp peertube-latest/config/default.yaml config/default.yaml
cd /var/www/peertube
sudo -u peertube cp peertube-latest/config/production.yaml.example config/production.yaml
nvim config/production.yaml
```
```
listen:
hostname: '0.0.0.0'
port: 9000
webserver:
https: true
hostname: '(ドメイン名)'
port: 443
...
```
```sh
sudo install -m 0555 /var/www/peertube/peertube-latest/support/freebsd/peertube /usr/local/etc/rc.d/
sudo sysrc peertube_enable="YES"
sudo service peertube start
```
#### Artixノートパソコン
```sh
wg-quick up wg0
```
### 再度、VPSの設定
```sh
nvim /etc/acme-client.conf
```
```
authority letsencrypt {
api url "https://acme-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-privkey.pem"
}
domain 076.moe {
alternative names { www.076.moe }
domain key "/etc/ssl/private/076.moe.key"
domain full chain certificate "/etc/ssl/076.moe.crt"
sign with letsencrypt
}
domain video.076.moe {
domain key "/etc/ssl/private/video.076.moe.key"
domain full chain certificate "/etc/ssl/video.076.moe.crt"
sign with letsencrypt
}
domain urlo.li {
domain key "/etc/ssl/private/urlo.li.key"
domain full chain certificate "/etc/ssl/urlo.li.crt"
sign with letsencrypt
}
domain minmi.moe {
domain key "/etc/ssl/private/minmi.moe.key"
domain full chain certificate "/etc/ssl/minmi.moe.crt"
sign with letsencrypt
}
```
```sh
nvim /etc/relayd.conf
```
```
relayd_addr="0.0.0.0"
insrv1_addr="192.168.10.101"
insrv2_addr="192.168.10.102"
table <home> { $insrv1_addr }
table <urloli> { $insrv1_addr }
table <minmi> { $insrv1_addr }
table <video> { $insrv2_addr }
http protocol reverse {
tcp { nodelay, sack }
tls ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"
tls keypair "076.moe"
tls keypair "video.076.moe"
tls keypair "urlo.li"
tls keypair "minmi.moe"
match request header append "X-Forwarded-For" value "$REMOTE_ADDR"
match request header append "X-Forwarded-Port" value "$REMOTE_PORT"
match response header set "Referrer-Policy" value "same-origin"
match response header set "X-Frame-Options" value "deny"
match response header set "X-XSS-Protection" value "1; mode=block"
match response header set "X-Content-Type-Options" value "nosniff"
match response header set "Strict-Transport-Security" value "max-age=31536000; includeSubDomains; preload"
match response header set "Cache-Control" value "max-age=86400"
pass request quick header "Host" value "076.moe" forward to <home>
pass request quick header "Host" value "www.076.moe" forward to <home>
pass request quick header "Host" value "video.076.moe" forward to <video>
pass request quick header "Host" value "urlo.li" forward to <urloli>
pass request quick header "Host" value "minmi.moe" forward to <minmi>
return error
pass
}
http protocol reverse80 {
match request header append "X-Forwarded-For" value "$REMOTE_ADDR"
match request header append "X-Forwarded-Port" value "$REMOTE_PORT"
match response header set "Referrer-Policy" value "same-origin"
match response header set "X-Frame-Options" value "deny"
match response header set "X-XSS-Protection" value "1; mode=block"
match response header set "X-Content-Type-Options" value "nosniff"
match response header set "Strict-Transport-Security" value "max-age=31536000; includeSubDomains; preload"
match response header set "Cache-Control" value "max-age=86400"
pass request quick header "Host" value "076.moe" forward to <home>
pass request quick header "Host" value "www.076.moe" forward to <home>
pass request quick header "Host" value "video.076.moe" forward to <video>
pass request quick header "Host" value "urlo.li" forward to <urloli>
pass request quick header "Host" value "minmi.moe" forward to <minmi>
return error
pass
}
protocol gemini {
tcp { nodelay, sack }
tls ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"
tls keypair "076.moe"
}
relay www_tls {
listen on $relayd_addr port 443 tls
protocol reverse
forward to <video> port 9000 check tcp
forward to <home> port 8080 check tcp
forward to <urloli> port 9910 check tcp
forward to <minmi> port 8087 check tcp
}
relay www_http {
listen on $relayd_addr port 80
protocol reverse80
forward to <video> port 9000 check tcp
forward to <home> port 8080 check tcp
forward to <urloli> port 9910 check tcp
forward to <minmi> port 8087 check tcp
}
relay gemini {
listen on $relayd_addr port 1965 tls
protocol gemini
forward to <home> check tcp port 11965
}
```
```sh
rcctl enable relayd
rcctl start relayd
acme-client -v 076.moe
acme-client -v video.076.moe
acme-client -v urlo.li
acme-client -v minmi.moe
```
![](https://ass.technicalsuwako.moe/kanrinya.jpg)
ねぇー!簡単でしょー!
以上