Dockerと外部ルータを連携さ
せる仕組みを作ってみた
Tetsuhiro Sato
自己紹介
 佐藤 哲大(tetz)
 某ネットワークベンダで、SDN(っぽい)仕事をして
ます
 ネットワークプログラマビリティ勉強会の企画、運営
をしてます
http://network-programmability.connpass.com/
2
やりたいこと
3
Linux Bridge
(docker0)
C1 C2
eth0eth0
vetheYvetheX
eth0
macvlan
Dynamic PAT
(IP Masquerade)
Static PAT
(Port Forwarding)
Dynamic PAT
(IP Masquerade)
Static NAT
(Floating IP)
C1 C2 C3 C4
macvlan
eth0
ToR SwitchToR Switch
 Docker Bridgeネットワークでホスト上のiptablesで
やってるNATを外部ルータにオフロード
eth0
(参考)Macvlanドライバ
4
 Docker v1.12より正式サポート
 コンテナのインターフェイスをホストのイン
ターフェイスに直結できる
 メインインターフェイス(Ex. eth0)
 サブインターフェイス(Ex. eth0.10)
 4つのモードが存在(bridge, vepa
private, passthrough)
 bridgeモードの場合、同じネットワークは軽
量なmacvlan bridgeによりブリッジされる
 MAC学習しない
 BridgeドライバのようなNAT処理はしない
https://github.com/docker/libnetwork/blob/master/docs/macvlan.md
tetsusat/translator
5
NAT
Local
Global
Docker Remote API
C1 C2 C3 C4 translator
RESTCONF
or Ansibledot1q
Tenant X Tenant Y
 Docker Remote APIからイベントを
Listen
 ネットワーク作成時、VRFとサブインターフェ
イスの作成およびIP Masquerade相当の
NAT設定を実施
 コンテナ起動時に、Floating IP相当のNAT
設定を実施
 プラグインアーキテクチャ
 IOS RESTCONFとIOS Ansibleに対応
 translatorもコンテナとして起動
 Ansible実行環境を用意する手間が不要!
 gliderlabs/registratorのアイデアと
実装をかなり パクった 参考にした
https://github.com/tetsusat/translator
デモ①
6
$ docker run -itd 
--name=translator 
--net=host 
--volume=/var/run/docker.sock:/tmp/docker.sock 
--env IOS_MGMT_IP="<removed>" 
--env IOS_USER="admin" 
--env IOS_PASS="admin" 
--env IOS_ENABLE_PASS="cisco" 
--env OUTSIDE_INTERFACE="GigabitEthernet1" 
--env INSIDE_INTERFACE="GigabitEthernet2" 
tetsusat/translator:latest 
ios-restconf
 translatorをコンテナとして起動
デモ②
7
$ docker network create -d macvlan 
--subnet=192.168.1.0/24 
--gateway=192.168.1.254 
-o parent=eth1.10 
hoge
ip vrf hoge
!
interface GigabitEthernet2.10
encapsulation dot1Q 10
ip vrf forwarding hoge
ip address 192.168.1.254 255.255.255.0
ip nat inside
ip policy route-map NAT
!
ip nat inside source list NAT interface GigabitEthernet1 vrf hoge overload
 macvlanドライバでhogeというネットワークを作成
 ルータにはこんな設定が入ります
デモ③
8
$ docker run 
--net=hoge 
--ip=192.168.1.1 
-it 
-l global_ip=10.0.1.1 
alpine /bin/sh
ip nat inside source static 192.168.1.1 10.0.1.1 vrf hoge
 hogeネットワークに接続するコンテナを作成
 ルータにはこんな設定が入ります
おわり
ご清聴、ありがとうございました
m(_ _)m
9

Dockerと外部ルータを連携させる仕組みを作ってみた

  • 1.
  • 2.
    自己紹介  佐藤 哲大(tetz) 某ネットワークベンダで、SDN(っぽい)仕事をして ます  ネットワークプログラマビリティ勉強会の企画、運営 をしてます http://network-programmability.connpass.com/ 2
  • 3.
    やりたいこと 3 Linux Bridge (docker0) C1 C2 eth0eth0 vetheYvetheX eth0 macvlan DynamicPAT (IP Masquerade) Static PAT (Port Forwarding) Dynamic PAT (IP Masquerade) Static NAT (Floating IP) C1 C2 C3 C4 macvlan eth0 ToR SwitchToR Switch  Docker Bridgeネットワークでホスト上のiptablesで やってるNATを外部ルータにオフロード eth0
  • 4.
    (参考)Macvlanドライバ 4  Docker v1.12より正式サポート コンテナのインターフェイスをホストのイン ターフェイスに直結できる  メインインターフェイス(Ex. eth0)  サブインターフェイス(Ex. eth0.10)  4つのモードが存在(bridge, vepa private, passthrough)  bridgeモードの場合、同じネットワークは軽 量なmacvlan bridgeによりブリッジされる  MAC学習しない  BridgeドライバのようなNAT処理はしない https://github.com/docker/libnetwork/blob/master/docs/macvlan.md
  • 5.
    tetsusat/translator 5 NAT Local Global Docker Remote API C1C2 C3 C4 translator RESTCONF or Ansibledot1q Tenant X Tenant Y  Docker Remote APIからイベントを Listen  ネットワーク作成時、VRFとサブインターフェ イスの作成およびIP Masquerade相当の NAT設定を実施  コンテナ起動時に、Floating IP相当のNAT 設定を実施  プラグインアーキテクチャ  IOS RESTCONFとIOS Ansibleに対応  translatorもコンテナとして起動  Ansible実行環境を用意する手間が不要!  gliderlabs/registratorのアイデアと 実装をかなり パクった 参考にした https://github.com/tetsusat/translator
  • 6.
    デモ① 6 $ docker run-itd --name=translator --net=host --volume=/var/run/docker.sock:/tmp/docker.sock --env IOS_MGMT_IP="<removed>" --env IOS_USER="admin" --env IOS_PASS="admin" --env IOS_ENABLE_PASS="cisco" --env OUTSIDE_INTERFACE="GigabitEthernet1" --env INSIDE_INTERFACE="GigabitEthernet2" tetsusat/translator:latest ios-restconf  translatorをコンテナとして起動
  • 7.
    デモ② 7 $ docker networkcreate -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.254 -o parent=eth1.10 hoge ip vrf hoge ! interface GigabitEthernet2.10 encapsulation dot1Q 10 ip vrf forwarding hoge ip address 192.168.1.254 255.255.255.0 ip nat inside ip policy route-map NAT ! ip nat inside source list NAT interface GigabitEthernet1 vrf hoge overload  macvlanドライバでhogeというネットワークを作成  ルータにはこんな設定が入ります
  • 8.
    デモ③ 8 $ docker run --net=hoge --ip=192.168.1.1 -it -l global_ip=10.0.1.1 alpine /bin/sh ip nat inside source static 192.168.1.1 10.0.1.1 vrf hoge  hogeネットワークに接続するコンテナを作成  ルータにはこんな設定が入ります
  • 9.