個人的メモ:Raspberry Pi4を元通りにするためのメモ(Dockerいれてネットワーク設定がふっとんだから) その1

ネットワークとか一ミリもわからないのにDockerをぶちこんだら、SoftEtherが死んだのでVPNサーバとしての役をはたさなくなったRasPi。どういじっても直らなくなってしまったから、まっさらにしてなおすときにやったことのメモ


SDカードをまっさらにしてOS書き込み

https://www.raspberrypi.com/software/

公式から、Raspberry Pi Imagerをダウンロードしてインストール
大事そうなデータ(nginxの設定、postfix・Dovecotの設定、softetherの設定、サークル公式ホームページのデータ(という名のbooth転送用ページ)のバックアップをとってから、SDカードをRaspberry Piからぶち抜き、PCにセット。

Imagerを起動して、デバイスを手持ちのRaspberry Pi 4、OSはRaspberry Pi OS 64bit Full、ストレージにSDカードを選択して、最初の初期設定はホスト名セット、初期ユーザーを入力(これをやるとpiユーザーが消える)、SSH ONを選択して、書き込み開始

書き込み完了後、SDカード内のbootfsをみて、config.txtを開く

#Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d
max_framebuffers=2

となっている場所があるので、

vc4-kms-v3d -> vc4-fkms-v3d に変更する。

fをつけないとHDMIが出力されないので、おまじない的にやる。
(fをつけると古いドライバを有効にするらしい、これはこれで腹立つので設定完了後一生ディスプレイをつなげることはないとはいえ、なんとかする方法を調査したい。)

参考↓

あとHDMI外した後でもVNCで接続できるように、HDMIのモードを変更しておく。同じくconifg.txtを文末に、

hdmi_force_hotplug=1

を追記して保存する。

参考↓

SDカード差し込んで起動、初期設定

やることおおいので、先にアジェンダを書いておく。

  • RasPi Configから、ロケール、CPUファンの設定を変更

  • suパスワード変更

  • SSHパスフレーズ接続の構成

  • IPアドレスの固定

  • VNCの設定

  • clam-avのインストール

  • ufwのインストール

  • ntpの設定

  • おまじない

SDカードできあがったら差し込んで起動して、デスクトップが上がってくることを確認する

RasPi Configから、ロケール、CPUファンの設定を変更

Start -> Preferences -> Raspberry Pi Configurationを選択
Configが起動したら、必要な設定をいじる
いつのまにかCPU ファンの設定が追加されたので、ワイは4番PINにファンをさしてるので、GPIPを4番にして設定完了する
SDカード書き込み時にロケールをセットしなかったので、ここでロケールもセットする。
再起動するように言われるので再起動する

suパスワード変更

続いて、suのパスワードを変更する。

sudo passwd root

新しいパスワードを2回入れるようにいわれるのでそのようにする。

SSHパスフレーズ接続の構成

次にSSHをパスワードから証明書とパスフレーズ方式に変更する。
公開鍵と秘密鍵のペアをSSHのクライアントから作成する。ワイはとりあえずmacから接続できればいいので、macで作業する。

ssh-keygen -t rsa

鍵の保存場所を聞かれるので、セットする。(なにもしないでenterをおせば、~/.sshに出来上がる。)
パスフレーズをいれるように指示されるので、2回入力する。
うまく行けば、fingerprintが表示されるので、満足する。
できあがったid_rsa.pubをなんらかの方法で、RasPiにもってくる。
RasPiでは公開鍵の置き場所は~/.ssh/authorized_keysにid_rsa.pubをかきこまないといけないらしいのでそうする。

cat id_rsa.pub >> ~/.ssh/authorized_keys
cd ~/.ssh
rm id_rsa.pub
chmod 600 ~/.ssh/authorized_keys

公開鍵の書き込みを終えて権限を変更したら、次にSSHの受けポートを変更する。標準ポートだとお客様の訪問がとてつもないらしいので、そうする。

nano /etc/ssh/sshd_config

どこかにport 22とあるはずなので、そこを使いたいポートに変更する。
つづいでパスワード接続を封じるため、

PasswordAuthentication no

を追記する。
変更後サービスをリスタート

systemctl restart sshd

クライアントから、SSH接続できるかを試す。

ssh Username@192.168.0.xxx -p yyy

(yyyはconfigで指定した、使いたいポート)
初回接続になるはずなので、つなげますか?と聞かれるから、yesを入力して、Enter。ログイン成功を確認する。

IPアドレスの固定

つづいて、IPアドレスを固定する。RasPi OS bookwormでは、nmcliで設定やるらしいだんが、ワイちゃんクソザコエンジニア以下ゴミおじさんなので、nmcliぜんぜんわかんないので、GUIで変更していく。
RasPiデスクトップの右上のツールバーにネットワークコネクションのアイコンがあるので、クリックして、でてきたメニューの"高度なオプション"を選択して"接続を編集する"クリック
GUIのネットワーク画面がでてくるので、有線接続1をクリックして、左下の歯車アイコンをクリックする。
編集画面がでてくるので、IPv4のタブをクリックして必要な項目を設定する。他のタブでも設定するところがありそうならやっつける。
設定完了後に、再起動して接続を確認する。

VNCの設定

つづいて、VNCを設定していく。ConfigでVNCをONにしておいても、なぜかmacの画面共有.appから接続できないので、なんとかする。(エライ人ができない理由を書いてくれてるのでソレを読んでください。ここでは書きません。ワイは赤ちゃんだから理解できないので。)
簡単に言うと、RasPi OS bookwormからデスクトップマネージャがX11じゃなくなったからということらしい。
新しいウインドウマネージャのwaylandで動いているVNCはwayVNCというものだそうだが、調べてみると、動作がカクツクらしいのと日本語入力のIME候補がイかれた場所に表示されるらしいので、デスクトップマネージャをX11に戻して、realVNCを動かすことにする。
SSHでつながるようになったので、SSHで接続して作業する。接続できたら、sudo raspi-configを打ち込んでEnter。Configが開くので、"6 Advanced Setting"を選択して、Enter。続いて、"A6 wayland"を選択してEnter。W1 X11を選択してEnterで完了。再起動するように指示されるので了解する。
再起動できたら、GUIのRaspberry PI Configから、VNCのスイッチをONにするとツールバーにVNCのアイコンが表示される。
ツールバーのVNCを右クリックして、"Option"をクリック。
左側のタブから、"Security"を選んで、Encyrptionを"Prefer Off"、Authenticationを"VNC passwordに"変更。設定するパスワードを入力するように聞かれるので、2回パスワードを入力。
"Allow connections from legacy VNC Viewer users"というチェックボックスがあるので、必ずチェックをいれてから、"OK"をクリックする。
つづいて、VNCのポートを変更するために、左側のタブから"Connections"を選んで、ポートを入力する欄に好きなポートを入力する。
出来上がったら、"OK"をクリックして、設定ウインドウを閉じる。
設定できたら、macのFinderのサーバーへ接続から、接続できることを確認する。
(暗号化の設定を切っていますが、VNCでの作業はかなり限定的とおもわれるのでこのさい許容しました。VNCメインの人はtigerVNCとかだと接続できるらしいのでそっちを試みてください。)

参考↓

とりあえずここまでで、RasPi本体に画面とキーボード・マウスをつなぐ必要がなくなったので、LANと電源だけを確保できる場所に置き直す。

clam-avのインストール

つかえてるんだがつかえてないんだかよくわかんないウイルス対策ソフトをいれておきます。

sudo apt-get install clamav clamav-daemon

インストールできたら、

sudo systemctl status clamav-daemon

で死活確認。定義ファイルアップデータも動かしておく

sudo systemctl start clamav-freshclam
sudo systemctl enable clamav-freshclam

テスト用のウイルスデータをダウンロードしてくる。

curl https://secure.eicar.org/eicar.com.txt -o ~/virus.txt

clamscanを動かす。

clamscan ~/

完了後、

Infected files: 1

になってればOK テストウイルスは削除する。clamdscanはなんかいろいろ難しいのでちょっと置いておく。

ufwのインストール

ファイアウォールのufwインストールして、ホワイトリスト制に変更して、ログを有効にする

sudo apt-get install ufw //インストール
sudo ufw status //起動してるか確認
sudo ufw default deny //まずはすべての接続をブロック
sudo ufw allow XX //XX番のTCPポートを有効にする 好きなだけやる
sudo ufw allow proto udp from any to any port XXX //XX番のUDPポートを有効にする
sudo ufw delete allow XXX //XXX番ポートでallowにしたルールを取りやめ:間違えたとき用
sudo ufw enable //ルールを有効にする。SSHポートを塞いでないことを確認した上で実行しないとSSHが死ぬ
sudo ufw logging on //ログを有効化 "/var/log/ufw.log"に入る
sudo ufw status //最後にルールを確認

これでひとまずファイアウォールが有効になる。

syslogのインストール

sudo apt-get install rsysrog //インストール
sudo cp /etc/rsyslog.conf /etc/rsyslog.conf.org //デフォファイルは保存
sudo nano /etc/rsyslog.conf  //中身を編集 後述
sudo systemctl restart rsyslog //再起動

"rsyslog.conf"は以下のように編集

# provides UDP syslog reception
module(load="imudp")  //コメントをはずす
input(type="imudp" port="514") //コメントをはずす
#provides TCP syslog reception
module(load="imtcp") //コメントをはずす
input(type="imtcp" port="514") //コメントをはずす

//以下を追記//
# allowed
$AllowedSender UDP, 127.0.0.1, 192.168.1.0/24
$AllowedSender TCP, 127.0.0.1, 192.168.1.0/24

# logs
$template ClinetMessage,"/var/log/rsyslog/%fromhost%/messages.log"
*.* -?ClinetMessage

で保存。
syslog送ってきそうなデバイスにsyslog送るように設定して、ログが残りそうな作業をして、/var/rsyslogを確認する。受信できていればOK。

ntpの設定

sudo nano /etc/systemd/timesyncd.conf

で設定を開く。設定の一行目と二行目を次のようにする

[Time]
NTP=ntp.nict.jp
FallbackNTP=time.google.com

サービスのリロード

sudo timedatectl set-ntp true
sudo systemctl daemon-reload
sudo systemctl restart systemd-timesyncd.service

最後に設定できているかを確認。

 systemctl restart systemd-timesyncd

systemd-timesyncd[XXXXX]: Initial clock synchronization
ってでてればOK

おまじない

最後におまじないを実行する。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get autoremove
sudo apt-get clean

これをもって初期設定を終了とする。

RDPの有効化

ワイちゃんねぇ、VNC嫌いなんだよねぇ…… (VNC有効化したのに)
RDPのほうが好きなので、GUI使いたいときはRDPで行きたいので、RDPを有効にする。
GUIで設定できるらしいので、とりあえずVNCで中にはいる。
Start -> 設定 -> Add/Remove Software でソフトウェアの追加削除画面を開く。
左列の検索窓に、"xrdp"といれてEnter。
メイン画面に、
「Remote Desktop Protocol (RDP) modules for X.org」
「Remote Desktop Protocol (RDP) server」
がでてくるので、この二つをインストールする。

インストールできたら再起動して、WinかmacのRDPで、接続を試みる。
接続できたら、完了。
もうVNCはつかわないはずなので、必要なければVNCを無効にする。

modules for X.orgとなってるくらいだから、ウインドウマネージャをWaylandに戻すとRDPできなくなると思いきや普通に動くんだなこれが。
(なんで??????)

ここまでやったが、RDPでいけるんだからVNC不要なのと、今後Waylandが標準っぽいので、Waylandにウインドウマネージャを戻す。
(コンソールから、raspi-configで戻す。)
いろいろ調べるとwaylandでも画面共有.appでVNCできるっぽいが、ちょうど2024/3/15にOSアップデートがはいって、wayvncがsystem.d配下になったことで、設定の場所がよくわからんため、この作業はちょっと様子見。
ひとまずVNCは無効にしてRDPでしばらく行くことにする。

参考↓

sambaのインストール

なにかとsambaはあったほうが便利なので入れる。

apt-get install samba samba-common-bin
sudo nano /etc/samba/smb.conf //設定する 内容は後述
sudo smbpasswd -a hogehoge //上で設定したユーザのパスワードを設定する
sudo systemctl restart smbd //サービスを再起動

smb.confの設定内容は、次の通り
設定してるワークグループ名があればセットする

# Change this to the workgroup/NT-domain name your Samba server will part of
   workgroup = chipichpichapachapa
# interface names are normally preferred
   interfaces = 127.0.0.0/8 eth0 192.168.1.0/24 //自分のネットワークを追加

末尾に共有するユーザー名と共有フォルダをセットする。

[hogehoge]
   comment = hogehoge user Home space
   path = /home/hogehoge
   force user = hogehoge
   guest ok = no
   create mask = 0666
   directory mask = 0777
   read only = no

read onlyをyesにすると読み込みだけになる。guest ok をyesにするとパスワードなしでも入れる。

できあがったら保存して終わり。設定したユーザのパスワードをセットして、他のデバイスからsmb接続できたら完了。
(ちゃんとufwでsmbのポートは空けておくこと 以下nginxとかsoftetherも同様)

nginxのインストール

サークル公式Webという名のboothご案内ページを出すために、nginxを入れる。

sudo apt-get install nginx
sudo systemctl enable nginx

とりあえずこれでnginxが立ち上がるので、ブラウザに http://192.168.0.xxx と打ち込んでnginxのデフォルトページがでるかを確認する。
つづいでconfigを設定していく。

 sudo nano /etc/nginx/nginx.conf

でconfigを開いて、以下を設定。

error_log /var/log/nginx/error.log;  ->  error_log /var/log/nginx/error.log warn;
// warnをつけて、warn以上のログが掲載されるようにする

#server_tokens off; -> server_tokens off;
 // #を取って、有効化。バージョン情報の隠蔽

Logging Settingsにロギングの設定を記載。

log_format common '$remote_addr\t-\t$remote_user\t[$time_local]\t'
        '"$ssl_client_s_dn"\t'
    '"$request"\t$status\t$body_bytes_sent\t'
    '"$http_referer"\t"$http_user_agent"\t$http_x_forwarded_for\t$request_time';

access_log /var/log/nginx/$server_name/access.log common;

ログ設定参考↓

ログの設定をしたフォルダをつくっておく。
次のセクションで説明する、server_nameに設定する名前で、
"/var/log/nginx/"にhogehoge.comのフォルダをつくっておく、
そのなかにaccess.logをつくり、権限を次のようにかえておく

chmod g+x access.log
chown www-data:www-data access.log

このときの、所有者はnginxのworkerprocessにしておく(つまり、nginx.confの冒頭ユーザー名)
これをやっておかないとアクセスログがでないので注意する。
で、logrotateの時期がくるとまた所有者がrootになってしまうので、別でlogrotateの設定をしないといけない。後でやる。

つぎに、自分のwebサイトをつくっていく。

sudo cp  /etc/nginx/sites-available/default /etc/nginx/sites-available/CfTWeb //デフォ設定をコピー
sudo nano /etc/nginx/sites-available/CfTWeb //中身を編集
sudo ln -s /etc/nginx/sites-available/CfTWeb /etc/nginx/sites-enabled/CfTWeb  //enableフォルダにシンボリックリンクをはる
sudo rm /etc/nginx/sites-enabled/default  //デフォルトサイトをenableから削除
sudo chmod 701 /home/hogehoge/  //ワイはホームフォルダにWebのルートをおいたので権限を変えておく
sudo chmod 777 -R /home/hogehoge/WebServer  //Webルートの権限を変える
sudo nginx -t //設定のテスト とおらんかったらやりなおし
sudo systemctl reastrt nginx //サービスの再起動

ここまでやって、ルートフォルダに適当なindex.htmlおいて、ブラウザから http://192.168.0.xxxと打ち込んで、表示できたらOK

"/etc/nginx/sites-available/CfTWeb"はこんな感じで設定する。

root /var/www; -> root /home/hogehoge/WebServer; //ルートフォルダ
server_name _;  -> server_name hogehoge.com; //好きに名前をつける

location{}に以下を書き込むと、index.htmlがないときに、index of でディレクトリの一覧がでるやつが使える。

autoindex on;
autoindex_exact_size off;
autoindex_localtime on;

とりあえず、ここまでやったら、htttpでnginxが使えるようになる。次にhttpsが使えるように、Let's Encryptionをいれていくため、いったんセクションを変更する。

Let's Encryptionのインストールと設定

さっそくインストールから 公式のやりかた↓に従います。
sanp経由出インストールしてるがsnapだとなんか自動アップデートしてくれるらしい。


sudo apt-get install snapd
sudp snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx

進めていくと、メールアドレスを入れるようにいわれるので入れる。
サービスに同意するようにいわれるのでする。
Let's Encryptパートナーにメールアドレスを公開していいか聞かれるので好きな方を選ぶ
ドメインをいれろといわれるのでいれる。

でもって、"Successfully received certificate."といわれたらOK

なんとnginxの設定までちゃんとやってくれるので、簡単。
一応設定を確認する。
/etc/nginx/sites-available/CftWebを開く

   # SSL configuration
   #
   listen 443 ssl default_server;  
   listen [::]:443 ssl default_server;  
   ssl_certificate /etc/letsencrypt/live/hogehoge.com/fullchain.pem; 
   ssl_certificate_key  /etc/letsencrypt/live/hogehoge.com/privkey.pem;
↑こうなっていることを確認

確認or保存して、 

sudo nginx -t

して、OKだったらサービス再起動して、自分のドメインにhttp"s"で接続してみる。接続OKだったら成功。

続いて自動更新
suで次のコマンドを実行してみる。

certbot renew --dry-run --post-hook "systemctl reload nginx" > /var/log/certbot-renew.log 2>&1

"/var/log/certbot-renew.log"を見てみて、更新が成功しているようなら、--dry-runを外して、サービスのcron.dに内容を設定してみる。

0 */12 * * * root certbot renew --post-hook "systemctl reload nginx" > /tmp/certbot-renew.log 2>&1

二日後くらいにログ確認してできてるようならOK

SoftEtherのインストール

ぶっちゃけ本題。こいつができなきゃなんの意味もない。

とりあえず公式からソフトをダウンロードしてくる。

公式にアクセスして、ダウンロードするソフトはSoftether VPN (Freeware)、コンポーネントはSoftEther VPN Server 、プラットフォームはLiunx、CPUはARM 64bitにして、最新版を選んで右クリックしてURLをコピーを選択。
RasPiに戻って、wgetする。

wget コピーしてきたURL

ダウンロードがおわったら

tar -xzvf softether-vpnserver-{version}-linux-arm64-64bit.tar.gz
rm softether-vpnserver-{version}-linux-arm64-64bit.tar.gz
sudo mv vpnserver /usr/local

解凍したファイルを移動できたら、ビルド

cd /usr/local/vpnserver
make
//ビルドがおわったら
sudo chmod -R 600 *
sudo chmod 700 vpncmd
sudo chmod 700 vpnserver

動作確認する。

sudo ./vpncmd
//がやがやでるので3を入力
VPN Tools> check

すべてのチェックに合格しました。と出ればOK。 exit といれてEnterおして、bashにもどる。
自動起動の設定をする。

sudo nano /etc/systemd/system/vpnserver.service

以下の内容を書き込む。

[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

[Service]
User=root
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Type=forking
RestartSec=3s
WorkingDirectory=/usr/local/vpnserver/
ExecStartPre=/sbin/ip link set dev eth0 promisc on

[Install]
WantedBy=multi-user.target

保存して、

sudo systemctl enable vpnserver.service
sudo systemctl start vpnserver

WindowsにSE-VPNサーバ管理ツールをインストールして、起動する。
開いたら、"新しい接続設定"を開いて、いろいろ入力する。
ブリッジの設定だけしないで、いちど設定を完了させる。

RasPiに戻って、ブリッジの設定をする。ブリッジツールをインストール

sudo apt install bridge-utils

ブリッジを作成。

sudo brctl addbr br0

Winに戻ってサーバー管理マネージャから、"ローカルブリッジの設定"をクリック。
新しいローカルブリッジの定義にハブの名前を選んでから、新しいtapデバイスとのブリッジ接続を選択して、適当なtapデバイス名を入れて、"ローカルブリッジを追加"をクリック。"閉じる"をクリックして、ローカルブリッジの設定を終わらせる。

RasPiに戻って、ネットワークインターフェイスを編集する。

sudo nano /etc/network/interfaces

以下を記載

auto eth0
iface eth0 inet static
address 0.0.0.0

auto br0
iface br0 inet static
address 192.168.1.xxx
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
bridge_port eth0
bridge_maxwait 1

保存して、閉じる。
続いて、自動的にブリッジに接続するようにする。

sudo nano /etc/systemd/system/bridge-softether.service

以下の内容で作成して保存。

[Unit]
Description=Bridge tap_softether to br0
After=vpnserver.service

[Service]
User=root
Restart=on-failure
RestartSec=3s
ExecStart=/usr/sbin/brctl addif br0 tap_softether

[Install] WantedBy=multi-user.target

サービスとして有効化

sudo systemctl enable bridge-softether

全部できたら、再起動して うまく動いていればOK

参考


最後にログファイルが/usr/local/vpnserver内にあってだるいので/var/log/vpnserverに移動する。
めんどうなのでメモ書きだけど、mvでログファイル4つ(server, packet, securty, backup,config)を全部、/var/log/vpnserverにもってきて、/usr/local/vpnserverにln -s varlogの各ログ ./各ログでリンクはっておけばOK。


とりあえずここまでできたので一度SDカードのイメージをバックアップしておく。なんかあったら面倒なので。
バックアップの取り方は

まったくこの通りに作業すればおk。
GpartedがGUIアプリなので、X11とかが動かせる端末から実行すること。

OSの書き戻しはWin32 Disk Imagerでやる。


とりあえずこれで、ファイアウォール、Webサーバ(HTTPS)、SMB、RDP、SoftEtherは動くようになったので、続き(メールサーバとか)はまた今度。



====20240405 編集====
Let's Encryptのインストールのしかたを更新。 
====20240408 編集====
SDカードイメージの抜き出しのやりかたを変更。

この記事が気に入ったらサポートをしてみませんか?