ipv6のネットワークで通信するための設定

<h1> Linux fedora環境でIPv6ルーター環境の構築</h1>

* ネットワーク構成図
<p>既存のipv4環境にipv6のローカルネットワークを構成しipv4と同じMasquaradeする手法を取る。
これはとりあえず外部からはローカルネットワーク内で動かしているPCにはアクセスできないメリットがある</p>

![myhome-network2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/77f36570-3d00-dae7-0b8b-bc64c1a042ea.png)


<h2> Linux fedoraサーバーのイーサネットへのipv6を手動設定</h2>

1. 前提としてipv6が有効化されていること
1. ipv6が有効化されているとリンクローカルアドレス(fe80::xx:xx～)がすでにLinuxサーバーのネットワークカードそれぞれに設定されている
1. 内側ネットワークにはipv4ではローカルアドレスの192.168.x.x/24などで構成されているので同様にipv6ユニークローカルアドレスを内側には設定していく(fd00:1a:111:1::13 ← <b>以降記載するipv6アドレスは<font color=red>例</font></b>でネットワーク環境によって適宜独自にしても可)
* eth-s0f1 は"nmcli c"で表示されるinterface名(DEVICEはdevice名と呼ぶことにする)
~~~ 
# nmcli c
NAME           UUID                                  TYPE      DEVICE
ethernet-eno1  9b681286-8b05-4b99-xxxx-4631ad5exxxx  ethernet  eno1
eth-s0f1       a1d9506d-335c-4e0e-xxxx-a708aba2xxxx  ethernet  enp1s0f1
~~~
* 我が家のLinuxサーバーはDMZ側がeno1で内側がenp1s0f1である
<h2> 内側イーサネットのipv6.address 設定</h2>

* 以下コマンドにおけるNAMEとDEVICE名は環境に応じ変更

~~~ nmcli command
nmcli c modify eth-s0f1 ipv6.addresses fd00:1a:111:1::13/64
~~~
* 内側のカードについてipv6アドレスを手動で設定したコマンドが上記である

<h3> 内側イーサネットのipv6.gatewayについて</h3>

* eno1 ipv6のリンクローカルアドレスを設定した。
~~~ nmcli command
nmcli c modify eth-s0f1 ipv6.gateway fe80::xxx:xxx:xxx
~~~

<h3> 外側イーサネットのipv6.addressの設定</h3>

* eno1のipv6アドレスはプロバイダのルーターの情報を元に(prefix)手動設定したものか、または自動配布された<b>グローバルアドレス</b>である(ホームルーターの設定に依存する)
* 自分の場合はホームルーターの配布するRAのプレフィックス情報を元にしてipv6アドレスをわかりやすいものを自分で決めて手動設定を行った

~~~ nmcli command
nmcli c modify ethrt-eno1 ipv6.addresses 240d:xxx:xxx:xxx::1
(/64のプレフックスは指定しなかった。この場合は/128となった)
~~~
(外側デバイスについてはgatewayやrouteなど設定せず)

<h2> システムでパケット転送ポリシーを定義</h2>

* vim /etc/sysctl.conf
~~~
net.ipv6.conf.all.forwarding = 1
(内側ethernetについては固定なので1の場合は0)
net.ipv6.conf.eth0.accept_ra = 0
上記はデフォルトなので変更していなければ0のままのはずだが
もしもホームルーターから設定させる場合は1にする必要がある
~~~
<h2> dhcpd6の設定</h2>

* vim /etc/dhcp/dhcpd6.conf
* 必要な定義部分のみ

~~~
subnet6 fd00:1a:111:1::/64 {
// 1から200まで末尾のipv6アドレスをローカルLANに配布する
        range6 fd00:1a:111:1::29 fd00:1a:111:1::201;
        # Use the whole /64 prefix for temporary addresses
        #  (i.e., direct application of RFC 4941)
        range6 fd00:1a:111:1:: temporary;
//DNSは自分にしている dnsmaqを動かすため
        option dhcp6.name-servers fd00:1a:111:1::13;
}
~~~

<h2> radvdの設定</h2>

RAを配布してipv6のデフォルトゲートウェイを設定させるようにするためのもの。
現在はdhcpd6.confやdsnmasq.confのdhcpの設定ではできないと思われる
* vim /etc/radvd.conf

