ひかり電話 OG配下でAsteriskからRegistする

# 概要
フレッツ光ネクストで、ひかり電話オフィスやオフィスAを直接収容する記事は割と見かけるのですが、
OG配下で収容する記事が無かったので試してみました。
(1契約のひかり電話で、FAX用のアナログ回線使いながら、Asteriskで収容するとの需要はあると思うんだけど)

お決まりですが、At your own riskでお願いします。

# 前提

- Asterisk 16.2.1 + PJSIP
    - 手元にサクッと準備出来る環境がこれだっただけ
- NTT西 光ネクスト + ひかり電話 オフィス
    - OG410Xi 2.28

# 設定方法

ほぼ、ONU直結で直収するときと同じだけど、OG配下だとDHCPでひかり電話側のルート情報がもらえないみたいなので、そこだけポイント

## OGの設定

この部分はどこまで細かく書いて良いかわからないのでさらっと

1. 「電話設定」の「IP端末/GW収容設定」で、Asteriskが動作している機器のMACアドレスを設定し、適当なIPアドレスを割り当てる   
※ 当然ながら、OGと接続しているI/FのMACアドレスを登録
1. 「着信番号設定」などは必要に応じて行う

## DHCPクライアントの設定

```/etc/dhcp/dhclient.conf
option ip-sip-servers code 120 = { boolean, array of ip-address };

option vendor-class.ntt code 210 = string;

option space ntt code width 1 length width 1 hash size 7;
option ntt.mac      code 201 = string;
option ntt.number   code 202 = text;
option ntt.domain   code 204 = domain-list;
option ntt.firmware code 210 = domain-list;
option vendor.ntt code 210 = encapsulate ntt;

# インターフェイス名は必要に応じて変更
interface "ethX" {
  send dhcp-client-identifier = hardware;
  request subnet-mask, routers, ip-sip-servers, rfc3442-classless-static-routes, vivso;
  send vendor-class.ntt = concat(06, suffix(hardware, 6));
}
```

こんな感じで設定して、dhclientを立ち上げると必要な情報が取れる
※ インターフェイス名は必要に応じて変更

```/var/lib/dhcp/dhclient.ethX.leases
lease {
  interface "eth1";
  fixed-address 192.168.52.109;
  option subnet-mask 255.255.255.0;
  option routers 192.168.52.254;
  option dhcp-lease-time 14400;
  option dhcp-message-type 5;
  option domain-name-servers 192.168.52.254;
  option dhcp-server-identifier 192.168.52.254;
  option ip-sip-servers true 192.168.52.254;
  option dhcp-renewal-time 7200;
  option dhcp-rebinding-time 12600;
  option vivso 0:0:0:.....:0;
  option vendor.ntt c9:.....:0;
  option ntt.domain "ntt-west.ne.jp.";
  option ntt.mac xx:xx:xx:be:ef:c5;
  option ntt.number "054xxxxxxx";
  renew 4 2021/06/10 11:47:50;
  rebind 4 2021/06/10 13:31:20;
  expire 4 2021/06/10 14:01:20;
}
```

```/etc/hosts.
# routers    # ntt.domain
192.168.52.254  ntt-west.ne.jp
```

ちなみに、OG配下でやろうとすると、ひかり電話側の経路情報が取れなくて、RTPが流れないので、デフォルトゲートウェイをOGに向けるのが楽
細かくやるなら、一度 通話してAsteriskで見えているRTPの送信先IPアドレスをOGに向ける

## Asteriskの設定

```pjsip.conf
[global]
type = global
debug = no

[system]
type = system
disable_rport = yes ;via headerにrportが入らないよう必須

[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0

[reg_HIKARI-DENWA]
type = registration
contact_user = 054xxxxxxx ;電話番号(=DHCPで取得したntt.number)
transport = transport-udp
client_uri = sip:054xxxxxxx@ntt-west.ne.jp ;"電話番号@DHCPで取得したntt.domain"である必要がある
server_uri = sip:ntt-west.ne.jp ;DHCPで取得したntt.domain"である必要がある

[HIKARI-DENWA]
type = aor
contact = sip:192.168.52.254 ;DHCPで取得したip-sip-servers

[HIKARI-DENWA]
type = identify
endpoint = HIKARI-DENWA
match = 192.168.52.254 ;DHCPで取得したip-sip-servers

[HIKARI-DENWA]
type = endpoint
context = incomming ;extension.conf
disallow = all
allow = ulaw
rtp_symmetric = no ;via headerにrportが入らないよう必須
force_rport = no ;via headerにrportが入らないよう必須
rewrite_contact = no ;via headerにrportが入らないよう必須
direct_media = no ;RTPをAsteriskで中継するため必要
from_domain = ntt-west.ne.jp ;DHCPで取得したntt.domain"である必要がある
aors = HIKARI-DENWA
```

```extensions.conf
[incomming]
# ひかり電話では、追加番号の着信も契約番号向けにINVITEされるので、Toヘッダから着信先を取得
exten => _X.,1,Set(TO_DIAL=${PJSIP_HEADER(read,To):5})
exten => _X.,2,Set(TO_DIAL=${CUT(TO_DIAL,@,1)})
exten => _X.,3,Goto(fromHikari,${TO_DIAL},1)

[fromHikari]

exten => _X.,1,Dial(PJSIP/phoneXXX)

[hikari]

exten => _X.,1,Dial(PJSIP/${EXTEN}@HIKARI-DENWA)
```

# 参考にさせて頂いた記事

ほぼ丸写しで申し訳ないぐらいですが・・・
- [NTT光ネクストのひかり電話へAsteriskを直接接続する - @kmorimoto さん ](https://qiita.com/kmorimoto/items/d99cd9edcf7436eea7cc)
- [利用者:Pin ptrさん - VoIp-Info.jp](http://www.voip-info.jp/index.php/%E5%88%A9%E7%94%A8%E8%80%85:Pin_ptr)