酉の日なのでUTPケーブルで熊手を作ってみた

今日はポッキーの日ですが、酉の市の日でもあります。

酉の市
https://ja.wikipedia.org/wiki/%E9%85%89%E3%81%AE%E5%B8%82

今年の酉の市は11月11日と23日、深夜0時から24時間続きます。

昨晩新宿の花園神社に行ってきました。
沢山の提灯が吊られ、縁起物である熊手が沢山売られていました。

img_4364

小さいのを1つ買ってみましたが、自分でも作ってみたくなりますよね。

img_4368

ということで、みんなの手元にあるUTPケーブルを使って熊手を自作してみます。

素材、道具

  • UTPケーブル
  • ニッパー
  • ケーブルストリッパー
  • 細径電動ドリル

img_4373

ケーブルを剥く

ケーブルストリッパーで 被膜を剥きます。

img_4374

img_4376

被膜を加工

開いて、ドリルで穴を開けていきます。
安全のためダンボール箱に養生テープで固定しつつ作業をしています。

img_4382

img_4383

ケーブルを整形

より線をほどいて、まっすぐにして、いつもの順番に揃えます。

img_4386

img_4389

パーツを組み合わせて整形

被覆の穴にケーブルを通して整形します。

img_4391

img_4393

飾って完成

とりあえずディスプレイに貼ってみました。

img_4395

 

30分ほどで作れます。

みなさんも作ってみてはいかがでしょうか?

もの作りは楽しいです。

DMM.make AKIBA も今日で2周年です。

人狼GM LINE BOT

はじめまして!バーテンツチノコ(仮) の近藤です。六本木のBARで、カクテル作れないバーテンダーをやる傍らで、夜な夜なプログラミングをしています。

人狼をみんなで集まってやる時、人間GM(ゲームマスター)の代わりに司会者をやってくれるLINE BOTを作りました。その名もとろろ人狼BOTです。

今日はそのBOTの紹介をしたいと思います。

 

 

 

使用イメージはこんな感じ

 

とろろ人狼BOTを友達登録し、代表者1名(以後、便宜上「GM」と表記)が「村」を準備し、参加者が集まったら開始合図を行います。

開始後は、会話をしつつ、各々がBOTとやりとりをしながらゲームを進行していきます。

 

ゲームの流れを順を追ってご紹介します。

1.友達登録すると、名前を聞かれるので答えます

2.左上の、「村を作成」をタップすると「村」を作成できるので、友達にQRコードを教えて参加してもらいます

※参加する側(うさぎさん)のLINE(先ほどとは別人物のLINEです)

3.人数を確認。こんな感じに5人集まりました

4.村を開始するとこんな感じ

村人3人、人狼1匹、占い師1人がいるそうです。自分(とろろ) は占い師でした。このメッセージは全員宛にアナウンスされます

 

~~ここから、実際には話し合いが始まります~~

うさぎ『ねこさんが人狼かな?』

ねこ『いや、ねずみさんじゃないかな』

ひつじ『そうかなあ』

ねずみ『うさぎは人間だと思うな』

~~~~~~~~~~~~~~~~~~~~~

(※話し合いは一例です。実際にはもっと殺伐とする可能性があります)

5. といった話し合いの結果、自分が人狼だと疑わしいと思ったうさぎさんに投票することにしましょう

6.皆の投票が済んだら、GMは「時間を進める」コマンドを使います。この時、未投票の人がいると警告が表示されます

うさぎさんが処刑されてしまいました。(※うさぎさんは、実は村人でした)

7.夜が来ます。夜の間は誰とも会話禁止で、各々が淡々と自分の能力を使います
自分(とろろ) は占い師なので、占い先をセットしましょう
ひつじさんを占いたいと思います

8.全員が能力をセットしたら、翌朝に時間を進めます

ねずみさんが人狼に殺されてしまいました。
占いの結果、ひつじさんは人狼だったので、他のメンバーにそれを伝え、ひつじさんへ票を入れてもらうように説得します。

9.投票を行い、時間を進める

10.決着

13393054_1144158248940477_1216561269_n

 

いかがでしたでしょうか。キャプチャを淡々と貼り付けただけの紹介でしたが、ゲームの流れは以上です。

★LINEがインストールさえされていればアプリインストール・ユーザ登録不要

★それぞれがBOTを通じてコマンド入力を行うので、自分の挙動を隠したりする必要がなく進行がスムーズ