~~~
interface enp1s0f1
{
        AdvSendAdvert on;
        AdvManagedFlag on;
        AdvOtherConfigFlag on;
        MinRtrAdvInterval 30;
        MaxRtrAdvInterval 100;
        prefix fd00:1a:111:1::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr on;
        };
}
~~~

<h3> dnsサーバー(必ず必要なものではない)</h3>

* これは家庭用のルーターがすでに機能を持っているのでそれを参照できるように設定すればLinuxサーバー側で特に動かす必要がない

(bindもあるが設定の記述方法が手間がかかりdnsmasqに変更した)

* 利点はローカルネットワーク内での名前解決がかなり容易にできる
 /etc/hostsに記載すればdnsmasqは働いてくれる

* vim /etc/dnsmasq.conf

~~~
#上位のdnsサーバーを記述した(ホームルーターの設定から読み取る)
server=240x:xxx:xxx:xxxx:faxx:xxff:fexx:cbxx
server=2001:(googleのdnsなど)

listen-address=::1,fd00:1a:111:1::13,127.0.0.1,192.168.1.13
#　念のため外側のインターフェースはlistenしないように
#interface=eno1
interface=enp1s0f1
expand-hosts
#dhcp設定はすべてコメントとしておく
~~~

<h3> ホームルーターの設定</h3>

* 以下の優先DNSのipv6アドレスはdnsmasq.confにも設定する箇所があるので控えておく
* 予備DNSはデフォルトは空欄なのでそのままでもよい

![hg8045d_ipv6_lanadrs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/99cb3800-2adc-d3b8-3df6-ef3b4be5688a.png)
![hg8045d_security_ipv6_firewall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/9eb73e5f-f812-631d-5425-ca7b2bd89d74.png)

* LAN側IPアドレスとはつまり内側のローカルLANに設置しているLinuxサーバーのipv6アドレスを入力すればよい
* ただしアドレス範囲を指定するので１つならば入力範囲も１つのアドレスでいいのではないかと思う。自分の場合はもう一台サーバーがあるので２つにした。
* WAN側IPアドレスは当初何を入力すればよいかわからなかったのでこの設定自体ができなかったが、未入力でもよいということがわかりWAN側の範囲は２つの入力項目とも未入力である

![hg8045d_security_ipv6_filtering.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/76e42c4e-eba8-2d8e-e307-dda7148505fd.png)
最後のipv6のフィルタリング機能の設定がipv4のDMZに相当する
そのためLinuxサーバー側で必要なipv6通過させるポートのみ設定が必要
ip6tablesで設定したがufwでもよい。
必ずサービスを開始させること


<h3> ip6tables.confの設定</h3>

* ホームルーターでLinux fedoraサーバーのipv6アドレスは外側から丸見えに設定したためLinuxとしてufwかip6tablesのファイアウォールは不可欠となる
* そしてipv6で利用できるサービスについては独自にポートを空けることを一つ一つ決定して記載する
* feodraの新しいものがTCP_Wrapperというsshで接続できるIPアドレスの制限が効かなくなっているため(hosts.deny)ここで許可するIPアドレス範囲を行う
~~~
vim /etc/sysconfig/ip6tables

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eno1 -j MASQUERADE
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp1s0f1 -j ACCEPT
-A INPUT -s fd00:1a:111:1::/64 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 1 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 2 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 3 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 4 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 128 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 134 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 135 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 136 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A FORWARD -s fd00::/64 -o eno1 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -j ACCEPT
COMMIT
~~~
上記icmp6関連の定義はインストール直後のデフォルトで記載されていたものをそのまま残した(ping6は問題がないというスタンスなので)

<h2> 動作チェック ping6 [ipv6] または ping -6 [ipv6]など</h2>
*クライアントPCよりブラウザでチェック

https://www.kddi.com/ipv6/
ipv6 testで検索
* 設定したLinux Feodraサーバー上でdigでチェックする
  (aaaaがipv6アドレスを返すように依頼 AAAAレコードの設定を返す)
~~~
#dig google.com aaaa

ipv6アドレスが返ってくればOK
またping -6で通信していればOK

~~~
* クライアントPCからchromeで確認
![kddi-ipv6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/18fd11a7-fa3e-affe-f31c-f4715391c0e5.png)