(更新: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