SlideShare a Scribd company logo
1 of 33
Download to read offline
FreeBSD でおうちのルーター
vnet jail + IPoE + DS-Lite で幸せになろう
2017年6月30日
於 FreeBSD workshop
小野 寛生
参考にした文書
●
以下の文書を参考にしています。
– 旧バージョン
● 「FreeBSDでおうちのルーター」 (2014/5/17, CBUG)
– vnet jail の利用
● Cheerful days
「FreeBSD 10.1-RELEASE + ezjail + VIMAGE」
– PPPoE (mpd5) …… まきHiki (消滅?)
– IPv6, IPoE
●
がとらぼ 「FreeBSDルーターでIPoE」
– DS-Lite
● IIJてくろぐ 「DS-Lite(RFC6333)をMacOS Xで利用する」
●
がとらぼ 「FreeBSDルーターでDS-Lite」
– ipfw …… RTFM
はじめに
●
ブロードバンド無線LANルーターとかあるのになん
で FreeBSD でちまちま設定すんの?
趣味です
やりたいこと
●
FreeBSD の PC 一台で
– 外とつなぐルーター
– ファイアウォール (+NAT)
– 内部向けのサーバー
– DMZでなんかサービス
とかやりたい。
●
外から接続するのが host 環境ってのはやだな。
制約
●
非力なPCなので、ハイパーバイザはちょっと…
– Atom N270 (i386)
– メモリ 2GiB
●
一般人なので、Cisco とかSEILとかはちょっと…
– 自宅にラックとかもちょっと…
vnet jail
●
jail + ネットワークスタック分離
– (Solaris zone を目指した?)
●
kernel config に
options VIMAGE
が必要
– 12-current ではもう少しで GENERIC 入り
– pf は guest でパニックすることがまだあるよう
● 12-current ではだいぶなおっているよう
VIMAGE (vnet) による分離の例
●
通常の jail
– 同じ interface が見える
● ifconfig -a
● jexec jname ifconfig -a
●
vnet jail
– interface は vnet (host と jail ごと) に所属する
– 例
● ifconfig epair0 create → host に epair0a, epair0b
● ifconfig epair0b vnet jname
– ifconfig -a → epair0a だけ出てくる
– jexec jname ifconfig -a → epair0b だけ出てくる
構成 (物理?)
EeeBox
Intel(R) Atom(TM) CPU N270
RAM 2GiB
HDD 80GB くらい
構成 (ネットワーク?) before
mpd
+
ipfw
ISP
Flets Sq.
bridge0
re0
ng0
ng1
hub
epair0a
ue0
epair0b
epair2b
inner
gate
家用の無線
APもこっち
re0
forwarding 有効
何をしていたか (before)
●
host
– FreeBSD 10-stable
●
gate
– mpd5 で ISP と Flets sq. に PPPoE 接続
– ipfw + nat でゲートウェイ&ファイアウォール
– unbound で cache DNS server
– sshd (の予定)
●
inner
– yadifad で 勝手 authoritative DNS server
● 勝手 = private IP に振っている
– isc-dhcpd bridge はこれのための面も
構成 (ネットワーク?) after
ISP
bridge0
re0hub
epair0a
ue0
epair0b
inner
gate
家用の無線
APもこっち
re0
ipv4 forwarding 有効
Ipv6 forwarding 無効
ipfw
gif0
dc
epair4bepair1b
※注意: re0 ではなく bridge0 にアドレスを振らないと
     通信しない。
