Network雑記

(更新:2014/05)Linuxで802.1Q(VLAN tagging)通信
(更新:2011/05)NIC冗長化(bonding)
(作成:2011/03)

Linuxで802.1Q(VLAN tagging)通信

通信範囲の分割やストームの局所化などなど、組織のネットワークてのは環境を良いカンジに保つために割と複雑な設計になっているもので。それに対して末端ノードはといえば、基本は1つのLANポートに1つのIPを持って通信してるわけで。
ノードにしてみればIPは自分の所番地を表すようなモノだから、そりゃまあ1つで良いわけだけれど、ネットワーク管理をする立場にしてみればこれがまた面倒な話で、ポートごとアクセスVLAN作って必要な数だけ繋げたりーの、検証は検証で各種アクセスVLANに挿し直しつつIP変更して疎通確認したりーの、どう見てもリソースの無駄です本当に有難う御座いました、と言いたくなったり。
そんなのもうやってらんないなー……と思ったので、じゃあサーバにも802.1Q喋らせようぜ! とこうなった。

まずはサーバ挿し先ポートをVLAN taggingしておく。CiscoのL3だとこんな感じ。

interface GigabitEthernet1/0/1
 description server
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 10-12
 switchport mode trunk
 spanning-tree portfast trunk

サーバ側、必要なパッケージのインストール。

# apt-get install vlan
...

今回はeth0に VLAN 10 - 12 を作る。

# vconfig add eth0 10
Added VLAN with VID == 10 to IF -:eth0:-
# vconfig add eth0 11
Added VLAN with VID == 11 to IF -:eth0:-
# vconfig add eth0 12
Added VLAN with VID == 12 to IF -:eth0:-

間違えて作ったりした時は、以下のように削除。

# vconfig rem eth0.13
Removed VLAN -:eth0.13:-

ネットワーク設定はこんな感じで。

#### /etc/network/interface

auto eth0
iface eth0 inet dhcp

auto eth0.10
iface eth0.10 inet static
        address 192.168.1.10
        netmask 255.255.255.0
        gateway 192.168.1.1

auto eth0.11
iface eth0.11 inet static
        address 192.168.2.10
        netmask 255.255.255.0
##      gateway 192.168.2.1

auto eth0.12
iface eth0.12 inet static
        address 192.168.3.10
        netmask 255.255.255.0
##      gateway 192.168.3.1

サーバで使うならgateway設定はどれか1つ設定して、ネットワークを再起動すれば全てのVLANが起動する。

# /etc/init.d/networking restart
# ifconfig
eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          ...

eth0.10   Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          ...

eth0.11   Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.2.10  Bcast:192.168.2.255  Mask:255.255.255.0
          ...

eth0.12   Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.3.10  Bcast:192.168.3.255  Mask:255.255.255.0
          ...

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0.10
192.168.2.0     *               255.255.255.0   U     0      0        0 eth0.11
192.168.3.0     *               255.255.255.0   U     0      0        0 eth0.12
default         192.168.1.1     0.0.0.0         UG    100    0        0 eth0.10

VLAN接続試験用とかならそれぞれgatewayを設定して、必要なインタフェースのみ有効化すると便利。

# ifup eth0.10
Set name-type for VLAN subsystem. Should be visible in /proc/net/vlan/config
Added VLAN with VID == 10 to IF -:eth0:-

# ifconfig
eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          ...

eth0.10   Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          ...

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0.10
default         192.168.1.1     0.0.0.0         UG    100    0        0 eth0.10

# ifdown eth0.10
Removed VLAN -:eth0.10:-
# ifup eth0.11
Set name-type for VLAN subsystem. Should be visible in /proc/net/vlan/config
Added VLAN with VID == 11 to IF -:eth0:-

# ifconfig
eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          ...

eth0.11   Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.2.10  Bcast:192.168.2.255  Mask:255.255.255.0
          ...

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.0     *               255.255.255.0   U     0      0        0 eth0.11
default         192.168.2.1     0.0.0.0         UG    100    0        0 eth0.11

こんな感じで、簡単なコマンド操作で好きなVLANに所属することができる。

なおVLANの設定状況や各インタフェースの通信状況は以下で確認できる。

# cat /proc/net/vlan/config
VLAN Dev name     | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
eth0.10        | 10  | eth0
eth0.11        | 11  | eth0
eth0.12        | 12  | eth0


