EdgeRouter X をなるべくCLIで設定する

# 背景
EdgeRouterXをみんなで共同購入した。
設定のノウハウはみなさん挙げてくださっているが、WebUIを使った方法が多いかな、という印象を感じた。
せっかくVyatta系のOSを積んでいるのでCLIで頑張っていこうと思い、メモをしていく。
この記事では、PPPoEによるフレッツ光への接続、LAN側の設定を行う。
IPv6、~~サーバへの転送~~等の設定は後日行う。

サーバへの転送についても書きました。
[EdgeRouter Xで外部側のポートをLAN内サーバのポートへ転送する設定](http://qiita.com/maiani/items/b45b0505377401be083a)

# 使ったもの
- EdgeRouterX本体
- ACアダプタ（付属）
- コンセント変換端子（EuroDKで買ったら付いてきた）
- LANケーブル
- LAN-USBアダプタ（MacbookにEthernetないので）

# 本投稿で行う構成
- EdgeRouterX
 - eth0：フレッツ光のモデムへ
 - eth1：スイッチへ
- スイッチ
 - ポート1：サーバへ
 - ポート2：Macbookへ

# WebUIでライセンス同意（これいらないかも）
1. EdgeRouterのeth0とMacbookをLANケーブルで一時的に接続する
2. Macの設定を以下の通りにする  
3. ブラウザで https://192.168.1.1 にアクセスし、ログインする。  
SSL証明書の警告がでるが無視する。  
1度ログインすればブラウザを閉じてもよい。

### Macのネットワーク設定
```
構成: 手入力
IP アドレス: 192.168.1.2
サブネットマスク: 255.255.255.0
ルーター: 192.168.1.1
```
### 初期アカウントパスワード
```
username: ubnt
password: ubnt
```

# SSHでログイン
Macbookからsshでログイン

```
$ ssh ubnt@192.168.1.1
```
パスワードは先程と同じ

# 本体の設定
## ユーザ作成、パスワードの変更
```
$ configure
# set system login user [ユーザ名]
# set system login user [ユーザ名] authentication plaintext-password [パスワード]
# set system login user [ユーザ名] level admin
# commit
# save
Saving configuration to '/config/config.boot'...
Done
# exit
```
ここで1度ログアウトして新規作成したユーザでログインする。
デフォルトユーザubntを消す。

```
$ configure
# delete system login user ubnt
# commit
# save
Saving configuration to '/config/config.boot'...
Done
```

## ホスト名の設定
```
# set system host-name router
```

## タイムゾーンの設定
```
# set system time-zone Asia/Tokyo
```

## NTPの設定
NICTのNTPサーバを追加して他を消す。

```
# set system ntp server ntp.nict.jp         
# delete system ntp server 0.ubnt.pool.ntp.org
# delete system ntp server 1.ubnt.pool.ntp.org
# delete system ntp server 2.ubnt.pool.ntp.org
# delete system ntp server 3.ubnt.pool.ntp.org
```

# LAN構築
## eth1ポートの設定
```
# set interfaces ethernet eth1 address '192.168.0.1/24'
# set interfaces ethernet eth1 description 'INSIDE'
```

## DHCPの設定
192.168.0.19から192.168.0.254をDHCPに設定する。

```
# set service dhcp-server disabled 'false'
# set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24
# set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 default-router '192.168.0.1'
# set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 dns-server '192.168.0.1'
# set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 domain-name 'internal-network'
# set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 lease '86400'
# set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 start 192.168.0.19 stop 192.168.0.254
# exit
```

## DNSの設定
```
# set service dns forwarding cache-size 0
# set service dns forwarding listen-on eth1
# set service dns forwarding name-server 8.8.8.8
# set service dns forwarding name-server 8.8.4.4
# commit
[ service dhcp-server ]
Starting DHCP server daemon...
# save
```

## Ethernetケーブルを差し替える
一旦ログアウトする。
eth0に刺さってるケーブルをeth1ポートに刺す。
ログインをしてみて入れればOK。

```
ssh [ユーザ名]@192.168.0.1
```

# WAN設定
## Firewallの設定
WANに接続する前にFirewallの設定をする。
[Wiki](http://edge-os.net/wiki/view/設定例_＞_Firewall_＞_基本設定 "Wiki")を見ながらとりあえずで。あんまり深く理解してない。

```
$ configure

# set firewall name WAN_IN default-action drop
# set firewall name WAN_IN description 'WAN to internal'
# set firewall name WAN_IN rule 10 action accept
# set firewall name WAN_IN rule 10 description 'Allow established/related'
# set firewall name WAN_IN rule 10 state established enable
# set firewall name WAN_IN rule 10 state related enable
# set firewall name WAN_IN rule 20 action drop
# set firewall name WAN_IN rule 20 description 'Drop invalid state'
# set firewall name WAN_IN rule 20 state invalid enable

# set firewall name WAN_LOCAL default-action drop
# set firewall name WAN_LOCAL description 'WAN to router'
# set firewall name WAN_LOCAL rule 10 action accept
# set firewall name WAN_LOCAL rule 10 description 'Allow established/related'
# set firewall name WAN_LOCAL rule 10 state established enable
# set firewall name WAN_LOCAL rule 10 state related enable
# set firewall name WAN_LOCAL rule 20 action drop
# set firewall name WAN_LOCAL rule 20 description 'Drop invalid state'
# set firewall name WAN_LOCAL rule 20 state invalid enable
```

## PPPoEの設定
```
# set interfaces ethernet eth0 pppoe 0 user-id [プロバイダの接続ID]
# set interfaces ethernet eth0 pppoe 0 password [プロバイダの接続パスワード]
# set interfaces ethernet eth0 pppoe 0 default-route auto
# set interfaces ethernet eth0 pppoe 0 name-server auto
# set interfaces ethernet eth0 pppoe 0 firewall in name WAN_IN
# set interfaces ethernet eth0 pppoe 0 firewall local name WAN_LOCAL
# set interfaces ethernet eth0 pppoe 0 description 'WAN'
```

## NATの設定
```
# set nat source rule 10 translation address masquerade
# set nat source rule 10 source address 192.168.0.0/24
# set nat source rule 10 outbound-interface pppoe0
```

## フレッツ光向け設定（MTU、MSS）
上記のままの設定だとspeedtest.netなどのサイトに接続できなかった。
フレッツ光でPPPoE通信を行うには別途以下の設定が必要となるらしい。
この場合、PPPoEに必要なヘッダ分8byteを引いたサイズが1度に遅れるデータ量となるため、MTUを1454以下に設定した。
また、MSS-clampは、1度に送るデータ量の上限を接続相手に予め伝えることができる。
この数値は一般にMTUから40引いた値が良いとされているため、1414に設定した。
（ここまで全部「らしい」なので、あとでもう1度勉強してみる必要ある）

```
# set interfaces ethernet eth0 pppoe 0 mtu 1454

# set firewall modify pppoe-out rule 1 action modify
# set firewall modify pppoe-out rule 1 modify tcp-mss 1414
# set firewall modify pppoe-out rule 1 protocol tcp
# set firewall modify pppoe-out rule 1 tcp flags 'SYN'
# set interfaces ethernet eth0 pppoe 0 firewall out modify pppoe-out
```

# まとめ
上記の設定を行うことでとりあえずの通信を行うことができた。  
サーバへの転送やIPv6対応等が残っているが、それはまた後日やっていきたい。  
また、作業を行ったあとに書いているので、実際の設定項目と比較して漏れがあったらごめんなさい。  
付録の設定は実際の設定を吸い出したものなので、おかしいなと思ったらそちらを見て欲しい。

# 参考文献
- [User Guide - vyOS](https://wiki.vyos.net/wiki/User_Guide)
- [初期設定 - EdgeOS 日本語Wiki [非公式]](http://edge-os.net/wiki/view/初期設定)
- [EdgeRouter X – 1. 初期設定 |yabe.jp](https://yabe.jp/gadgets/edgerouter-x-01-set-up/)
- [Vyattaでフレッツ光ネクストにPPPoE接続する - Qiita](http://qiita.com/mnb/items/8fa00bbd4ef7c20d713a)
- [EdgeRouterLiteを使ってiijmioひかりでインターネット接続する方法メモ - /home/tnishinaga/TechMEMO](http://tnishinaga.hatenablog.com/entry/2015/05/07/035448)

# 付録・設定
本投稿内で行った結果の設定ファイルを掲載しておく。  

```
firewall {
    all-ping enable
    broadcast-ping disable
    ipv6-receive-redirects disable
    ipv6-src-route disable
    ip-src-route disable
    log-martians enable
    modify pppoe-out {
        rule 1 {
            action modify
            modify {
                tcp-mss 1414
            }
            protocol tcp
            tcp {
                flags SYN
            }
        }
    }
    name WAN_IN {
        default-action drop
        description "WAN to internal"
        rule 10 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    name WAN_LOCAL {
        default-action drop
        description "WAN to router"
        rule 10 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    receive-redirects disable
    send-redirects enable
    source-validation disable
    syn-cookies enable
}
interfaces {
    ethernet eth0 {
        address 192.168.1.1/24
        duplex auto
        pppoe 0 {
            default-route auto
            description WAN
            firewall {
                in {
                    name WAN_IN
                }
                local {
                    name WAN_LOCAL
                }
                out {
                    modify pppoe-out
                }
            }
            mtu 1454
            name-server auto
            password [パスワード]
            user-id [ID]
        }
        speed auto
    }
    ethernet eth1 {
        address 192.168.0.1/24
        description INSIDE
        duplex auto
        speed auto
    }
    ethernet eth2 {
        duplex auto
        speed auto
    }
    ethernet eth3 {
        duplex auto
        speed auto
    }
    ethernet eth4 {
        duplex auto
        speed auto
    }
    loopback lo {
    }
    switch switch0 {
        mtu 1500
    }
}
service {
    dhcp-server {
        disabled false
        hostfile-update disable
        shared-network-name LAN {
            authoritative disable
            subnet 192.168.0.0/24 {
                default-router 192.168.0.1
                dns-server 192.168.0.1
                domain-name internal-network
                lease 86400
                start 192.168.0.19 {
                    stop 192.168.0.254
                }
            }
        }
    }
    dns {
        forwarding {
            cache-size 0
            listen-on eth1
            name-server 8.8.8.8
            name-server 8.8.4.4
        }
    }
    gui {
        https-port 443
    }
    nat {
        rule 5010 {
            outbound-interface pppoe0
            source {
                address 192.168.0.0/24
            }
            type masquerade
        }
    }
    ssh {
        port 22
        protocol-version v2
    }
}
system {
    host-name router
    login {
        user [ユーザ名] {
            authentication {
                encrypted-password ****************
                plaintext-password ****************
            }
            level admin
        }
    }
    ntp {
        server ntp.nict.jp {
        }
    }
    syslog {
        global {
            facility all {
                level notice
            }
            facility protocols {
                level debug
            }
        }
    }
    time-zone Asia/Tokyo
}
```