何をしているか (after)
●
host
– FreeBSD 11-stable
●
gate
– IPoE で IPv6接続
– DS-Lite で IPv4接続
– ipfw で ファイアウォール
– Unbound で cache DNS server
●
dc
– Samba4 で AD DC
●
inner
– isc-dhcpd
VIMAGE (vnet) による分離
●
jexec gate sockstat -46
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
unbound unbound 84054 3 udp4 192.168.8.1:53 *:*
unbound unbound 84054 4 tcp4 192.168.8.1:53 *:*
unbound unbound 84054 5 udp6 2409:10:----:53 *:*
unbound unbound 84054 6 tcp6 2409:10:----:53 *:*
root inetd 3047 6 tcp4 *:21 *:*
root inetd 3047 7 tcp6 *:21 *:*
root mpd5 2996 16 tcp4 192.168.8.1:5005 *:*
root mpd5 2996 19 tcp4 *:5006 *:*
root syslogd 2966 6 udp4 192.168.8.1:514 *:*
●
あとは、外向けに sshd, http (redirect) を開ける予定
準備
●
VIMAGE kernel
●
Kernel modules
●
devfs.rules
●
vnet jail
●
ファイアウォール (ipfw)
準備: kernel
●
VIMAGE
– Kernel configuration に
options VIMAGE
を追加して kernel 再構築が必要
– 12.0R からは GENERIC に入る
●
/boot/loader.conf
– Jail の中で使いたいモジュールは予めloadしておく
ipfw_load=YES
ipfw_nat_load=YES
準備:kernel:参考
●
mpd5 を動かしたい場合は
ng_socket_load=YES
ng_tee_load=YES
ng_ether_load=YES
ng_pppoe_load=YES
ng_mppc_load=YES
ng_iface_load=YES
ng_ppp_load=YES
ng_tcpmss_load=YES
ng_ipfw_load=YES
ng_ipacctl_load=YES #optional
準備: devfs.rules
●
もとからある devfsrules_jail ルールをもとに、log
をみえるようにする。
[devfsrules_unhide_log=10]
add path log unhide
[devfsrules_jail_bpf=11]
add include $devfsrules_jail
add include $devfsrules_unhide_log
add path ‘bpf*’ unhide #bpf はmpd5のため
[devfsrules_jail_log=12]
add include $devfsrules_jail
add include $devfsrules_unhide_log
準備: jail
●
ez-jail で jail を用意し、jail.conf で制御する。
– ez-jail: 複数のjailを管理するのが楽。qjail とかでも
– jail.conf: 公式な jail の制御方法
●
rc.conf で bridge0, epair0 を作っておく。
– 昔は vnet が有効で destroy するとメモリーリークした。
– 今は、jail.conf で create, destroy しても大丈夫。
cloned_interfaces=”bridge0 epair0”
ifconfig_epair0a=”mtu 9216”
ifconfig_epair0b=”mtu 9216”
ifconfig_bridge0=”addm re0”
jail.conf (1)
allow mount;
allow sysvipc;
vnet; # VIMAGEを有効にする
host.hostname = “${jname}.example.net”;
path = “/usr/jails/${jname};”
devfs_ruleset = 12;
jail.conf (2)
exec.clean;
exec.consolelog 
= “/var/log/jail_${jname}_console.log;
exec.system_user = “root”;
exec.jail_user = “root”;
mount.fstab = “/etc/fstab.${jname};
mount.devfs;
mount.fdescfs;
mount.procfs;
jail.conf (3)
$ifconfig = “/sbin/ifconfig”;
exec.prestart += 
“${ifconfig} epair${ifn}a up > …”;
exec.prestart += 
“${ifconfig} bridge0 addm epair${ifn}a > ...”;
exec.poststart += 
“${ifconfig} epair${ifn}b vnet ${jname} > ...”;
exec.poststart += “jexec ${jname} 
${ifconfig} epair${ifn}b ${ip4addr}/24 > ...”;
exec.poststart += 
“jexec ${jname} /bin/sh /etc/rc”;
jail.conf (4)
exec.stop += “/bin/sh /etc/rc.shutdown”;
exec.poststop += 
“${ifconfig} bridge0 deletem epair${ifn}a”;
exec.poststop += 
“${ifconfig} epair${ifn}a down”;
jail.conf (5)
gate {
depend = “inner”, “dc”;
devfs_ruleset = 11;
allow_rawsocket; #mpd5
securelevel = 2;
vnet.interface = “ue0 gif0”;
$ifn = 0;
$ip4addr = 192.168.0.1;
}
構成 (ネットワーク?) after
ISP
bridge0
re0hub
epair0a
ue0
epair0b
inner
gate
家用の無線
APもこっち
re0
ipv4 forwarding 有効
Ipv6 forwarding 無効
ipfw
gif0
dc
epair4bepair1b
IPoE と DS-Lite (rc.conf)
●
vnet jail (gate) の rc.conf
cloned_interfaces=”gif0”
# ipv6
ifconfig_ue0=”up”
ifconfig_ue0_ipv6=”inet6 accept_rtadv”
ipv6_cpe_wanif=”ue0”
ipv6_gateway_enable=”YES”
# DS-Lite
ifconfig_gif0_ipv6=
”inet6 tunnel $WAN $AFTR”
defaultrouter=”-iface gif0”
gateway_enable=”YES”
実際はうまく動かなかった
●
vnet jail (gate) の rc.conf (修正)
cloned_interfaces=”gif0”
# ipv6
ifconfig_ue0=”up”
ifconfig_ue0_ipv6=”inet6 $WAN accept_rtadv”
ipv6_defaultrouter=”fe80::xxxx:xxxx:xxxx%ue0”
ipv6_gateway_enable=”NO”
# DS-Lite
ifconfig_gif0_ipv6=
”inet6 tunnel $WAN $AFTR”
defaultrouter=”-iface gif0”
gateway_enable=”YES”
ファイアウォール (ipfw)
●
いろいろ省略
– プライベートアドレス (v4)、リンクローカルアドレス(v6)
の排除とか
– icmp, ipv6-icmp は何を通すかとか
●
マニュアルを参考に、ip 部分をどう組み立てるかと
いう考え方を次ページに簡単にまとめた。
ipfw のルールを組み立てる
●
# anti IP spoofing (antispoof or verrevpath option)
add deny ip from any to any not antispoof in
●
# 出入口の NIC には IPv6 しか来ないはず
add deny ipv4 from any to any via ue0
●
# 動的ルールのチェックとルールに無いパケットの拒否
add check-state
add deny tcp from any to any established
●
# 動的ルール生成
add pass udp from any to any domain keep-state
add pass tcp from any to any https setup keep-state
●
# IPv6 は最後に素通し (DS-Lite)
add pass ipv6 from any to any
NPTv6
●
せっかくだから、IPv6 でも通信したい。
●
ファイアウォールは入れたい。
●
11-stable には (ということは11.1Rから) NPTv6 サ
ポートが入った。
→ 試してみたが、うまくゆかない
●
net.inet6.ip6.forwarding=1 すると、IPv4 (DS-
Lite) の通信が死ぬ。IPv6 は通信できる。
その他
●
DS-Lite の下だと mosh が使えないみたい
●
そういうわけで、NPTv6 を介して IPv6 でも通信し
たいのですが…
まとめ
●
vnet jail を使うことで、ハイパーバイザを使わない
でも
だけの構成で ファイアウォール + サーバーいくつ
かという環境をそれなりにネットワーク分離しつつ
構築できます。
●
面倒くさい割には、「無線LANルーター買ってくれ
ばいいんじゃね」という感じですが、趣味ですので。

