MiniPCを中継器に

自室IPv6化計画の続きです

前回

https://qiita.com/jp_ibis/items/bd69ed4f10f2d8c57125

# NAT64は挫折しました
前回NAT64だとアプリケーション層でIPをやりとりするであろう認証入りアプリが使えない、ということでIPv6のみの環境を断念しました。

撤収ということでJoolとUnboundのNAT64設定を削除し、ついでにUnboundの設定を`/etc/unbound/conf.d`下に置いて元のconfを一切いじらないように変更しました。


# そうだネットワークを整理しよう
これでNAS用MiniPCにはUnboundとRadvdだけ追加された状態に戻ったのですが、ちょっとだけとはいえルータ化しつつあるなって思ってしまったのでじゃぁ本当にルータにしちゃおうと。

つまり、これを

```mermaid
graph LR;
    デスクトップ<--有線-->L2SW
    MiniPC<--有線-->L2SW
    L2SW<--有線-->中継器
    中継器<--Wifi-->ホームルータ
    Android<--Wifi-->中継器
    Android<--Wifi-->ホームルータ
```

こうじゃ

```mermaid
graph LR;
    デスクトップ<--有線-->MiniPC
    MiniPC<--Wifi-->ホームルータ
    Android<--Wifi-->ホームルータ
```

# 本当にやりたかったこと

本当はただの中継なのでブリッジ(L2)でやりたかったのですが、LinuxのWifiドライバがブリッジに対応しておらず上手くいかないor不安定にしかならないとか。

