具体的なことはまだいろいろ検討中ながら、最近世間で流行りつつあるらしい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
コメントを残す
コメントを投稿するにはログインしてください。