More Related Content Similar to FreeBSDでおうちのルーター (20) FreeBSDでおうちのルーター2. 参考にした文書
●
以下の文書を参考にしています。
– 旧バージョン
● 「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
5. やりたいこと
●
FreeBSD の PC 一台で
– 外とつなぐルーター
– ファイアウォール (+NAT)
– 内部向けのサーバー
– DMZでなんかサービス
とかやりたい。
●
外から接続するのが host 環境ってのはやだな。
7. vnet jail
●
jail + ネットワークスタック分離
– (Solaris zone を目指した?)
●
kernel config に
options VIMAGE
が必要
– 12-current ではもう少しで GENERIC 入り
– pf は guest でパニックすることがまだあるよう
● 12-current ではだいぶなおっているよう
8. 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 だけ出てくる
11. 何をしていたか (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 はこれのための面も
13. 何をしているか (after)
●
host
– FreeBSD 11-stable
●
gate
– IPoE で IPv6接続
– DS-Lite で IPv4接続
– ipfw で ファイアウォール
– Unbound で cache DNS server
●
dc
– Samba4 で AD DC
●
inner
– isc-dhcpd
14. 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) を開ける予定
17. 準備: kernel
●
VIMAGE
– Kernel configuration に
options VIMAGE
を追加して kernel 再構築が必要
– 12.0R からは GENERIC に入る
●
/boot/loader.conf
– Jail の中で使いたいモジュールは予めloadしておく
ipfw_load=YES
ipfw_nat_load=YES
19. 準備: 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
20. 準備: 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”
23. 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”;
24. 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”;
25. 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;
}
27. 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”
28. 実際はうまく動かなかった
●
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”
30. 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