★GMが不要になるので、全員で同じ情報量・立場でゲームに参加出来る

何度かテストプレイをしていますが、上記の点でたいへんご好評をいただいております!

 

とろろ人狼Bot(@tororo_jinro) というTwitterアカウントを作っております。

公開出来ると判断でき次第、LINE QRコードを公開しますので、良かったらフォローしてください(๑´ㅂ`๑)

 

ではでは

 

 

補足:GM用 チートシート

自宅のLinuxルータをIPv6対応しました

メリークリスマスです。ライトノベル好きのツチノコです。路地裏バトルプリンセスは読んでいるものとして以下の話をすすめます。

前回の記事でIPv4 Linuxルータを作成するところまで紹介しました。これで6000万回線くらいにLinuxルータを普及できたように思います。

今回の記事ではIPv6対応の部分について進めていきます。内容はこんな感じです。
・Router Advertisementふりかえり
・デザインをどうするか考える
・パッケージのインストールと設定
設定の部分は前回の記事と同じく設定ファイルを貼り付けてあるので以下長いです。

Router Advertisementふりかえり

以降の説明で必要になるので、デザインの前にRouter Advertisementを雑にふりかえります。
router-advertisement

図1 Router Advertisement

上の図1のように、ルータはRouter Advertisementを用いて、各クライアント(PC1, PC2)にIPv6 prefixを配ります。今回作るルータでも当然Router Advertisementを配りたいです。

また、Flets回線においてもRouter Advertisementを用いて各家庭にIPv6 prefixを配布しています。

デザイン

IPv6対応ルータの方式は色々考えることができます。思いついたのは以下の3つでした。
構成A: IPv6パススルーを行う
構成B: IPルーティングを行う
構成C: NAPTを行う

構成A: IPv6パススルーを行う

多くのルータには、IPv4とICMPに対してはrouter(L3)として動作し、IPv6とICMPv6に対してはbridge(L2)として動作する、いわゆるIPv6パススルーが実装されています。
IPv6パススルー

図2 IPv6パススルー

上の図2では、ISPのルータ(Router@ISP)からのRouter Advertisement(RA)が、家庭のルータ(Router@home)を通って、各クライアント(PC1, PC2)に届いています。

Linuxではebtablesを利用すると同様の動作が実現できます。しかし今回は以下の理由により見送ることとしました。
・Router Advertisementを自分で出したいという気持ち!(そういうお勉強のためにLinuxルータを使っている)
・IPv4とIPv6でL2セグメントの範囲が異なってしまうこと
・L2セグメントを大きくしてしまうこと(c.f. VLANで大きいL2 networkを組むことに問題があったのでNVO3技術が出てきた)
・単に他とは違うことがしたいという気持ち

ちなみに、bridgeするのではなく、Neighbor Discovery Proxyを使うという手もあります。Neighbor Discovery ProxyはRFC4389で定義されています。しかしこれもRouter Advertisementを自分で出せるわけではないので一緒です。

構成B: IPルーティングを行う

IPv6でもIPv4と同様にIPルーティングできます。
ip-routing

図3 IPルーティングする

上の図3では、家庭のルータ(Router@home)がRouter Advertisementを受け取り、同じprefix(w:x:y:z::/64)をRouter Advertisementで各クライアントに配布しています(radvdはRouter Advertisementを出すためのLinuxのデーモンです)。あとはeth0とeth1の間で適当にルーティングしてやればうまくいくはずです。

しかし、意外な盲点がありました。radvdの設定ファイルにはRouter Advertisementで配るべきprefixを書かないといけません。しかし、ISPから振られるIPv6 prefixは完全に固定ではないということです(参考: フレッツ・v6オプション について(NTT東日本の場合))。
Prefixが変わる機会はそうそうなさそうですが、とりあえず今回は見送ることにします。

構成C: NAPTを行う

IPv6に対しても、IPv4と同様にNAPT(or NAT or IP masquerade)することができます。
napt

図4 NAPTする

ネットワークをフラグメント化させるので、オープンでセキュアなIPv6対応とは言い難いです。
しかし、上の2つの方式の課題は解決できます。
・自分でRouter Advertisementを出せる
・eth1のアドレスを固定にできる

何か負けた気もしますが、今回はこの実装を使います。
ごちうさのじゃんけんと同じく負けるべき時もあります。

その他考慮すべきことにDHCPv6があります。
WAN側については必須ではないもののDHCPv6 client動作することにします。
LAN側についてはIPv4と同じくDHCPv6 server動作することにします。

パッケージのインストール

今回のルータでは以下のような動作をすることになりました。
・WAN側: Router Advertisementを受信する、DHCPv6 client動作する
・LAN側: Router Advertisementを出す、DHCPv6 server動作する
・WAN側とLAN側の間はNAPTする。

パッケージをインストールします。

# apt-get install wide-dhcpv6-client radvd git-core

・wide-dhcpv6-client: WAN側でDHCPv6 client動作するためのデーモン
・radvd: LAN側でRouter Advertisementを出すためのデーモン
・git-core: DebianだとLAN側でDHCPv6 server動作するためのデーモンがパッケージ化されてないので、git経由で入れる
ちなみにWAN側でRouter Advertisementを受け取るためには特にパッケージは不要です。

設定

それでは頑張って設定していきましょう。
なお、日本語でコメント入れてあるところについて、環境によってエラーになるようなら取ってください。

kernel parameterの設定(/etc/sysctl.conf)

# /etc/sysctl.conf
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# ipv6 forwardingは有効にする
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1

# Router Advertisementはデフォルトでは受信しない
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0

# redirectは受け取らない
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# eth0(WAN)ではRouter Advertisementを受信する
net.ipv6.conf.eth0.accept_ra = 2

ご参考: accept_ra は以下のような設定値を取ります。
0: そのインターフェースでRouter Advertisementを受信しない。
1: そのインターフェースでforwardingが無効なら、Router Advertisementを受信する。
2: そのインターフェースでforwardingが有効でも、Router Advertisementを受信する。

ご参考: 2.2.10. ソースルーティングの無効化

インターフェースの設定(/etc/network/interfaces)

# /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# wan interface
auto eth0
allow-hotplug eth0
iface eth0 inet static
    address 0.0.0.0
    up ifup ppp0
    down ifdown ppp0

iface ppp0 inet ppp
    provider dsl-provider-test

# lan interface
auto eth1
allow-hotplug eth1
iface eth1 inet static
    address 192.168.1.254
    netmask 255.255.255.0
iface eth1 inet6 static
    address fd00:01fe:0:0:0:0:0:1
    netmask 64

WAN側はRouter AdvertisementでIPv6アドレスを設定されるのでここに記述することはありません。
LAN側(eth1)にはIPv6アドレスを設定します。設定するアドレスはユニークローカルIPv6ユニキャストアドレス(ULA)を利用します(参考: インターネット10分講座:IPv6アドレス~技術解説~)。今回の例ではfd00:1fe::1/64としています。ご利用の際はランダムに生成してください(参考: Unique Local IPv6 Generator)。

DHCPv6 clientの設定(/etc/wide-dhcpv6/dhcp6c.conf)

# /etc/wide-dhcpv6/dhcp6c.conf

interface eth0 {
  information-only;

  send rapid-commit;
  send ia-pd 0;
  request domain-name-servers;
  request domain-name;
};

id-assoc pd 0 {
  prefix-interface eth0 {
    sla-id 0;
    sla-len 0;
  };
};

eth0からPrefix Delegation(参考: 書いて覚えるDHCPv6-PD)を要求します。不要な気もしていますが、eth0が受信しているRouter AdvertisementにOther Flagが立っているので念のため。

Router Advertisement Daemonの設定(/etc/radvd.conf)

# /etc/radvd.conf

interface eth1 {
  AdvSendAdvert on;
  AdvManagedFlag off;
  AdvOtherConfigFlag on;
  AdvLinkMTU 1394;

  prefix fd00:01fe::/64 {
    AdvOnLink on;
    AdvAutonomous on;
    AdvRouterAddr on;
  };

};

eth1からRouter Advertisementを送信します。配布するprefixはfd00:01fe::/64です。

DHCPv6 serverの設定(/etc/dhcp/dhcpd6.conf)

Debianのisc-dhcp-serverパッケージはDHCP serverをインストールしてくれるものの、IPv4用のサービス登録や設定のみなので、IPv6用のサービス登録や設定を行う必要があります。設定ファイルと簡単なスクリプトを作成してありますのでそれを使います。

# git clone http://github.com/wataken44/debian-isc-dhcp-server-v6.git
# cd debian-isc-dhcp-server-v6
# sh scripts/install.sh

これでisc-dhcp-server6というサービスが登録されます。あとは設定を入れるだけです。

# /etc/dhcp/dhcpd6.conf

# ddns-update-style should be none for DHCPv2
ddns-update-style none;

shared-network LAN6 {
  subnet6 fd00:01fe::/64 {
    range6 fd00:01fe:0:0:0:1:0:2 fd00:01fe:0:0:0:1:0:1000;
    authoritative;
    default-lease-time 28800;
    max-lease-time 57600;
    option dhcp6.name-servers fd00:1fe::1;
  }
}

DNS resolverの設定(/etc/unbound/unbound.conf)

# /etc/unbound/unbound.conf
# See the unbound.conf(5) man page.
include: "/etc/unbound/unbound.conf.d/*.conf"

server:
  interface: 192.168.1.254
  interface: fd00:1fe::1
  access-control: 192.168.1.0/24 allow
  access-control: fd00:1fe::1/64 allow
  unwanted-reply-threshold: 10000000

LAN側(fd00:1fe::/64)からの問い合わせに応答します。

FirewallとIP masqueradeの設定(ip6tables)

#!/bin/sh
# ip6tables.sh

WAN_IF=eth0
LAN_IF=eth1
LAN_SUBNET=fd00:1fe::/64

# いったんルールをflush
ip6tables -t filter -F
ip6tables -t mangle -F
ip6tables -t nat -F
ip6tables -F

# filter tableはdefaultではINPUT, FORWARDはDROP, OUTPUTはACCEPT
ip6tables -t filter -P INPUT DROP
ip6tables -t filter -P OUTPUT ACCEPT
ip6tables -t filter -P FORWARD DROP

# loopbackはACCEPT
ip6tables -t filter -A INPUT -i lo -j ACCEPT
# LAN側はACCEPT
ip6tables -t filter -A INPUT -i $LAN_IF -j ACCEPT
# セッション確立後はACCEPT
ip6tables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# ICMPv6は利用しないredirectだけDROPし、他はACCEPT
ip6tables -t filter -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type redirect -j DROP
ip6tables -t filter -A INPUT -p ipv6-icmp -j ACCEPT

# LAN側からWAN側にForwardされる通信はACCEPT
ip6tables -t filter -A FORWARD -s $LAN_SUBNET -o $WAN_IF -j ACCEPT
# セッション確立後はACCEPT
ip6tables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# ICMPv6はecho-request(ping)/echo-reply(pong)のみ許可
ip6tables -t filter -A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type echo-request -j ACCEPT
ip6tables -t filter -A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type echo-reply -j ACCEPT

# mangle tableはすべてACCEPT
ip6tables -t mangle -P PREROUTING ACCEPT
ip6tables -t mangle -P INPUT ACCEPT
ip6tables -t mangle -P FORWARD ACCEPT
ip6tables -t mangle -P OUTPUT ACCEPT
ip6tables -t mangle -P POSTROUTING ACCEPT

# TCP MSSをpMTUにclampする
ip6tables -t mangle -A FORWARD -s fd00:1fe::/64 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# nat tableはすべてACCEPT
ip6tables -t nat -P PREROUTING ACCEPT
ip6tables -t nat -P INPUT ACCEPT
ip6tables -t nat -P OUTPUT ACCEPT
ip6tables -t nat -P POSTROUTING ACCEPT

# ipv6 masqueradeする
ip6tables -t nat -A POSTROUTING -s fd00:1fe::/64 -o eth0 -j MASQUERADE

IPv4と同じようにIPv6でもシェルスクリプトを作って、アクセス制限やmasqueradeの設定をします。

設定の反映

# sh ip6tables.sh; service netfilter-persistent save; reboot

問題なく設定されていたら、これでデュアルスタックなルータとして動作するはずです。

wataken44@cookie:~$ ping6 google.com -c 4
PING google.com(nrt04s12-in-x05.1e100.net) 56 data bytes
64 bytes from nrt04s12-in-x05.1e100.net: icmp_seq=1 ttl=54 time=3.05 ms
64 bytes from nrt04s12-in-x05.1e100.net: icmp_seq=2 ttl=54 time=3.10 ms

result
わーい。IPv6はいいぞ。

(12/26 追記) カメもはっきりくっきり踊っています。

おわりに

これで家庭用ルータのIPv6対応が出来ました。
世間一般の実装とは違いますが、副次的なメリットとして今回の実装は概ねIPv4と同様の動作をしています。
IPv6の勉強の一歩としてもわかりやすいのではないかと思います。
年末年始の自由工作にいかがでしょうか。

p.s. 転生従者の悪政改革録よいです。

自宅のLinuxルータをIPv6対応しました(予告編)

おはようございます。ライトノベル好きのツチノコです。異世界居酒屋「のぶ」 4杯目はもうみなさん読まれていることと思います。

IPv6が最近盛り上がっているようです(今世紀最高の出来)。ツチノコの巣でもIPv6勉強会が開かれましたスライドによると現状のユーザー側のIPv6接続環境はほぼデュアルスタックとのことです。

ツチノコのひとりとして世間一般に遅れてはいけないと思いましたので、自宅のLinuxルータをIPv6対応にしました。正確には新規にIPv4・IPv6両対応のLinuxルータを新規に作成して切り替えました。
せっかくなので手順をシェアします。といいつつ、今回の記事はIPv4でPPPoE接続するところまでです。
次回はIPv6対応部分のデザインとインストールをします。

なお、ご利用は自己責任でお願いします。また、(特にIPv4部分の)解説はある程度適当です。ツチノコブログの読者なら許してくれるはずです。
以下、設定ファイルを直接貼り付けているので大分長いです。

前提条件とハードウェア

前提条件は以下です。利用環境であるwataken家がこの条件というだけです。
・IPv4はPPPoE方式のプロバイダを利用していること
・IPv6はネイティブ方式のプロバイダを利用しており、IPv6オプションを契約していること
・ひかり電話を利用していないこと

ハードウェアはNICが2portあるPC・サーバが必要です。WAN側・LAN側で1portずつ使います。

作業の流れ

作業の流れは以下のようになっています。今日は(2)までです。
(1) OSのインストールとIPv4用のパッケージのインストールを行う(既存のインターネットに接続可能な環境を利用)
(2) IPv4用の設定を行う(この段階でこのルータでIPv4でインターネット接続可能になる)
(3) IPv6用のパッケージのインストールと設定を行う

OSのインストール

今回はDebian(stretch)を使います。Debian(jessie)でもよいかと思います。
後で必要なパッケージはapt-getでインストールするので、OSインストール時にはパッケージは何も選択しなくてもよいです。

他のディストリビューションを利用する場合は、Kernel version が 3.9.0 以上であることを確認してください。

IPv4用パッケージのインストール

# apt-get update
# apt-get upgrade
# apt-get dist-upgrade
# apt-get install pppoe iptables-persistent isc-dhcp-server unbound ntp ssh

一般に家庭用のルータでは、PPPoE client、FirewallとIP masquerade、DHCP server、DNS resolverが必要になります。それぞれインストールします。
あと、ntpとsshはとりあえずインストールしておきます。お好みでtcpdumpなんかもいれていいと思います。

IPv4用の設定

ここからIPv4用の設定をしていきます。
作業の最後にrebootして設定を反映するので、設定ファイルを編集後にそれぞれserviceのrestartなどは不要です。

kernel parameterの設定(/etc/sysctl.conf)

# /etc/sysctl.conf
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

ルータなのでforwardingを有効にします。

インターフェースの設定(/etc/network/interfaces)

#/etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# wan interface
auto eth0
allow-hotplug eth0
iface eth0 inet static
    address 0.0.0.0
    up ifup ppp0
    down ifdown ppp0

iface ppp0 inet ppp
    provider dsl-provider-test

# lan interface
auto eth1
allow-hotplug eth1
iface eth1 inet static
    address 192.168.1.254
    netmask 255.255.255.0

eth0をWAN側、eth1をLAN側として利用します。
eth1(LAN側のインターフェース)は通常通りIP addressとnetmaskを設定します。
eth0(WAN側のインターフェース)はIP address無し(address 0.0.0.0)でupする、up時にppp0をupする、ppp0は/etc/ppp/peers/dsl-provider-testに基づいてpppoe接続する設定です。

pppoeの設定(/etc/ppp/peers/dsl-provider-test, /etc/ppp/chap-secrets)

# /etc/ppp/peers/dsl-provider-test
# Configuration file for PPP, using PPP over Ethernet
# to connect to a DSL provider.
#
# See the manual page pppd(8) for information on all the options.

##
# Section 1
#
# Stuff to configure...

# MUST CHANGE: Uncomment the following line, replacing the user@provider.net
# by the DSL user name given to your by your DSL provider.
# (There should be a matching entry in /etc/ppp/pap-secrets with the password.)
user testuser

# Use the pppoe program to send the ppp packets over the Ethernet link
# This line should work fine if this computer is the only one accessing
# the Internet through this DSL connection. This is the right line to use
# for most people.
pty "/usr/sbin/pppoe -I eth0 -T 80 -m 1452"

# The following two options should work fine for most DSL users.

# Assumes that your IP address is allocated dynamically
# by your DSL provider...
noipdefault
# Try to get the name server addresses from the ISP.
usepeerdns
# Use this connection as the default route.
# Comment out if you already have the correct default route installed.
defaultroute

##
# Section 3
#
# You shouldn't need to change these options...

hide-password
lcp-echo-interval 20
lcp-echo-failure 3
# Override any connect script that may have been set in /etc/ppp/options.
connect /bin/true
noauth
persist
mtu 1492

# RFC 2516, paragraph 7 mandates that the following options MUST NOT be
# requested and MUST be rejected if requested by the peer:
# Address-and-Control-Field-Compression (ACFC)
noaccomp
# Asynchronous-Control-Character-Map (ACCM)
default-asyncmap
#/etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
testuser  *  testsecret

/etc/ppp/peers/dsl-provider-test(/etc/network/interfacesでファイル名は指定)はpppoeの設定を行うファイルで、/etc/ppp/chap-secretsはユーザ名・パスワードの対応を格納するためのファイルです。
それぞれファイルの testuser と testsecret はプロバイダのユーザ名・パスワードを入れます。
面倒ならpppoeconfを利用してもいいと思います。

DHCP serverの設定(/etc/dhcp/dhcpd.conf)

# /etc/dhcp/dhcpd.conf
# ddns-update-style should be none for DHCPv2
ddns-update-style none;

# subnet definition
shared-network LAN {
  subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.128 192.168.1.195;
    authoritative;
    default-lease-time 28800;
    max-lease-time 57600;
    option broadcast-address 192.168.1.255;
    option domain-name-servers 192.168.1.254;
    option routers 192.168.1.254;
  }
}

今回は192.168.1.128-195の範囲をDHCPとして利用することにします。また、DNSとgatewayとしてLAN側IP(192.168.1.254)を配布します。

DNS resolverの設定(/etc/unbound/unbound.conf)

# /etc/unbound/unbound.conf
# See the unbound.conf(5) man page.
include: "/etc/unbound/unbound.conf.d/*.conf"

server:
  interface: 192.168.1.254
  access-control: 192.168.1.0/24 allow
  unwanted-reply-threshold: 10000000

LAN側IP(192.168.1.254)からの問い合わせに応答します。

FirewallとIP masqueradeの設定(iptables)

#!/bin/sh
# iptables.sh

WAN_IF=ppp0
LAN_IF=eth1
LAN_SUBNET=192.168.1.0/24

iptables -t nat -F
iptables -t filter -F
iptables -F

iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD DROP

iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -i $LAN_IF -j ACCEPT
iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t filter -A FORWARD -s $LAN_SUBNET -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -t filter -A FORWARD -s $LAN_SUBNET -o $WAN_IF -j ACCEPT
iptables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

iptables -t nat -A POSTROUTING -s $LAN_SUBNET -o $WAN_IF -j MASQUERADE

iptablesはコマンド経由で設定するのが一般的なので、シェルスクリプトを書くことにします。適当な場所に iptables.sh を作成します。

設定の反映

# sh iptables.sh; service netfilter-persistent save; reboot

問題なく設定されていたら、これでIPv4対応のpppoeルータとして動作するはずです。

$ ping www.google.com -c 4
PING www.google.com (173.194.126.244) 56(84) bytes of data.
64 bytes from nrt04s08-in-f20.1e100.net (173.194.126.244): icmp_seq=1 ttl=52 time=4.83 ms
64 bytes from nrt04s08-in-f20.1e100.net (173.194.126.244): icmp_seq=2 ttl=52 time=5.09 ms
64 bytes from nrt04s08-in-f20.1e100.net (173.194.126.244): icmp_seq=3 ttl=52 time=8.30 ms
64 bytes from nrt04s08-in-f20.1e100.net (173.194.126.244): icmp_seq=4 ttl=52 time=5.65 ms

--- www.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 4.832/5.972/8.305/1.381 ms

次回に続きます。

p.s. 4巻が出た路地裏バトルプリンセスが面白いです。