More Related Content

What's hot

10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
Takashi Hoshino
 
Os detection with arp
Os detection with arpOs detection with arp
Os detection with arp
David Clark
 

What's hot (20)

UE4のMediaFrameworkについて
UE4のMediaFrameworkについてUE4のMediaFrameworkについて
UE4のMediaFrameworkについて
 
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
 
スクラム再入門
スクラム再入門スクラム再入門
スクラム再入門
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
 
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたはりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします
 
(公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017 (公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
 
Yocto bspを作ってみた
Yocto bspを作ってみたYocto bspを作ってみた
Yocto bspを作ってみた
 
仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理
 
IETF 104 Hackathon VPP Prototyping Stateless SRv6/GTP-U Translation
IETF 104 Hackathon VPP Prototyping Stateless SRv6/GTP-U TranslationIETF 104 Hackathon VPP Prototyping Stateless SRv6/GTP-U Translation
IETF 104 Hackathon VPP Prototyping Stateless SRv6/GTP-U Translation
 
Os detection with arp
Os detection with arpOs detection with arp
Os detection with arp
 
Git由超淺入超深
Git由超淺入超深Git由超淺入超深
Git由超淺入超深
 
SharePoint Framework Extension 基礎講座
SharePoint Framework Extension 基礎講座SharePoint Framework Extension 基礎講座
SharePoint Framework Extension 基礎講座
 
YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方
 
第2部 自作ライブラリ紹介
第2部  自作ライブラリ紹介第2部  自作ライブラリ紹介
第2部 自作ライブラリ紹介
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
 

Similar to FreeBSDでおうちのルーター

スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
Kiwamu Okabe
 

Similar to FreeBSDでおうちのルーター (20)

Havana版 RDO-QuickStart-4 (140421-Havana-RDO-QuickStart-4.pdf)
Havana版 RDO-QuickStart-4 (140421-Havana-RDO-QuickStart-4.pdf) Havana版 RDO-QuickStart-4 (140421-Havana-RDO-QuickStart-4.pdf)
Havana版 RDO-QuickStart-4 (140421-Havana-RDO-QuickStart-4.pdf)
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
EeePC901AにDebian導入
EeePC901AにDebian導入EeePC901AにDebian導入
EeePC901AにDebian導入
 
How to apt-get from the internal network: remote sshd with kneesocks
How to apt-get from the internal network: remote sshd with kneesocksHow to apt-get from the internal network: remote sshd with kneesocks
How to apt-get from the internal network: remote sshd with kneesocks
 
Hadoop on LXC
Hadoop on LXCHadoop on LXC
Hadoop on LXC
 
Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf)
Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf) Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf)
Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf)
 
Firefox OS + Raspberry Pi
Firefox OS + Raspberry PiFirefox OS + Raspberry Pi
Firefox OS + Raspberry Pi
 
Vyatta 改造入門
Vyatta 改造入門Vyatta 改造入門
Vyatta 改造入門
 
NetBSD/evbarm on Raspberry Pi
NetBSD/evbarm on Raspberry PiNetBSD/evbarm on Raspberry Pi
NetBSD/evbarm on Raspberry Pi
 
Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
FreeBSDで行こう for small server
FreeBSDで行こう for small serverFreeBSDで行こう for small server
FreeBSDで行こう for small server
 
VTI の中身
VTI の中身VTI の中身
VTI の中身
 
Open VZ
Open VZOpen VZ
Open VZ
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
 
VPP事始め
VPP事始めVPP事始め
VPP事始め
 
RDOを使ったOpenStack Havana - Neutron 構築編 :補足資料
RDOを使ったOpenStack Havana - Neutron 構築編 :補足資料RDOを使ったOpenStack Havana - Neutron 構築編 :補足資料
RDOを使ったOpenStack Havana - Neutron 構築編 :補足資料
 
Yesod on Heroku
Yesod on HerokuYesod on Heroku
Yesod on Heroku
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
Displaylink : Reloaded
Displaylink : ReloadedDisplaylink : Reloaded
Displaylink : Reloaded
 

FreeBSDでおうちのルーター