簡易ネットワーク構築のためのnetns・Dockerコマンドのまとめ(1)。

具体的なことはまだいろいろ検討中ながら、最近世間で流行りつつあるらしいLinuxのnetns(Network Namespace)とDockerを使ってちょっとしたテスト用ネットワークを構築するしくみを作ろうと思っている。
とりあえず今の時点では、この試みに使いそうなnetnsとDockerのコマンドをメモしておく。

  • 仮想ブリッジの作成(create_bridge.sh)

    #!/bin/sh

    # 仮想ブリッジ名
    NAME=$1

    # VLAN ID
    VLANID=$2

    # 物理インタフェース
    INTERFACE=$3

    # 仮想ブリッジを作成する
    ip link add name $NAME type bridge
    ip link set $NAME up

    # 物理インタフェースにサブインタフェース(タグVLANインタフェース)を作成する
    ip link add link $INTERFACE name $INTERFACE.$VLANID type vlan id $VLANID
    ip link set $INTERFACE.$VLANID up

    # 仮想ブリッジとサブインタフェースを接続する
    ip link set dev $INTERFACE.$VLANID master $NAME

  • 仮想ルータの作成(create_router.sh)

    #!/bin/sh

    # 仮想ブリッジ名
    NAME=$1


    # VLAN ID
    VLANID=$2

    # 物理インタフェース
    INTERFACE=$3

    # 外部仮想インタフェース
    EXIF=$NAME-ex
    EXADDR=$4/$5

    # 内部仮想インタフェース
    INIF=$NAME

    INADDR=$6/$7

    # ゲートウェイアドレス
    GATEWAY=$8

    # Network Namespaceを作成する
    ip netns add $NAME

    # 外部仮想ブリッジを作成する
    ip link add name $EXIF type bridge
    ip link set $EXIF up

    # 物理インタフェースにサブインタフェース(タグVLANインタフェース)を作成する
    ip link add link $INTERFACE name $INTERFACE.$VLANID type vlan id $VLANID
    ip link set $INTERFACE.$VLANID up

    # 外部仮想ブリッジとサブインタフェースを接続する
    ip link set dev $INTERFACE.$VLANID master $EXIF

    # 外部仮想インタフェースを作成する
    ip link add name veth-$EXIF type veth peer name veth-$EXIF-p
    ip link set veth-$EXIF up

    # 外部仮想ブリッジと外部仮想インタフェースを接続する
    ip link set dev veth-$EXIF master $EXIF

    # 外部仮想インタフェースを設定する
    ip link set veth-$EXIF-p netns $NAME
    ip netns exec $NAME ip link set veth-$EXIF-p up
    ip netns exec $NAME ip addr $EXADDR dev veth-$EXIF-p

    # 内部仮想ブリッジを作成する
    ip link add name $INIF type bridge
    ip link set $INIF up

    # 内部仮想インタフェースを作成する
    ip link add name veth-$INIF type veth peer name veth-$INIF-p
    ip link set veth-$INIF up

    # 内部仮想ブリッジと内部仮想インタフェースを接続する
    ip link set dev veth-$INIF master $INIF

    # 内部仮想インタフェースを設定する
    ip link set veth-$INIF-p netns $NAME
    ip netns exec $NAME ip link set veth-$INIF-p up
    ip netns exec $NAME ip addr $INADDR dev veth-$INIF-p

    # デフォルトルートを設定する
    ip netns exec $NAME ip route add default via $GATEWAY
    # カーネルパラメータを設定する(ルーティング関連)
    ip netns exec $NAME sysctl net.ipv4.conf.all.forwarding = 1
    ip netns exec $NAME sysctl net.ipv4.conf.all.arp_accept = 1
    ip netns exec $NAME sysctl net.ipv4.conf.all.arp_notify = 1
    ip netns exec $NAME sysctl net.ipv4.conf.all.proxy_arp = 1

  • 仮想ホスト(コンテナ)の作成(create_host.sh)

     #!/bin/sh

    # ホスト名
    NAME=$1

    # コンテナイメージ名
    IMAGE=$2

    # 仮想ブリッジ名
    BRIDGE=$3

    # IPアドレス
    ADDR=$4/$5

    # ゲートウェイアドレス
    GATEWAY=$6

    # Dockerコンテナを作成する
    docker run -t -d --name $NAME -h $NAME $IMAGE /bin/bash
    PID=`docker inspect --format='{{ .State.Pid}}' $NAME`

    # ネットワークインタフェースを仮想ブリッジに接続する
    ip link add name veth-$NAME type veth peer name veth-$NAME-p
    ip link set veth-$NAME up
    ip link set dev veth-$NAME master $BRIDGE

    # ネットワークインタフェースを設定する
    ln -s /proc/$PID/ns/net /var/run/netns/$PID
    ip link set veth-$NAME-p netns $PID
    ip netns exec $PID ip link set veth-$NAME-p name eth1
    ip netns exec $PID ip link set eth1 up
    ip netns exec $PID ip addr add $ADDR dev eth1

    # デフォルトルートを設定する
    ip netns exec $PID ip route del default
    ip netns exec $PID ip route add default via $GATEWAY

参考:

Network configuration:
https://docs.docker.com/articles/networking/

Docker run reference
https://docs.docker.com/reference/run/

Dockerのネットワーク管理とnetnsの関係
http://enakai00.hatenablog.com/entry/20140424/1398321672


投稿日

カテゴリー:

, ,

投稿者:

タグ:

コメント

コメントを残す