• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

router

date: 2020-04-08 excerpt: router

tag: router


router

Linuxをrouterにする。
ここでは、Ubuntu Linux 20.04をもとに説明します
特に、pppoeの接続を他のマシンでも使えるという設定の例です

以下の具体的なコードと設定の例では、eth deviceが以下の具体値になっているので留意ください。

  • enp4s0 : intranet, LAN側のeth device
  • enx3495db2d875c : internet, WAN側のeth device

netplanでIPの設定

/etc/netplan/01-netcfg.yaml などを編集して以下の設定を反映させる

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp4s0:
          dhcp4: no
          dhcp6: true
          addresses: [192.168.50.1/24, 192.168.40.12/24, 192.168.30.12/24, 192.168.20.12/24]
          routes:
                - to: 0.0.0.0/0
                  via: 192.168.40.1
                  metric: 100
                - to: 0.0.0.0/0
                  via: 192.168.30.1
                  metric: 120
          nameservers:
          		addresses: [1.1.1.1, "2606:4700:4700::1111","2606:4700:4700::1001",8.8.4.4,8.8.8.8]
    enx3495db2d875c:
          dhcp4: true
          dhcp6: true

dhcpdを起動

$ sudo apt install isc-dhcp-server -y

以上のパッケージを入れて、設定ファイルに以下のようなレンジを書き込む

  • 設定ファイル : /etc/dhcp/dhcpd.conf

このファイルは systemctl restart isc-dhcp-server で再起動できるが、 netplan で適切にどちらのインターフェースがこれに該当するか設定しないと起動できない

option domain-name-servers 8.8.8.8, 8.8.8.4;

option subnet-mask 255.255.255.0;
option broadcast-address 192.168.50.255;
subnet 192.168.50.0 netmask 255.255.255.0 {
	range 192.168.50.20 192.168.50.250;
	option routers 192.168.50.1;
}

pppoeconfでauthを通す

例えば以下のように、ユーザ名やなんやらを通す

$ pppoeconf enx3495db2d875c 

二度目以降は、以下のコマンドですぐ接続できる

$ pon dsl-provider

注意点として、device指定がpppoeconfパッケージは壊れているので、手動で以下のファイルを下記のように設定し直す必要がある。

  • /etc/ppp/peers/dsl-provider
# Minimalistic default options file for DSL/PPPoE connections

noipdefault
# defaultroute
# replacedefaultroute
hide-password
# lcp-echo-interval 30
# lcp-echo-failure 4
noauth
persist
# mtu 1492
# persist
# maxfail 0
# holdoff 20
plugin rp-pppoe.so enx3495db2d875c
# usepeerdns enx3495db2d875c
user "zed842793@excite.co.jp"

テキスト形式のPPPDの設定はこのwikiが参考になる

ipforwardingを有効化

/etc/sysctl.conf にipv4のforwardingは以下のように設定する

net.ipv4.ip_forward=1

システムに反映する

$ sudo sysctl -p 

eth device間のiptableを設定

IPをどういうルールで転送するか、の設定を覚えさせる必要がある。
DEV_IN は intranet側、 DEV_EX はwan(internet)側である。

#!/bin/bash
# /etc/rc.local
# Default policy to drop all incoming packets.
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
export DEV_IN="enp4s0"
export DEV_EX="ppp0"
echo "DEV_IN ${DEV_IN}"
echo "DEV_EX ${DEV_EX}"
# Accept incoming packets from localhost and the LAN interface.
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i $DEV_IN -j ACCEPT
# Accept incoming packets from the WAN if the router initiated the connection.
iptables -A INPUT -i $DEV_EX -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
# Forward LAN packets to the WAN.
iptables -A FORWARD -i $DEV_IN -o $DEV_EX -j ACCEPT
# Forward WAN packets to the LAN if the LAN initiated the connection.
iptables -A FORWARD -o $DEV_IN -i $DEV_EX -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
# NAT traffic going out the WAN interface.
iptables -t nat -A POSTROUTING -o $DEV_EX -j MASQUERADE
# rc.local needs to exit with 0
exit 0

V2: ds-lite形式でIPIP6する

詳細はこのリンクを参照すればよい。

Ubuntu18.04以降ではnetplanのみでトンネリングできるが、 dhcpサーバと、他のマシンにipをフォワードするには別途設定が必要である

ds-lite契約をしていると勝手にIPv6アドレスが降ってくるので、そのIPアドレスをNTT東日本のpeerにトンネルを構築して底経由で通信すれば高速。

network:
  ethernets:
    enp9s0:
      addresses:
      - 192.168.20.23/24
      - 192.168.30.23/24
      - 192.168.40.23/24
      - 192.168.45.23/24
      - 192.168.45.1/24
      - 192.168.50.23/24
      - 192.168.60.23/24
      dhcp4: false
      dhcp6: true
      #gateway4: 192.168.40.1
      routes:
          - to: 0.0.0.0/0
            via: 192.168.60.1
            metric: 1000
          - to: 0.0.0.0/0
            via: 192.168.50.1
            metric: 80
          - to: 0.0.0.0/0
            via: 192.168.45.1
            metric: 10
          - to: 0.0.0.0/0
            via: 192.168.40.1
            metric: 10
          - to: 0.0.0.0/0
            via: 192.168.30.1
            metric: 50
          - to: 0.0.0.0/0
            via: 192.168.20.1
            metric: 120
      nameservers:
        addresses: [127.0.0.53]
    enx000ec6fa667a:
      dhcp6: yes
      accept-ra: yes
  tunnels:
    ip6tnl1:
      mode: ipip6
      remote: 2404:8e00::feed:100
      local: 2409:10:8b00:4900:20e:c6ff:fefa:667a
      routes:
        - to: 0.0.0.0/0
          scope: link
  renderer: networkd
  version: 2

これを反映すると、 ip a で以下のような状態を確認できるはずである

$ ip a
...
9: ip6tnl1@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN group default qlen 1000
    link/tunnel6 2409:10:8b00:4900:20e:c6ff:fefa:667a peer 2404:8e00::feed:100
    inet6 fe80::8463:5dff:fe05:c8dc/64 scope link 
       valid_lft forever preferred_lft forever

ip route で最優先のrouteがトンネルになっていれば、無事ここ経由ですべて通信できる

default routeから消して接続を切断する

$ sudo ip route del default dev ip6tnl1


router Share Tweet