Raspberry Pi によるWi-Fi AP付PPPoEルーター
自宅で連続稼動しているルーターの構成です。
SoftEther VPNも載せていますが、ここでは省略しています。
また、TP-Link TL-WN823N のドライバ(8192eu.ko)を GitHub 等から入手してインストールする必要があります。
ブロードバンドルーターの構築(pdfファイル 456 kバイト) の内容に基き、一部更新すると共に具体的な設定内容を記載します。
1.ハードウエア構成
・メインボード:Raspberry Pi 2 Model B
・eth1 :Anker A7611011 (RTL8153)
・wlan0 :TP-Link TL-WN823N (RTL8192EU)
*eth0(オンボードNIC)をWAN側、eth1をLAN側に割り当て。
*wlan0はhostapdによりeth1と共にbr0にブリッジ接続とし、cronにて時間帯指定で起動・停止。
*その他条件
・ルーターのホスト名は"gw"とする。
・LAN側ネットワークを192.168.1.0/24 ルーターのIPアドレスを192.168.1.254とする。
・Raspbian Buster Liteをベースとする。(実際は、Raspbian Wheezy Liteを順次アップデートした。)
2.システム設定
★ /etc/hostname
gw
★ /etc/hosts
127.0.0.1 localhost
192.168.1.254 gw.seasky.blue gw
192.168.1.1 seasky.blue
seasky.blue は本サイトのドメイン名で、本サイトのURLにもなっておりDNATにてWebサーバー(192.168.1.1)を公開している。
LAN内からはグローバルIPアドレスでWebサーバーにアクセスできない為、ここでローカルIPアドレスにて登録。
dnsmasqへのDNS問い合わせ応答は、/etc/hostsが優先されるのでLAN内からホスト名でアクセス可能となる。
★ /etc/resolv.conf
nameserver 8.8.8.8
パブリックDNS等を仮に入れておく。 ppp接続後はpppdによりプロバイダのDNSサーバーに置き換えられる。
dnsmasへのDNS問い合わせ応答は/etc/hosts /etc/resolv.confの順に参照された結果となる。
★ /etc/sysctl.conf
net.ipv4.ip_forward=1 # IPフォワードをON
★ /etc/network/interfaces
source-directory /etc/network/interfaces.d
★ /etc/network/interfaces.d/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 0.0.0.0
auto eth1
iface eth1 inet static
address 0.0.0.0
#wlan0は自動でupせず、Wi-Fi APを使用する時間帯のみup(cronでup・down)しています。
#auto wlan0
#iface wlan0 inet static
#address 0.0.0.0
auto br0
iface br0 inet static
address 192.168.1.254
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports eth1 # LAN側NIC
bridge_stp off
bridge_maxwait 10
auto dsl-provider
iface dsl-provider inet ppp
pre-up /bin/ip link set eth0 up # line maintained by pppoeconf
provider dsl-provider
up iptables-restore < /etc/iptables.ipv4.nat #4.で作成したファイルを読み込む。
*尚、DHCPクライアント(dhcpcd等)やOpenresolvは完全に削除しておくこと!!
3.追加パッケージ
★ ntp
WAN側のntpサーバーと時刻同期するとともに、LAN側のntpサーバーとして使用。
・インストール
apt-get install ntp
・設定ファイル
/etc/ntp.conf
pool 0.debian.pool.ntp.org iburst
pool 1.debian.pool.ntp.org iburst
pool 2.debian.pool.ntp.org iburst
pool 3.debian.pool.ntp.org iburst
pool ntp.jst.mfeed.ad.jp iburst # 近くの信頼できるサーバーに変更。
restrict -4 default kod notrap nomodify nopeer noquery limited #デフォルトで時間交換の制限なし。
★ bridge-utils
Wi-Fiアダプタ(wlan0)やVPNのtapデバイスをLAN側インタフェースにブリッジ接続する為に導入。
・インストール
apt-get install bridge-utils
・設定ファイル
前述の /etc/network/interfaces.d/interfaces にて、LAN側インタフェースとして br0 を作成し、LAN側NIC eth1 をブリッジ。
★ pppoe
★ pppoeconf
カーネルモードpppの為に追加。
pppoeconfにより、導入時に対話型形式で設定ファイルを自動生成。
・インストール
apt-get install pppoe pppoeconf
・設定ファイル
pppoeconf で対話形式により設定されるファイルのリスト
ファイル 機能
/etc/ppp/peers/dsl-provider pppoeconf がpppoe に合わせて生成した pppd の設定ファイル
/etc/ppp/options pppd のための一般的な実行パラメーター
/etc/ppp/pap-secret PAP のための認証データー (安全上問題ありで使用しない)
/etc/ppp/chap-secret CHAP のための認証データー
その他、NetfilterのMSSクランプ追加スクリプト /etc/ppp/ip-up.d/0clampmss と/etc/ppp/ip-down.d/0clampmssが生成される。
*常時接続の為 /etc/ppp/options に以下を追記。
persist
maxfail 0
これにより、リンクダウン時に自動で延々再接続を試みる。
*/etc/ppp/peers/dsl-provider
noipdefault
usepeerdns
defaultroute
hide-password
PPPキープアライブの設定 LCPエコーリクエスト3回リトライエラーでPPPoEを再接続。
lcp-echo-interval 20
lcp-echo-failure 3
connect /bin/true
noauth
persist
mtu 1454 #LCPネゴシエーションで決まった値が優先されるので、通常はこの数値を変えても反映されない。
noaccomp
default-asyncmap
plugin rp-pppoe.so eth0 #カーネルモードPPPのプラグイン
user “xxxxxxx@xxx.so-net.ne.jp” # プロバイダのPPP接続ユーザーアカウント
*/etc/ppp/chap-secret
“xxxxxxx@xxx.so-net.ne.jp” * “password” # PPP接続ユーザーアカウントとパスワード
★ dnsmasq
DHCPサーバーとDNSキャッシュ機能の為に追加。
・インストール
apt-get install dnsmasq
・設定ファイル
* /etc/dnsmasq.conf
dns-serverとntp-serverとしても192.168.1.254を指定。
interface=br0
dhcp-range=192.168.1.20,192.168.1.40,12h
dhcp-option=option:netmask,255.255.255.0
dhcp-option=option:router,192.168.1.254
dhcp-option=option:dns-server,192.168.1.254
dhcp-option=option:ntp-server,192.168.1.254
★ hostapd
Wi-FiアダプタのAPモード設定とLAN側へのブリッジ接続の為に追加。
・インストール
apt-get install hostapd
・設定ファイル
* /etc/hostapd/hostapd.conf
interface=wlan0 # APとして使用するデバイスを指定
bridge=br0 # 起動後br0にブリッジ接続
driver=nl80211 # カーネルモジュール(mac80211)とのインタフェースドライバを指定
ssid=RaspberryPi # SSIDを設定
IEEE 802.11n 関連の設定
hw_mode=g # 2.4 GHz帯を指定
channel=6 # チャンネル番号を指定 [HT40-]の場合 5~13
ieee80211n=1 # 11nを有効
wmm_enabled=1 # QoS制御を有効
ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40] # チャンネルボンディングの設定
認証アルゴリズム他
macaddr_acl=0 # MACアドレスが拒否リストになければ受け入れる
auth_algs=1 # 許可する認証アルゴリズムを指定 1 = 共有キー認証
ignore_broadcast_ssid=0 # 1 の場合SSIDを公開しない
認証方式を WPA2-PSK (WPA2事前共有鍵認証) として設定
wpa=1 # WPA2を有効化
wpa_key_mgmt=WPA-PSK # 受け入れる鍵の管理アルゴリズムを指定
wpa_passphrase=“passphrase" # WPA-PSK 用の パスフレーズ
rsn_pairwise=CCMP # 暗号化アルゴリズムを指定 CCMPはAESに基づく暗号化
なお、hostapdは自動で起動せず、Wi-Fi APを使用する時間帯のみ起動(cronで起動・停止)しています。
インストール直後やアップデート後は自動起動になりますので、insserv -r hostapd で無効化しておきます。
Busterでinsserv -r hostapd とするとマニュアル起動も出来なくなるので、systemctl unmask hostapd 且つ systemctl disable hostapd
★ rngd
乱数のエントロピー増強の為に追加。
各種暗号化の為に使用される乱数は、/dev/random より得ますが、ヘッドレスな環境ですとエントロピーが不足しがちです。
cat /proc/sys/kernel/random/entropy_avail の値が1000以上であることが望ましく、少なすぎる場合はWi-Fi通信速度が極端に遅くなるなどの問題が発生します。
そこで、rngd 使用することで、環境侵害とハードウェア乱数ジェネレーターの両方を使用してエントロピーを抽出できます。
・インストール
apt install rng-tools
通常はインストールするだけでデーモンとして動作します。
★ msmtp
各種メール通知の為に追加。(sendmail等が入っている場合は削除してから。)
ssmtpを使用していましたが、aptから消えたので置き換えました。
・インストール
apt install msmtp
apt install msmtp-mta
・設定ファイル
* /etc/msmtprc (chown root.root , chmod 600です。)
defaults
syslog on
tls on
auth on
syslog LOG_MAIL
account So-net
host mail.so-net.ne.jp
port 587
from root@seasky.blue
user xxxxxxx@xxx.so-net.ne.jp
password “password”
account default : So-net
crontabで MAILTO=xxxxx@gmail.com 等としておけば MAILTO= で指定したアドレス宛にメール通知されます。
ssmtpより明快で使い易い!
------以下はssmtpの際のコンフィグです--------
・インストール
apt-get install ssmtp
・設定ファイル
* /etc/ssmtp/ssmtp.conf
mailhub=mail.so-net.ne.jp:587
AuthUser=xxxxxxx@xxx.so-net.ne.jp
AuthPass=“password”
UseSTARTTLS=YES
hostname=seasky.blue
本設定により、root@gw宛のメールは so-netのSMTPサーバーによって xxxxx@gmail.com 宛に転送される。
crontabでMAILTO=root等としておけばメール通知されます。
4.Netfilter設定ファイル
・ルーターの中核機能であるファイアウォールやNAT(SNAT/DNAT)を Netfilter のみで実現します。
★ /usr/local/bin/make_iptable.sh
・iptablesコマンドによるスクリプト
make_iptable.sh(テキストファイル 4kB
PPPoE未接続の状態で make_iptable.sh を実行し、sudu iptables-save > /etc/iptables.ipv4.nat にてiptables の設定をファイルに保存しておく。
PPPoE接続確立後に make_iptable.sh を実行して /etc/iptables.ipv4.nat のファイル出力を行った場合、下記 mangleの項目(以下のMSS クランプ)は、pppoe接続時にスクリプト(/etc/ppp/ip-up.d/0clampmss)で追加された項目なので、次回起動時に重複しないよう削除しておく。
*mangle
-A FORWARD -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:65495 -j TCPMSS --clamp-mss-to-pmtu
COMMIT
5.SDカードのROM化
・下の手順で停電などの電源ブチ切に備えます。
OverlayfsによるRaspberry PiのSDカードROM化
以上でルーターとしての基本的な動作は完成。
6.その他
★ DDNSクライアント(MyDNS.JP)
・/etc/ppp/ip-up.d/mydns-ipnotice
#!/bin/sh
wget -q -O /dev/null http://mydnsxxxxxx:password@www.mydns.jp/login.html
新しいIpアドレスをmsmtpでメール通知
_IP=$(hostname -I) || true
if [ “$_IP” ]; then
echo “GW0 started! IP address is” “$_IP” | msmtp -C /etc/msmtprc xxx@gmail.com
fi
exit 0
PPPoE接続確立直後に /etc/ppp/ip-up.d/ 配下のスクリプトが実行されることでIPアドレス通知を実行。
・/etc/crontab
7,17,27,37,47,57 * * * * root /usr/bin/wget -q -O /dev/null http://mydnsxxxxxx:password@www.mydns.jp/login.html
PPPoE接続後は10分毎に実行
★ Wi-Fi APのタイマー起動・停止
*Wi-Fiアダプタは消費電力が高めなので、使用する時間帯のみUP。
・/usr/local/bin/ap-up.sh
#!/bin/sh
sudo service hostapd start
・/usr/local/bin/ap-down.sh
#!/bin/sh
sudo service hostapd stop
・/etc/crontab
00 20 * * 1-5 root /usr/local/bin/ap-up.sh
30 19 * * 6,7 root /usr/local/bin/ap-up.sh
15 22 * * 1-4,7 root /usr/local/bin/ap-down.sh
00 23 * * 5,6 root /usr/local/bin/ap-down.sh
★ NATでの通信速度
100Mのサービスなんで、とりあえずボトルネックにはなってません。
多少遅くたって、つまらないコンシューマー向けルーターから開放されるのが何より嬉しい(笑)

