CentOS7でPPPoE接続＋ルータ構築

ネットワークはよくわかならいけど家にサーバを建てたくなったのでNetworkManagerとFirewallDで~~どうにかこうにか~~やったことのメモ

#環境
NICが2つあるマシンで、WAN側でPPPoE接続しつつ、LAN側もWANに接続できるようにしたい。
```
~{Modem}―――[NIC1]=[NIC2]―――(LAN)
```

|      |   名前  |         割当         |
|:-----|:--------|:--------------------|
| NIC1 | enp0s25 | WAN, PPPoE接続       |
| NIC2 | enp3s1  | LAN(192.168.0.1/24) |

今回はCentOS7 minimalインストール環境で、NetworkManagerとFirewallDを使い、次の3つを行う。

1. PPPoE設定
1. LAN側設定
1. IPマスカレード

# PPPoEでつなぐ
## 準備
`rp-pppoe`がいるようなのでインストール[^1]

```
# yum install rp-pppoe
```
NetworkManagerが入っていれば、`nmcli`コマンドが使える。
`nmcli connection`でネットワーク設定の一覧を表示（コマンドオプションは一意なら省略可）。

```
# nmcli c
名前       UUID  タイプ           デバイス
enp3s1    略     802-3-ethernet  --
enp0s25   略     802-3-ethernet  --
```
## 接続設定の追加
ここにPPPoE接続設定を追加する。

```
# nmcli connection add type pppoe ifname enp0s25 con-name PPPoE username <uname> password <pass> mtu <mtu>
```
設定にPPPoEという名前で設定が追加される。動いてなければ`nmcli connection up PPPoE`で有効化。

```
# nmcli c
名前       UUID  タイプ           デバイス
PPPoE     略     pppoe           --
enp3s1    略     802-3-ethernet  --
enp0s25   略     802-3-ethernet  --
# nmcli c up PPPoE
# nmcli c
名前       UUID  タイプ           デバイス
PPPoE     略     pppoe           enp0s25
enp3s1    略     802-3-ethernet  --
enp0s25   略     802-3-ethernet  --
ppp0      略     generic         --
```
`nmcli connection show PPPoE`や`ip a`で確認。

## MTU/MRUの設定
PPPoEサービスの場合、MTUを1454だとか1436などに設定する必要があるが、デフォルトでは1500になっているため適切な値（サービスにより異なる）に修正する。

```
# nmcli connection modify PPPoE ppp.mtu 1454
# nmcli connection modify PPPoE ppp.mru 1454
```

# LAN側設定
LAN側のNICに`nmcli connection modify`を使ってLAN用のアドレスを設定する。

```
# nmcli c m enp3s1 ipv4.method manual
# nmcli c m enp3s1 ipv4.addresses 192.168.0.1/24
# nmcli c m enp3s1 ipv4.gateway 0.0.0.0
```
また、__LAN側がデフォルトゲートウェイにならないようにしておく。__

```
# nmcli c m enp3s1 ipv4.never-default yes
```

# IPマスカレード設定
## IPv4フォワーディングを有効にする
firewalldの設定に先立ち、`net.ipv4.ip_forward`を`1`に設定する。

```/etc/sysctl.d/10-ipv4.conf
net.ipv4.ip_forward = 1
```
```
# sysctl --system
（略）
* Applying /etc/sysctl.d/10-ipv4.conf ...
net.ipv4.ip_forward = 1
（略）
```
## firewalldによるマスカレード
次に`firewall-cmd`で適切なzoneを設定する。今回は`external`と`internal`を使用。

firewalldを動かす

```
# systemctl start firewalld.service
```

`external`は元からmasqueradeが有効になっている。

```
# firewall-cmd --list-all --zone=external
external
  interfaces:
  sources:
  services: ssh
  ports:
  masquerade: yes
  forward-ports:
  icmp-blocks:
  rich rules:
```
ppp0を`external`に、enp3s1を`internal`に設定。

```
# firewall-cmd --zone=external --change-interface=ppp0
# firewall-cmd --zone=internal --change-interface=enp3s1
```
`--permanent`オプションで設定を永続化する。

```
# firewall-cmd --permanent --zone=external --change-interface=ppp0
# firewall-cmd --permanent --zone=internal --change-interface=enp3s1
```

## PMTUDブラックホール対策
さてこのままだとLAN側に繋いだクライアントからではうまく通信できない場合がある。今のままではクライアント側で適切なMTUが設定されないままになっているからだ。これを回避するために、クライアントごとにMTUを設定する手もあるが、ここではルーターから適切なMSSサイズを通知するようにして回避しよう。

```
# firewall-cmd --direct --add-passthrough ipv4 -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu --permanent
```
`--permanent`による永続化も忘れずに。
あとはLAN側にDHCPを提供したりすればだいたいルーターとして使える。

# ~~その他~~
~~PPPoEの設定でMTUを設定してもppp0に反映されないのはいいのだろうか？
ともかくMTUが適切かは要確認~~
※MTU周りについて追記しました。

[^1]: 他のルーターで外に繋がるけどCentOSをルーター化したいという状況なので。インターネットを繋ぎにいくインターネットが無いとか言わない(´・ω・`)