Raspberry Pi 4で、自宅サーバを作りたいと思います。
microSDカードは使用せず、USBストレージにFedora 37 Serverをインストールしました。
自宅のインターネットは、IPv6 IPoE環境のため、通常はサーバを公開できませんが。
Raspberry PiからPPPoE接続することで、サーバとして公開が可能です。外出先からインターネット経由で、Raspberry PiのFedora 37 Serverにアクセス可能になります。
安全にサーバを運用できるように、ファイアウォールは基本的に有効な状態で。
必要なサービスのみアクセスできるよう、ファイアウォール設定を調整する覚書を記録させて頂こうと思います。
目次
ICMP(ping)応答の有効化
まずは、ファイアウォールが有効であり、icmp-blocksが空であるか確かめてみました。
sudo firewall-cmd --state
sudo firewall-cmd --list-icmp-blocks
sudo firewall-cmd --permanent --get-icmptypes
icmptypesが、ファイアウォールに設定(追加)可能な設定値のようです。
ICMP応答を有効にするため、次の3つのルールを追加します。
- echo-reply追加
- echo-request追加
- icmp-block-inversion有効化
sudo firewall-cmd --permanent --add-icmp-block=echo-reply
sudo firewall-cmd --permanent --add-icmp-block=echo-request
sudo firewall-cmd --permanent --add-icmp-block-inversion
sudo firewall-cmd --reload
設定後、–reloadで有効にしました。
これでPPPoE側から、Fedora Serverにpingを行うと、応答が返るようになりました。
IPv4(PPPoE)等、ppp0インタフェースの管理
IPv4(PPPoE)接続した場合ですが、「external」ゾーンにppp0インタフェースを割り当てました。
ppp0側でサービスを公開したい場合、このexternalゾーンを対象にfirewalldの設定を行います。
不特定多数の方に、サーバとして公開する場合は、externalゾーンに直接サービスを追加します。
自宅LAN内のサーバにアクセスしたい場合は、ipsec(VPN)で認証・暗号化します。ipsecサービスのみ追加し、他のサービスは削除しておきましょう。
# externalゾーンにppp0を割り当て
sudo firewall-cmd --zone=external --change-interface=ppp0
sudo firewall-cmd --zone=external --change-interface=ppp0 --permanent
# 確認
sudo firewall-cmd --list-all --zone=external
# externalゾーンのsshサービス削除
sudo firewall-cmd --zone=external --remove-service="ssh"
sudo firewall-cmd --zone=external --remove-service="ssh" --permanent
# ipsecサービス追加
sudo firewall-cmd --zone=external --add-service="ipsec"
sudo firewall-cmd --zone=external --add-service="ipsec" --permanent
# 確認
sudo firewall-cmd --list-all --zone=external
# 設定反映
sudo firewall-cmd --reload
こちらの画像では、externalゾーンはppp0インタフェースが割り当てられており。
サービスはipsecのみ通す設定です。
セキュリティ上のリスクが大変大きいため。ppp0側のsshサービスは必ず削除しておきましょう。
ちなみに外出先からiPhoeやPCで自宅LANにアクセスできるように、VPNサーバを構築する手順はこちらになります。
httpd等、通常のサービスの有効化
httpdやnginx等、80/TCPを使用するサービスを公開する場合、httpを追加します。
sudo firewall-cmd --add-service="http"
sudo firewall-cmd --add-service="http" --permanent
sudo firewall-cmd --reload
前述のppp0側に公開する必要がない場合は、デフォルト設定のゾーンFedoraServerに追加し、ppp0側からアクセスできないことを確認しておきます。
確認の方法は、後述のログ記録を有効にすることで、リクエスト/レスポンスを確認することが出来ます。
IPSecの有効化
こちらの資料より
ipsecサービスは、IKEプロトコル、ESPプロトコル、AHプロトコルで使用される500/UDPと4500/UDPを表すそうです。
sudo firewall-cmd --permanent --add-service="ipsec"
sudo firewall-cmd --reload
上述の、外出先からppp0インタフェースでVPN接続する場合、firewalldにサービスを追加する必要があります。
ファイアウォールのログの確認
# ログの取得状態確認
sudo firewall-cmd --get-log-denied
# ログ取得開始
sudo firewall-cmd --set-log-denied=all
sudo firewall-cmd --reload
sudo tail -f /var/log/messages
# ログ取得終了
sudo firewall-cmd --set-log-denied=off
sudo firewall-cmd --reload
サービスにアクセスして、どのパケットがリジェクトされているか調べる感じでしょうか。
ログから、ファイアウォールの設定をどうすればよいか考える感じです。
覚書
# 状態確認
sudo firewall-cmd --list-all
# ゾーンの確認
sudo firewall-cmd --get-zones
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all-zones
sudo firewall-cmd --permanent --list-all-zones
# ポート追加
sudo firewall-cmd --add-port=80/tcp
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload
# サービス追加
sudo firewall-cmd --get-services
sudo firewall-cmd --list-all-services
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
# サービスのブロック
sudo firewall-cmd --remove-service=https
# ホワイトリスト
sudo firewall-cmd --permanent --add-source=192.168.1.0/24
sudo firewall-cmd --permanent --remove-source=192.168.1.0/24
# サブネット
sudo firewall-cmd --zone=internal --add-source=192.168.1.0/24 --permanent
sudo firewall-cmd --zone=internal --remove-source=192.168.1.0/24 --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
#
sudo firewall-cmd --get-policies
sudo firewall-cmd --list-all-policies
sudo firewall-cmd --list-interfaces
sudo firewall-cmd --list-sources
この記事は、随時項目を追加する予定です。
Raspberry Piをインターネットに直接接続して公開するにあたり。
セキュリティの面から、Fedora Serverは十分に実用的であると考えています。(個人的見解
実用性を維持するには、きっちりとセキュリティを確保しながら運用する必要があると思います。
何かサービスを追加して、ファイアウォールを解除する必要がある場合、この記事に追記させて頂こうと思います。