# cat /proc/net/vlan/eth0.10
eth0.10  VID: 10     REORDER_HDR: 1  dev->priv_flags: 1
         total frames received         2346
          total bytes received       233286
      Broadcast/Multicast Rcvd            0

      total frames transmitted            6
       total bytes transmitted          492
            total headroom inc            0
           total encap on xmit            6
Device: eth0
INGRESS priority mappings: 0:0  1:0  2:0  3:0  4:0  5:0  6:0 7:0
 EGRESS priority mappings: 

NIC冗長化(bonding)

お仕事とかで使うので一応Tipsに。お仕事用設定なのでCentOSでのお話になります。
NICが複数あるマシンについて、二本差しにしておきトラブル起きた時に自動切替するような設定。接続先のSWは互い異なる冗長化SWに挿しましょう。でないと無意味。

bonding モジュール読込設定。

#### /etc/mobprobe.d/bonding

alias bond0 bonding
options bonding mode=1 miimon=200

bond インタフェース作成と eth インタフェースの参加。

#### /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
#### /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
#### /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes

モジュール読込とか面倒なんでガツンとサーバ再起動。 ifconfig で確認すると、 bond0 って名前でネットワークインタフェースが起動している。通信しながらどちらかを抜き差ししても、ちゃんと切り替わる。素敵。

PPTPサーバへの接続方法

お仕事とかで使うので一応Tipsに。TCP/IP上にPPPトンネル掘ってVPN実現するっていうアレです。
WindowsはGUIで結構簡単にイケるので省略。ここで紹介するのはUbuntuでの接続方法。因みにNW AppletのVPN設定はへっぽこなんでガン無視で。

パッケージはデフォルトで入っているみたいなので(入ってなければ apt-get install ppp pppconfig)さくさく設定。

#### /etc/ppp/chap-secrets

(PPTPユーザ名)  PPTP    "(PPTPパスワード)"        *
#### /etc/ppp/peers/(任意接続名)

pty "pptp (PPTPサーバ) --nolaunchpppd"
name (PPTPユーザ名)
remotename PPTP
require-mppe-128
file /etc/ppp/options.pptp
ipparam ppp

準備ができたら早速接続。

# pon (任意接続名)

ログを見てみる。

# plog
Mar  8 22:06:16 xxxxxxxx pppd[4670]: CHAP authentication succeeded
Mar  8 22:06:16 xxxxxxxx pppd[4670]: MPPE 128-bit stateless compression enabled
Mar  8 22:06:16 xxxxxxxx pppd[4670]: Cannot determine ethernet address for proxy ARP
Mar  8 22:06:16 xxxxxxxx pppd[4670]: local  IP address XXX.XXX.XXX.XXX
Mar  8 22:06:16 xxxxxxxx pppd[4670]: remote IP address XXX.XXX.XXX.YYY

真中のメッセージはARP要求に対しproxy ARPがMACアドレス解決してくんない、という話。まあ確かにホームネットワークでproxy ARP設定してないし、外部PPTPサーバと通信できてるなら取り敢えず無視。
インタフェースも見てみる。

# ifconfig
...
ppp0      Link encap:Point-to-Pointプロトコル  
          inetアドレス:XXX.XXX.XXX.XXX  P-t-P:XXX.XXX.XXX.YYY  マスク:NNN.NNN.NNN.NNN
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1496  メトリック:1
          RXパケット:6 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:6 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:3 
          RXバイト:60 (60.0 B)  TXバイト:66 (66.0 B)

取り敢えず接続はこれでOK。後は必要に応じてルーティングなんかも仕込んであげないといけない。
例えばホームネットワークが 192.168.1.0/24 、VPN先のネットワークが 10.0.0.0/24 だとしたらこんな感じ。

# route add -net 10.0.0.0 netmask 255.255.255.0 dev ppp0
# route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
(PPTPサーバ)   192.168.1.254   255.255.255.255 UGH   0      0        0 eth0
10.2.0.200      *               255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     *               255.255.255.0   U     1      0        0 eth0
10.0.0.0        *               255.255.255.0     U     0      0        0 ppp0
link-local      *               255.255.0.0     U     1000   0        0 eth0
default         192.168.1.254   0.0.0.0         UG    0      0        0 eth0