テキスト v6tokai HandsOn / T.Suzuki 2016/7/23 ===== 準備 ===== VirtualBox の環境設定〜ネットワーク〜ホストオンリーネットワーク でDHCPサーバを設定し、アプライアンスの設定〜ネットワーク〜アダプタ2 にホストオンリーアダプタを追加してホスト側からログインできるようにすると便利。 # dhclient em1 # echo 'ifconfig_em1="DHCP"' >> /etc/rc.conf 日本語キーボードの人は # echo 'keymap="ja.106" >> /etc/rc.conf ===== 課題1 ===== 次のような仮想ネットワークを作成する。 v6server1 - v6router1 - v6server2 (link:1) (link:2) 1. ルータ用jailを作成 /jails/bin/mkrouter v6router1 2. サーバ用jailを作成 /jails/bin/mkserver v6server1 /jails/bin/mkserver v6server2 3. スクリプトを使って仮想ネットワークを作成しIPアドレスを付与 Unique Local Address (fd00::/8) を決定し /64単位でインターフェイスに割り当てる ( http://www.kame.net/~suz/gen-ula.html が便利) 例として fd2a:c2cb:c8a4/48 を得たら、そこから /64 を2つ切り出す。 ifconfig epair0a inet6 fd2a:c2cb:c8a4:1::1 prefixlen 64 ifconfig epair1a inet6 fd2a:c2cb:c8a4:2::1 prefixlen 64 VITOCHA だと tomocha.assignip6('v6router1',epaira,'fd2a:c2cb:c8a4:1::1','64') tomocha.assignip6('v6router1',epairc,'fd2a:c2cb:c8a4:2::1','64') 4. IPv6 forwarding を ON /etc/rc.conf に ipv6_gateway_enable="YES"を追記 あるいは sysctl -w net.inet6.ip6.forwarding=1" 5. RTADVD を起動 /etc/rc.conf に rtadvd_enable="YES" rtadvd_interfaces="epair0a epair1a" を追記し起動 /etc/rc.d/rtadvd start 6. RA (RTADV) を受信できるようにする 各サーバにて sysctl net.inet6.ip6.accept_rtadv=1 ifconfig epair0b inet6 accept_rtadv 7. RA が受信され IPv6 アドレスが自動割当される  rtsol -D epair0b などとして、手動で RS を発行して動作を確認 === 課題1のスクリプト === #!/usr/local/bin/ruby # T.Suzuki require ('./vitocha.rb') # jails path $jails="/jails" tomocha=Operator.new #---------------------------------------------------------- tomocha.setuprouter('v6router1') # epaira,epairb=tomocha.createpair tomocha.connect('v6router1',epaira) tomocha.assignip6('v6router1',epaira,'fd2a:c2cb:c8a4:1::1','64') tomocha.up('v6router1',epaira) # epairc,epaird=tomocha.createpair tomocha.connect('v6router1',epairc) tomocha.assignip6('v6router1',epairc,'fd2a:c2cb:c8a4:2::1','64') tomocha.up('v6router1',epairc) # system("jexec v6router1 sysctl -w net.inet6.ip6.forwarding=1") system("jexec v6router1 /etc/rc.d/rtadvd start") #---------------------------------------------------------- tomocha.setupserver('v6server1') tomocha.connect('v6server1',epairb) tomocha.up('v6server1',epairb) system("jexec v6server1 sysctl -w net.inet6.ip6.accept_rtadv=1") system("jexec v6server1 ifconfig #{epairb} inet6 accept_rtadv") #---------------------------------------------------------- tomocha.setupserver('v6server2') tomocha.connect('v6server2',epaird) tomocha.up('v6server2',epaird) system("jexec v6server2 sysctl -w net.inet6.ip6.accept_rtadv=1") system("jexec v6server2 ifconfig #{epaird} inet6 accept_rtadv") #---------------------------------------------------------- ===== 課題2 ===== 以下の仮想ネットワークを作成する v6server1 - v6router1 - v6bridge1 - v6router2 - v6server2 (link:1) (link:2) (link:3) --- v6router2 を作成 --- /jails/bin/mkrouter v6router2 --- v6bridge1 を作成 --- /jails/bin/mkrouter v6bridge1 === 課題2のスクリプト === #!/usr/local/bin/ruby # T.Suzuki require ('./vitocha.rb') $jails="/jails" tomocha=Operator.new #---------------------------------------------------------- tomocha.setuprouter('v6router1') # epaira,epairb=tomocha.createpair puts "generate epair: #{epaira},#{epairb}" tomocha.connect('v6router1',epaira) tomocha.assignip6('v6router1',epaira,'fd2a:c2cb:c8a4:1::1','64') tomocha.up('v6router1',epaira) # epairc,epaird=tomocha.createpair puts "generate epair: #{epairc},#{epaird}" tomocha.connect('v6router1',epairc) tomocha.assignip6('v6router1',epairc,'fd2a:c2cb:c8a4:2::1','64') tomocha.up('v6router1',epairc) # #system("jexec v6router1 sysctl -w net.inet6.ip6.forwarding=1") #system("jexec echo rtadvd_enable='YES' >> /etc/rc.conf") #system("jexec echo rtadvd_interfaces='epaira' >> /etc/rc.conf") #system("jexec v6router1 /etc/rc.d/rtadvd start") #---------------------------------------------------------- tomocha.setuprouter('v6router2') # epaire,epairf=tomocha.createpair puts "generate epair: #{epaire},#{epairf}" tomocha.connect('v6router2',epaire) tomocha.assignip6('v6router2',epaire,'fd2a:c2cb:c8a4:2::2','64') tomocha.up('v6router2',epaire) # epairg,epairh=tomocha.createpair puts "generate epair: #{epairg},#{epairh}" tomocha.connect('v6router2',epairg) tomocha.assignip6('v6router2',epairg,'fd2a:c2cb:c8a4:3::1','64') tomocha.up('v6router2',epairg) # #system("jexec v6router2 sysctl -w net.inet6.ip6.forwarding=1") #system("jexec echo rtadvd_enable='YES' >> /etc/rc.conf") #system("jexec echo rtadvd_interfaces='epairg' >> /etc/rc.conf") #system("jexec v6router2 /etc/rc.d/rtadvd start") #---------------------------------------------------------- tomocha.setupbridge('v6bridge1') tomocha.connect('v6bridge1',epaird) tomocha.up('v6bridge1',epaird) tomocha.connect('v6bridge1',epairf) tomocha.up('v6bridge1',epairf) #---------------------------------------------------------- tomocha.setupserver('v6server1') tomocha.connect('v6server1',epairb) tomocha.up('v6server1',epairb) system("jexec v6server1 sysctl net.inet6.ip6.accept_rtadv=1") system("jexec v6server1 ifconfig #{epairb} inet6 accept_rtadv") #---------------------------------------------------------- tomocha.setupserver('v6server2') tomocha.connect('v6server2',epairh) tomocha.up('v6server2',epairh) system("jexec v6server2 sysctl net.inet6.ip6.accept_rtadv=1") system("jexec v6server2 ifconfig #{epairh} inet6 accept_rtadv") #---------------------------------------------------------- --- v6router1 に RA の設定 --- # jexec v6router1 tcsh # cat >> /etc/rc.conf ipv6_gateway_enable="YES" rtadvd_enable="YES" rtadvd_interfaces="epair1a" # /etc/rc.d/rtadvd start --- v6router2 に RA の設定 --- # jexec v6router2 tcsh # cat >> /etc/rc.conf ipv6_gateway_enable="YES" rtadvd_enable="YES" rtadvd_interfaces="epair4a" # /etc/rc.d/rtadvd start --- 補足 --- tomocha.setupbridge(機器名) とやると、以下のメソッドがブリッジ vbridge0 を作成してくれます。 def initialize(jailname) super # override equipment.rb sh=Shell.new sh.transact{ bridgename=ifconfig("bridge create").to_s ifconfig("#{bridgename} vnet #{jailname}") jexec(jailname,"ifconfig #{bridgename} name vbridge0") jexec(jailname,"ifconfig vbridge0 up") } end そして tomocha.connect(ブリッジ名,epair名)で以下のメソッドが epairをそのブリッジにつないでくれます。 def connect(epair) name=@name sh=Shell.new sh.transact{ ifconfig("#{epair} vnet #{name}") jexec(name,"ifconfig vbridge0 addm #{epair}") } @epairs<< epair end ifconfig すると以下のようになっているのがわかります。 epair1b と epair2b が vbridge0 の member になっており、相互にブリッジされるようになっています。 root@bridge1:/ # ifconfig lo0: flags=8049 metric 0 mtu 16384 options=600003 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet 127.0.0.1 netmask 0xffffff00 nd6 options=21 vbridge0: flags=8843 metric 0 mtu 1500 ether 02:7e:61:ef:30:00 nd6 options=1 id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200 root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0 member: epair2b flags=143 ifmaxaddr 0 port 4 priority 128 path cost 14183 member: epair1b flags=143 ifmaxaddr 0 port 3 priority 128 path cost 14183 epair1b: flags=8943 metric 0 mtu 1500 options=8 ether 02:c0:e4:00:01:0b inet6 fe80::c0:e4ff:fe00:10b%epair1b prefixlen 64 scopeid 0x3 nd6 options=21 media: Ethernet 10Gbase-T (10Gbase-T ) status: active epair2b: flags=8943 metric 0 mtu 1500 options=8 ether 02:c0:e4:00:02:0b inet6 fe80::c0:e4ff:fe00:20b%epair2b prefixlen 64 scopeid 0x4 nd6 options=21 media: Ethernet 10Gbase-T (10Gbase-T ) status: active 詳細は man ifconfig して addm のあたりを読んでください。