ものは試しとNetworkMangerのWifiのコンフィグをBridge-SlaveにしたらどうしてもUPしなく(´・ω:;.:... 

ということがあって、ブリッジ化をあきらめてルータ化することにしたというのが実際のところです。

中継器(市販品)がBridgeモードで動いててかつIPでWeb設定画面を開けるので、同じ感じにしたかったのですがなかなか。

# 構成

MiniPC－デスクトップ間は有線で192.168.0.0/24のネットワーク、MiniPC－ホームルータ間はWifiで192.168.11.0/24のネットワークとしました。

192.168.0.0/24用のDHCPv4を用意しようかと思いましたが最終的にやっぱりIPv6化したいので、RA入っているしAndroidはホームルータのWifiがつかめたので今回は見送りました。

```mermaid
graph LR;
    デスクトップ<--192.168.0.0/24-->MiniPC
    MiniPC<--192.168.11.0/24-->ホームルータ
    Android<--192.168.11.0/24-->ホームルータ
```

```mermaid
classDiagram
    class デスクトップ {
        Ether: 192.168.0.192
    }
    class MiniPC {
        Ether: 192.168.0.1
        Wifi: 192.168.11.151
    }
    class ホームルータ {
        Wifi: 192.168.11.1
    }
    MiniPC <--> デスクトップ: Ether
    MiniPC <--> ホームルータ: Wifi
```

で、この192.168.0.0/24と192.168.11.0/24の中継を`ip route`コマンドでルート設定……したかったのですが、Gemini先生に聞くとルーティングの設定で中継するとMiniPCからWebが見れなくなるとか。

あと設定も難しいからNATがオススメだよーみたいなこと言われたので、おとなしくマスカレードの方で進めることにしました。いずれ知識がついたらあいるびーばっく。

# まずはマスカレード(NAT44)の設定

Fedora41です。
SELinuxはEnforcingにしてますが、特に問題は起きませんでした。

マスカレードの設定はネットを見るとなんか色々書いてるんですが……

1. `net.ipv4.ip_forward`を`1`にする
1. インターフェイス(両方)の所属するzoneの`masquerade`を`yes`にする

だけでした。

※`net.ipv4.ip_forward`はfirewalldのmasqueradeがyesの状態だと自動で1になるとか見ましたが、手動で1にしないと上手く動きませんでした

## net.ipv4.ip_forwardの設定

カーネルのネットワークパケット転送許可フラグを立てます。

コメントだけのファイルがあるので下の方に追記します

```conf:/etc/sysctl.conf
net.ipv4.ip_forward=1
```

再起動すれば有効になりますが、再起動したくないときはコマンドで一時的に有効にできます。

```bash
$ sysctl -w net.ipv4.ip_forward=1
```

## Firewalldの設定

ネットでよく片側のインターフェイスだけmasqueradeの設定を追加しているのを見たのですが両側に必要でした。代わりによく見たiptablesの設定は不要でした。

っていうかdirectルール(iptablesへの設定)

```:これ
$ firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o Web側IF -j MASQUERADE 
```

を書いたら、他の設定(FORWARDとか)をしなくてももう転送されちゃうんだけど……

でもFirewalldのmasquerade設定はさらに簡単。

```bash
$ firewall-cmd --add-masquerade --zone=内側IFの所属するZone
$ firewall-cmd --add-masquerade --zone=Web側IFの所属するZone
```

両方のZoneが同じであればadd-masqueradは1回で終わりです。

```
$ firewall-cmd --list-all --zone=FedoraServer
FedoraServer (default, active)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: 内側IF Web側IF
  sources: 
  services: cockpit dns samba squid ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: yes <-- ここがyesになる
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

※上手くいったら後でpermanentで設定しなおしておきましょう

# デスクトップ側の設定も忘れないように

デスクトップから直接ホームルータに向かう経路がなくなったので、ゲートウェイをMiniPCのアドレスにする必要がありますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/cbefb23e-eab3-4c19-994b-9a9d187eacc8.png)

これだけでネットワーク境界をまたいでpingが通るようになります

```:デスクトップ
> ping 192.168.11.1
(応答)
```

Firewalld(nftables?)の設定だけでiptablesを使っていないので、iptablesへは何も設定されない状態でフィニッシュです。

```bash:MiniPC
$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

$ sudo iptables --list -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
```

ここまでで別ネットワークをつなぐと共に中継器の整理もできました。

# I'm back! (NATではなくルーティングで)

ネットワークの勉強を進めていると、こんなにシンプルな構成なのでもっと簡単にRoute設定できるはず……と思って再挑戦。

まずはマスカレードを取りやめます。

```bash
$ sudo firewall-cmd --remove-masquerade
$ sudo firewall-cmd --remove-masquerade --permanent
```

ホームルータ(192.168.11.0/24)のネットワークから自室(192.168.0.0/24)のネットワークに向かう時は、MiniPC(192.168.11.151)を通るように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/452f0962-c6b3-4e21-a15a-a89ddc8025c2.png)

デスクトップ側はマスカレードの時にMiniPC(192.168.0.1)をIPv4ゲートウェイとする設定をしたので、そのままにしておきます。


そしていよいよ本丸、MiniPCに中継の経路の設定……あれ？自動設定のまま特に追加する必要ないのでは。

```conf
$ ip route
default via 192.168.11.1 dev wlo1 proto static metric 600 
192.168.0.0/24 dev enp1s0 proto kernel scope link src 192.168.0.1 metric 100 
192.168.11.0/24 dev wlo1 proto kernel scope link src 192.168.11.151 metric 600
```

デスクトップ(192.168.0.0/24側)に向かう時は有線(192.168.0.1)を通るし、ホームルータ(192.168.11.0/24側)に向かう時はWifi(192.168.11.151)を通るようになってますね。

もしや……

```cmd:デスクトップ
> ping 192.168.11.1
(応答あり)

> tracerc www.goog.com
  1    <1 ms    <1 ms    <1 ms  192.168.0.1
  2     3 ms     1 ms     1 ms  192.168.11.1
  3     7 ms     3 ms     5 ms  プロバイダ [xxx.xxx.xxx.xxx]
...
```

あれ、できちゃった。

## まとめると

まずネットワークをまたぐのでip_fowardの設定は必須です

```conf:/etc/sysctl.conf
net.ipv4.ip_forward=1
```

ルーティングテーブルの変更は、ルータ(MiniPC)側には特に必要なくルータ(MiniPC)につなぐ方を設定します。

デスクトップ(ウインドウズ)は`IPv4ゲートウェイ`、ホームルータは`経路情報の追加`で設定しました。

MiniPCのルータ化、できたーヽ(´ー｀)ノ

# WebだけでもIPv6化する

CG制作ソフト(とゲーム)が全滅したのでIPv4のルートはなくせないのですが、WebだけでもIPv6化を果たすことにしました……途中まで。つまりこう

```mermaid
graph LR;
    デスクトップ<--IPv6(Web)/IPv4-->MiniPC
    MiniPC--IPv4<-->ホームルータ
    Android--IPv4<-->ホームルータ
```

ここはIPの変換とかそんな話じゃなくて普通にWebProxy(Squid)です。


## Squidのインストール

Gemini先生にSquidより簡単なWebProxyある？って聞いたらSquidほど簡単なWebProxyはないでござるぞ？って諭されたのでおとなしくSquidです。

昔やたら重たかった記憶があって敬遠してたSquidですが今回使ってみたらそんなことはありませんでした。

デフォルトではファイル(/var/spool/squid)にキャッシュされずメモリ(256MB)にキャッシュされるとのことで、記憶と違ってとても快適でした。

```bash
$ dnf install squid
$ systemctl enable squid
```

## Squidの設定

IPv6化計画のための導入なのでIPv6のULAのみ許可します。

```conf
#acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN)
#acl localnet src 10.0.0.0/8            # RFC 1918 local private network (LAN)
#acl localnet src 100.64.0.0/10         # RFC 6598 shared address space (CGN)
#acl localnet src 169.254.0.0/16        # RFC 3927 link-local (directly plugged) machines
#acl localnet src 172.16.0.0/12         # RFC 1918 local private network (LAN)
#acl localnet src 192.168.0.0/16                # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
#acl localnet src fe80::/10             # RFC 4291 link-local (directly plugged) machines
```
空目しがちですがaclの後ろは**localhost**ではなく**localnet**です。つまりこれらはlocalnetというグループで設定されます。

で、後ろの方の`http_access deny all`の前に`http_access allow localnet`がコメントアウトされていますので、これを許可します。

```conf
# For example, to allow access from your local networks, you may uncomment the
# following rule (and/or add rules that match your definition of "local"):
# http_access allow localnet
# ↓
http_access allow localnet
```

その下に`http_port 3128`と設定が書いてありますが、設定を変えなければ起動するとポート3128で待ち受けが始まります。

```bash
$ systemctl start squid
$ ss -na | grep 3128
tcp   LISTEN 0      4096    *:3128    *:* 
```

FirewalldでWebProxyとかProxyとかのサービスの設定がない／(^o^)＼と思ったら、squidというまんまのサービス名が……

```xml:/usr/lib/firewalld/services/squid.xml 
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>squid</short>
  <description>Squid HTTP proxy server</description>
  <port protocol="tcp" port="3128"/>
</service>
```

というわけでサービスにsquidを追加すればFirewallの設定は完了です。

```bash
$ firewall-cmd --permanent --add-service=squid --zone=xxxx
$ firewall-cmd --reload
```

MiniPC、デスクトップで動作確認しておきましょう。

```bash
$ curl --proxy http://minipc:3128 https://www.google.com
```

後はブラウザがWebProxyを通るように設定すれば、一部ですがIPv6化ができました。

# 通信速度確認

疎通確認をしながら進めましたが、最後に速度も確認しておきます。

## クロスケーブルを作ろう

今回Hubを外してMiniPCとデスクトップPCを直接つなぐことにしたのでクロスケーブルが必要になりましたが、もう電気屋さんではクロスとか売ってないし通販するならいっそ工具を買って自作しようと。

ところでかしめる前のジャックって刺さらないんですね……間違ったもの買ったかと焦りました😇

結線はT568A-T568Bがクロスの関係になっており、市販のストレートケーブルはたいてい両端がT568Bなので片側をT568Aにすればクロスケーブルになります。

ツメのない側から見て左から|1|2|3|4|5|6|7|8
-|-|-|-|-|-|-|-|-
T568B(市販品) |白橙|橙|緑白|青|白青|緑|白茶|茶
T568A(クロス用)|白緑|緑|白橙|青|白青|橙|白茶|茶

テスターを通すと次のペアで光ります。

1|2|3|4|5|6|7|8
-|-|-|-|-|-|-|-
3|6|1|4|5|2|7|8

そしてクロスを作った後に気がつく。Auto MDI/MDI-X対応だ／(^o^)＼

ストレートでもつながりましたがせっかく作ったのでしばらくクロスで。

## 速度測定

### CrystalDiskMark

MiniPCの6TB-HDDx3台でMDADM(Raid10-レプリカ2)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/2770ebcc-97ec-4712-86a9-12030c33c2c8.png)

### iPerf

```bash
$ iperf3 -s
...
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec   111 MBytes   933 Mbits/sec                  
[  5]   1.00-2.00   sec   112 MBytes   936 Mbits/sec                  
[  5]   2.00-3.00   sec   112 MBytes   936 Mbits/sec                  
[  5]   3.00-4.00   sec   112 MBytes   935 Mbits/sec                  
[  5]   4.00-5.00   sec   112 MBytes   936 Mbits/sec                  
[  5]   5.00-6.00   sec   112 MBytes   936 Mbits/sec                  
[  5]   6.00-7.00   sec   112 MBytes   936 Mbits/sec                  
[  5]   7.00-8.00   sec   112 MBytes   936 Mbits/sec                  
[  5]   8.00-9.00   sec   112 MBytes   935 Mbits/sec                  
[  5]   9.00-10.00  sec   112 MBytes   936 Mbits/sec                  
[  5]  10.00-10.03  sec  3.25 MBytes   941 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.03  sec  1.09 GBytes   936 Mbits/sec                  receiver
```

### インターネット回線(100MBps)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/2e1a3ef0-8c80-4c5a-b136-0ef13744e026.png)

特に変わらず。

# 整理完了

クロスケーブルでの直接接続にしたことでHubも外すことができました。

```mermaid
graph LR;
    デスクトップ<--ストレート-->Hub
    Hub<--ストレート-->MiniPC
    MiniPC<--Wifi-->ホームルータ
    デスクトップ<--ここをクロスで直結-->MiniPC
```

来月からHubと中継機を片付けた分の電気代が安くなることに期待です。

# Firewallで外からのサービスを絞る

ホームルータの脆弱性が問題になっている昨今、せっかくMiniPCを挟んでいるのでここを最終防衛ラインとすることにしました。

ホームルータとつながっているWifiのIFをpublicゾーンに移してサービスを絞っておきます。ただIFを別ゾーンに配置するとtargetがACCEPT以外の場合ゾーン間通信がDROPされてしまいます。

インターフェース単位でゾーン間通信を許可する方法が無さそうなので、IPアドレスで許可しておきました。

```bash
# public側は外部からのサービスを絞る
$ firewall-cmd --change-interface=wlo1 --zone=public

# FedoraServerゾーン(192.168.0.0/24)からの通信をpublicゾーンでDROPしないように
$ firewall-cmd --add-source=192.168.0.0/24 --zone=public

$ firewall-cmd --list-all-zones
FedoraServer (default, active)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: enp1s0
  sources: 
  services: cockpit dns ldaps samba squid ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

public (active)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: wlo1
  sources: 192.168.0.0/24
  services: samba ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

$ firewall-cmd  --runtime-to-permanent
```

IPv6は外から来ないのでIPv4(NotePC/Android端末)だけ許可しました。

MiniPCをAP化してNotePCとAndroid端末をMiniPCと直接つなぐようにできたら、servicesを全部削りたいと思います。