<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1937630342534694453</id><updated>2011-07-08T11:33:57.900+09:00</updated><title type='text'>technical notes</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ksk-notes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937630342534694453/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ksk-notes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Keisuke Nishida</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1937630342534694453.post-8831338394972135254</id><published>2011-04-17T22:09:00.003+09:00</published><updated>2011-04-20T18:54:57.000+09:00</updated><title type='text'>Pythonの時刻処理（時計、タイムゾーン変換）</title><content type='html'>&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span style="font-family: Verdana;"&gt;Pythonでの時間の扱いが&lt;/span&gt;&lt;span style="font-family: 'MS Gothic';"&gt;わけわかんないので&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;、少しまとめて&lt;/span&gt;&lt;span style="font-family: 'MS Gothic';"&gt;おく&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;（Python 2.6で&lt;/span&gt;&lt;span style="font-family: 'MS Gothic';"&gt;動作&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;確認）&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;標準モジュール&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;o time&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;低レベルの時刻処理。Cの関数呼び出し。&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;時刻はタイムスタンプ（整数型、time_t）、または構造体（struct_time）で表現。&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;o datetime&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;高レベルの時刻処理。&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;オブジェクトとして時刻を扱える。&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;o calendar&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;カレンダーを扱うためのライブラリ。&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;拡張モジュール&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span style="font-family: Verdana;"&gt;拡張パッケージを&lt;/span&gt;&lt;span style="font-family: 'MS Gothic';"&gt;いくつか&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;導入（pip install）&lt;/span&gt;&lt;span style="font-family: 'MS Gothic';"&gt;しておくと便利。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;o pytz&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;タイムゾーンの一覧。&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;o python-dateutil&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;日付関連の便利なユーティリティ。&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;タイムゾーンの扱い&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: Verdana;"&gt;アプリケーション内での時刻処理には、datetimeオブジェクトを使う。datetimeは、明示的に指定しない限りは「タイムゾーンなし」になる。&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;このオブジェクトが示すのは「システムの時計」であり、地球上のどこかの「現地時間」を表してはいない。（&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;Python&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;では、前者を&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;"native object"&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;、後者を&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;"aware object"&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;と呼ぶ）&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; datetime.datetime.now()&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 19, 15, 50, 533798)&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;タイムゾーンを明示的に指定したければ、&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;pytz&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;を利用する。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; datetime.datetime.now(tz=pytz.timezone('Asia/Tokyo'))&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 19, 15, 52, 863696, tzinfo=&amp;lt;DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD&amp;gt;)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;または&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja"&gt;&amp;gt;&amp;gt;&amp;gt; pytz.timezone('Asia/Tokyo')&lt;/span&gt;&lt;span lang="en-US"&gt;.localize(&lt;/span&gt;&lt;span lang="ja"&gt;datetime.datetime.now()&lt;/span&gt;&lt;span lang="en-US"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 19, 15, 52, 863696, tzinfo=&amp;lt;DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD&amp;gt;)&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;時刻表現の標準化&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;タイムゾーンの変換を考える前に、時刻の表現を標準化したい。&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;まず、時刻はすべて&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;UTC&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;で持つことにする。タイムスタンプ（整数）で現在時刻を得るには次のようにする。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; int(time.time())&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;1303036188&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;datetime&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;で現在時刻を得るには次のようにする。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; datetime.datetime.utcnow()&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 10, 30, 50, 193172)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;タイムスタンプと&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;datetime&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;の相互変換は次のようにする。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dt = datetime.datetime.utcnow()&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; calendar.timegm(dt.timetuple())&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;1303036386&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; datetime.datetime.utcfromtimestamp(1303036386)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 10, 33, 6)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;datetime&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;はバイト表現に向いていないので、ファイル等に格納するときは&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;64&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;ビット整数のタイムスタンプとし、アプリケーションで&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;datetime&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;に変換する。ただし、&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;DB&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;に格納するときは&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;datetime&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;のまま&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;O/R&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;マッパーに渡した方が扱いやすい。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;タイムゾーンの変換&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;上記のように標準化された時刻は、暗黙的に&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;UTC&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;での時刻を示しているが、オブジェクトとしてはタイムゾーンの情報を持っていない。タイムゾーンを扱うときには、それが&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;UTC&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;であることを明示的に示してやる。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; pytz.utc.localize(dt)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 10, 33, 6, 575205, tzinfo=&amp;lt;UTC&amp;gt;)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;その上で、目的のタイムゾーンへと変換を行う。&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; pytz.utc.localize(dt).astimezone(pytz.timezone('Asia/Tokyo'))&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 19, 33, 6, 575205, tzinfo=&amp;lt;DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD&amp;gt;)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;一連の処理を簡単にするためにクラス化を行う。例えば、次のようなクラスを考える。&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;class User(object):&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.timezone = 'Asia/Tokyo'&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;標準化された時刻&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;dt&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;を、オブジェクトのタイムゾーンに変換するためのメソッドを&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;localize&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;とする。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def localize(self, dt):&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pytz.utc.localize(dt).astimezone(pytz.timezone(self.timezone))&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;同様に、標準化されたタイムスタンプを、オブジェクトのタイムゾーンに変換するためのメソッドを&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;localtime&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;とする。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def localtime(self, timestamp):&lt;/div&gt;&lt;div lang="en-US" style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return self.localize(datetime.datetime.utcfromtimestamp(timestamp))&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;時刻の表示&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;ローカル時間へと変換された時刻は、通常の&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;datetime&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;オブジェクトとしてフォーマットできる。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; u = User()&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; t = int(time.time())&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; print u.localtime(t)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;2011-04-17 20:26:14+09:00&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; print u.localtime(t).ctime()&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;Sun Apr 17 20:26:14 2011&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; print u.localtime(t).isoformat()&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;2011-04-17T20:26:14+09:00&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;&amp;gt;&amp;gt;&amp;gt; print u.localtime(t).strftime('%Y-%m-%d %H:%M:%S&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt; %Z&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;')&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;2011-04-17 20:26:14&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt; JST&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;TODO: &lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;ロケールを指定した時刻の出力について。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;時刻の読み込み&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;フォーマットされた時刻を読み取るには&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;strptime&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;が使える。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; datetime.datetime.strptime('2011-04-18 06:02:32 GMT', '%Y-%m-%d %H:%M:%S %Z')&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 18, 6, 2, 32)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;ただ、文字列に含まれるタイムゾーンは、うまく読み取ってくれないみたい。あらかじめ&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;"GMT"&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;のようにわかっているならそれを前提としてもいいが、そうでなければ自前で処理する必要がありそう。（探せばライブラリがあるかも）&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;python-dateutil&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;という外部モジュールを使うと、明示的にフォーマットを指定せずとも、ライブラリ側でよきにはからってくれるみたい。（タイムゾーンもある程度みてくれるようだ）&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dateutil.parser.parse('Sun, 17 Apr 2011 21:32:07 JST')&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 21, 32, 7, tzinfo=tzlocal())&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;タイムゾーン付きで読んだ時刻は、次のようにして標準化する。&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dt = dateutil.parser.parse('Sun, 17 Apr 2011 21:32:07 JST')&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dt.astimezone(pytz.utc).replace(tzinfo=None)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 12, 32, 7)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; calendar.timegm(dt.astimezone(pytz.utc).timetuple())&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;1303043527&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;日付の計算&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;将来の時間を計算するときは、&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;datetime.timedelta&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;を用いる。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dt = datetime.datetime.utcnow()&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dt&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 12, 36, 18, 792871)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dt + datetime.timedelta(seconds=60)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 12, 37, 18, 792871)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dt + datetime.timedelta(days=30)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 5, 17, 12, 36, 18, 792871)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja"&gt;ただ、&lt;/span&gt;&lt;span lang="en-US"&gt;datetime.timedelta&lt;/span&gt;&lt;span lang="ja"&gt;は秒単位、日単位の指定しか出来ないので、「半年後」などを指定するのは難しい。そのようなときは、dateutil.relativedelta.relativedeltaが使える。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dt + dateutil.relativedelta.relativedelta(months=6)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 10, 17, 12, 36, 18, 792871)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;時間の差分&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;「〇〇分前」とか「残り○時間○分」とか表示したいときは、&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;Django&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;であれば&lt;/span&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;django.utils.timesince&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;が使える。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; dt = datetime.datetime.now()&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; django.utils.timesince.timesince(dt - datetime.timedelta(seconds=300))&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;u'5 minutes'&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; django.utils.timesince.timeuntil(dt + datetime.timedelta(seconds=300))&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;u'4 minutes'&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;これらは標準のフィルタとして次のように使える。&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span style="font-family: 'MS Gothic';"&gt;{{ &lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;blog_date&lt;/span&gt;&lt;span style="font-family: 'MS Gothic';"&gt;|timesince:comment_date }}&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;TODO: &lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;タイムゾーンを考慮した記述。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;b&gt;その他&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-size: 10.0pt; margin: 0in;"&gt;&lt;span lang="en-US" style="font-family: Verdana;"&gt;datetime.datetime.utcnow()&lt;/span&gt;&lt;span lang="ja" style="font-family: 'MS Gothic';"&gt;を使うとマイクロ秒まで返されてしまう。秒単位の方がよければ次のようにする。&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&amp;gt;&amp;gt;&amp;gt; datetime.datetime.utcnow().replace(microsecond=0)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;datetime.datetime(2011, 4, 17, 13, 6, 35)&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;MS Gothic&amp;quot;; font-size: 10.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937630342534694453-8831338394972135254?l=ksk-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksk-notes.blogspot.com/feeds/8831338394972135254/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ksk-notes.blogspot.com/2011/04/python.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937630342534694453/posts/default/8831338394972135254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937630342534694453/posts/default/8831338394972135254'/><link rel='alternate' type='text/html' href='http://ksk-notes.blogspot.com/2011/04/python.html' title='Pythonの時刻処理（時計、タイムゾーン変換）'/><author><name>Keisuke Nishida</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937630342534694453.post-2017108966716293360</id><published>2010-07-23T21:44:00.001+09:00</published><updated>2010-07-23T21:47:19.638+09:00</updated><title type='text'>仮想ルータでゲストネットワークを構築する</title><content type='html'>&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://lh5.ggpht.com/_T3muQjjXDaE/TEmOiq5Zz6I/AAAAAAAACPA/92MSjYDBCTw/image%5B17%5D.png?imgmax=800" width="320" height="403"&gt; &lt;/p&gt; &lt;p&gt;社内のネットワークとは別に、ゲスト用にネットワーク回線を提供したいことがある。&lt;/p&gt; &lt;p&gt;このようなネットワークでは、インターネットとの通信は許しつつも、社内のPCや各種サーバへのアクセスは防ぎたい。&lt;/p&gt; &lt;p&gt;そのためには、ファイアーウォールの機能を備えたルータを置くことが必要だけれども、これを仮想化することを考えたい。(*1)&lt;/p&gt; &lt;p&gt;仮想化のシステムにはVMware ESXi、ソフトウェアルータとしてはvyattaを利用する。&lt;/p&gt; &lt;p&gt;(*1) 最近の無線ルータにはもともとゲストネットワークの機能が入っているものがあり、そうした機器では自前でルータを立てる必要はない。&lt;/p&gt; &lt;h3&gt;物理的な接続&lt;/h3&gt; &lt;p&gt;ゲスト用に物理的なHUBを用意する。無線LAN（Wi-Fi）も提供するならば、アクセスポイントをそこにつなげる。&lt;/p&gt; &lt;p&gt;&lt;a href="http://ksk-notes.blogspot.com/2010/07/blog-post.html" target="_blank"&gt;前回の記事&lt;/a&gt;と同様に、ゲストネットワーク（Guest Network）にVLAN IDを一つ割り当てて、L2スイッチを通して仮想化ホストとの接続を行う。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_T3muQjjXDaE/TEmOjYzyH1I/AAAAAAAACOo/Q9xrgpSR49g/image%5B10%5D.png?imgmax=800" width="339" height="148"&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h3&gt;仮想マシンを用意する&lt;/h3&gt; &lt;p&gt;ESXiのネットワーク構成管理で、Guest Networkを作成して、VLAN IDを割り当てる。&lt;/p&gt; &lt;p&gt;メニューからvyattaをデプロイする。今回は単純にネットワークカードを2枚にした。eth0は社内ネットワークに接続し、eth1はGuest Networkに接続する。&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_T3muQjjXDaE/TEmOjwnJF6I/AAAAAAAACOs/DB0sbbBmjdA/s1600-h/vyatta%5B7%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="vyatta" border="0" alt="vyatta" src="http://lh5.ggpht.com/_T3muQjjXDaE/TEmOkbOOv4I/AAAAAAAACOw/V8mzUs80RTw/vyatta_thumb%5B1%5D.png?imgmax=800" width="400" height="353"&gt;&lt;/a&gt; &lt;/p&gt; &lt;h3&gt;ルータの基本設定&lt;/h3&gt; &lt;p&gt;ホスト名、タイムゾーン、NTPサーバなんかを設定。&lt;/p&gt; &lt;p&gt;vyatta@rt:~$ configure&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set system host-name rt.guest&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set system time-zone Asia/Tokyo&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set system ntp-server ntp.nict.jp&lt;br&gt;[edit]  &lt;p&gt;ネームサーバは社内ネットワークのを使ってもいいんだが、社内サーバの名前解決が出来ても嬉しくないので、外部のもの（プロバイダのDNSなど）を利用。ここではGoogle Public DNSを設定。&lt;/p&gt; &lt;p&gt;vyatta@rt# set system name-server 8.8.8.8&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set system name-server 8.8.4.4&lt;br&gt;[edit]  &lt;h3&gt;ネットワーク設定&lt;/h3&gt; &lt;p&gt;eth0のアドレスはDHCPで取得し、eth1には固定で192.168.1.1/24を割り当てる。&lt;/p&gt; &lt;p&gt;vyatta@rt# set interfaces ethernet eth0 address dhcp&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set interfaces ethernet eth1 address 192.168.1.1/24&lt;br&gt;[edit]  &lt;p&gt;eth0に向かうパケットはIPマスカレードする。&lt;/p&gt; &lt;p&gt;vyatta@rt# set service nat rule 10 outbound-interface eth0&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set service nat rule 10 type masquerade&lt;br&gt;[edit]  &lt;h3&gt;ファイアーウォール設定&lt;/h3&gt; &lt;p&gt;社内ネットワークへのアクセスは拒否するようファイアーウォールを設定する。これは次のルールによって行う。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;192.168.0.0/16に向けたパケットは拒否する。  &lt;li&gt;172.16.0.0/12に向けたパケットは拒否する。  &lt;li&gt;10.0.0.0/8に向けたパケットは拒否する。  &lt;li&gt;それ以外のパケットは許可する。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;まずはこれをルールFW-1として作成。&lt;/p&gt; &lt;p&gt;vyatta@rt# set firewall name FW-1 rule 1 destination address 192.168.0.0/16&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set firewall name FW-1 rule 1 action reject&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set firewall name FW-1 rule 2 destination address 172.16.0.0/12&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set firewall name FW-1 rule 2 action reject&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set firewall name FW-1 rule 3 destination address 10.0.0.0/8&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set firewall name FW-1 rule 3 action reject&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set firewall name FW-1 rule 4 action accept&lt;br&gt;[edit]  &lt;p&gt;このルールをeth1から入ってくるパケットに対して適用する。&lt;/p&gt; &lt;p&gt;vyatta@rt# set interface ethernet eth1 firewall in name FW-1&lt;br&gt;[edit]  &lt;p&gt;逆方向の通信、つまり社内ネットワークからゲストネットワークに向けた通信も防いだ方がいいのだろうけど、どうせFW-1によって双方向の通信は拒否されるので、上記設定で十分だろう。  &lt;h3&gt;サービス設定&lt;/h3&gt; &lt;p&gt;必要に応じて、ゲストネットワークのためのDNSやDHCPサーバを動かす。&lt;/p&gt; &lt;p&gt;eth1からのDNS問い合わせは、最初に設定した外部のDNSサーバに転送する。&lt;/p&gt; &lt;p&gt;vyatta@rt# set service dns forwarding listen-on eth1&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set service dns forwarding system&lt;br&gt;[edit]  &lt;p&gt;DHCPで配るアドレスは192.168.1.100～199とし、デフォルトルータやDNSのアドレスは自分自身にする。&lt;/p&gt; &lt;p&gt;vyatta@rt# set service dhcp-server shared-network-name ETH1_POOL \&lt;br&gt;&amp;nbsp; subnet 192.168.1.0/24 start 192.168.1.100 stop 192.168.1.199&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set service dhcp-server shared-network-name ETH1_POOL \&lt;br&gt;&amp;nbsp; subnet 192.168.1.0/24 default-router 192.168.1.1&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# set service dhcp-server shared-network-name ETH1_POOL \&lt;br&gt;&amp;nbsp; subnet 192.168.1.0/24 dns-server 192.168.1.1&lt;br&gt;[edit]  &lt;h3&gt;設定の反映と保存&lt;/h3&gt; &lt;p&gt;ここまでの設定をシステムに反映（commit）させる。問題なさそうなら保存（save）して完了。&lt;/p&gt; &lt;p&gt;vyatta@rt# commit&lt;br&gt;...&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# save&lt;br&gt;Saving configuration to '/opt/vyatta/etc/config/config.boot'...&lt;br&gt;Done&lt;br&gt;[edit]&lt;br&gt;vyatta@rt# exit&lt;br&gt;exit    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937630342534694453-2017108966716293360?l=ksk-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksk-notes.blogspot.com/feeds/2017108966716293360/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ksk-notes.blogspot.com/2010/07/blog-post_23.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937630342534694453/posts/default/2017108966716293360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937630342534694453/posts/default/2017108966716293360'/><link rel='alternate' type='text/html' href='http://ksk-notes.blogspot.com/2010/07/blog-post_23.html' title='仮想ルータでゲストネットワークを構築する'/><author><name>Keisuke Nishida</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_T3muQjjXDaE/TEmOiq5Zz6I/AAAAAAAACPA/92MSjYDBCTw/s72-c/image%5B17%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937630342534694453.post-4365405356935413923</id><published>2010-07-15T19:58:00.001+09:00</published><updated>2010-07-16T00:59:37.815+09:00</updated><title type='text'>小規模オフィスのネットワーク仮想化を考える</title><content type='html'>&lt;p&gt;社内のサーバがどんどん仮想化されていく今日この頃。ネットワークが少し複雑になると、仮想環境と物理環境をどう接続するかで悩まされる。まだまだ変更するかもだけど、とりあえず現時点でのパターンをまとめてみたい。&lt;/p&gt; &lt;p&gt;基本的な構成として、大きく三種類のネットワークを考える。&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_T3muQjjXDaE/TD8iKd9eIvI/AAAAAAAACOA/CMC0yLrBxKw/image%5B19%5D.png?imgmax=800" width="493" height="433"&gt;   &lt;/p&gt; &lt;p&gt;1. グローバルネットワーク（Global Network）&lt;/p&gt; &lt;p&gt;固定IPを持つサーバ群が接続される。いわゆるDMZ。&lt;/p&gt; &lt;p&gt;2. 管理用ネットワーク（Management Network）&lt;/p&gt; &lt;p&gt;ネットワーク機器や仮想化システム、管理者のPCなどが接続される。DMZのサーバも、メンテナンス用につなぐといい。&lt;/p&gt; &lt;p&gt;3. 社内ネットワーク（Office Network）&lt;/p&gt; &lt;p&gt;社内のLAN。完全にフラットなこともあるし、いくつかのセグメントに分割されることもある。&lt;/p&gt; &lt;h3&gt;インターネットへの経路&lt;/h3&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 20px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://lh3.ggpht.com/_T3muQjjXDaE/TD8iLP3vohI/AAAAAAAACOE/xKBberUqqcg/image%5B25%5D.png?imgmax=800" width="161" height="225"&gt; &lt;/p&gt; &lt;p&gt;DMZの設定は人それぞれだろうけど、うちの場合はブロードバンドルータをUnnumberdに構成して、DMZの各マシンにグローバルのIPアドレスを分配してる。&lt;/p&gt; &lt;p&gt;それ以外のマシンは、NAT（IPマスカレード）でアドレス変換してインターネットに出ていく。ブロードバンドルータがNATしてくれるなら簡単なんだけど、UnnumberdとNATがうまく両立できなかったので、社内用のルータ（後述）でNATすることにした。&lt;/p&gt; &lt;h3&gt;ネットワークに名前を付ける&lt;/h3&gt; &lt;p&gt;すべてのネットワークセグメントに名前を付けて、VLAN IDとネットワークアドレスを割り当てる。ここでは次の三つを考える。&lt;/p&gt; &lt;table border="0" cellspacing="0" cellpadding="2" width="300"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="75"&gt;VLAN 1&lt;/td&gt; &lt;td valign="top" width="170"&gt;Management Network&lt;/td&gt; &lt;td valign="top" width="55"&gt;192.168.0.0/24&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="75"&gt;VLAN 2&lt;/td&gt; &lt;td valign="top" width="170"&gt;Global Network&lt;/td&gt; &lt;td valign="top" width="55"&gt;x.x.x.x/xx&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="75"&gt;VLAN 3&lt;/td&gt; &lt;td valign="top" width="170"&gt;Office Network&lt;/td&gt; &lt;td valign="top" width="55"&gt;192.168.1.0/24&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;h3&gt;L2スイッチを接続する&lt;/h3&gt; &lt;p&gt;物理的なネットワークを仮想化された世界へといざなうためにL2スイッチを導入する。&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_T3muQjjXDaE/TD8iLjIg9wI/AAAAAAAACOI/4fCtrqkMk4o/image%5B31%5D.png?imgmax=800" width="513" height="102"&gt;  &lt;/p&gt; &lt;p&gt;L2スイッチの役割は、各ネットワークセグメントに個別のVLAN IDを割り当てて、パケットにVLANタグを付けて上流に受け渡すことである。これを実現するには、L2スイッチのVLAN設定を、例えば次のように構成する。（表の見方については&lt;a href="http://gihyo.jp/admin/column/01/vm/2009/l2-vlan?page=2" target="_blank"&gt;こちら&lt;/a&gt;）&lt;/p&gt; &lt;table border="0" cellspacing="0" cellpadding="2" width="342"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="66"&gt;VLAN&lt;/td&gt; &lt;td valign="top" width="66"&gt;P1&lt;/td&gt; &lt;td valign="top" width="66"&gt;P2&lt;/td&gt; &lt;td valign="top" width="66"&gt;P3&lt;/td&gt; &lt;td valign="top" width="66"&gt;P4…&lt;/td&gt; &lt;td valign="top" width="10"&gt;Network&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="66"&gt;1&lt;/td&gt; &lt;td valign="top" width="66"&gt;U&lt;/td&gt; &lt;td valign="top" width="66"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="66"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="66"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="10"&gt;Management&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="66"&gt;2&lt;/td&gt; &lt;td valign="top" width="66"&gt;T&lt;/td&gt; &lt;td valign="top" width="66"&gt;U&lt;/td&gt; &lt;td valign="top" width="66"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="66"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="10"&gt;Global&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="66"&gt;3&lt;/td&gt; &lt;td valign="top" width="66"&gt;T&lt;/td&gt; &lt;td valign="top" width="66"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="66"&gt;U&lt;/td&gt; &lt;td valign="top" width="66"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="10"&gt;Office&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="66"&gt;PVID&lt;/td&gt; &lt;td valign="top" width="66"&gt;1&lt;/td&gt; &lt;td valign="top" width="66"&gt;2&lt;/td&gt; &lt;td valign="top" width="66"&gt;3&lt;/td&gt; &lt;td valign="top" width="66"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="10"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;うちでは&lt;a href="http://h50146.www5.hp.com/products/networks/procurve/products/switches/switch1800series/overview.html" target="_blank"&gt;ProCurve Switch 1800-8G&lt;/a&gt;を使ってて、次のように設定してある。（VLAN 5まで利用）&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_T3muQjjXDaE/TD8iMUn0wjI/AAAAAAAACOM/BnRHg99Suqs/s1600-h/vlan%5B9%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="vlan" border="0" alt="vlan" src="http://lh6.ggpht.com/_T3muQjjXDaE/TD8iM0RLtvI/AAAAAAAACOQ/z--fPrH-uh0/vlan_thumb%5B1%5D.png?imgmax=800" width="500" height="485"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;これでポート1にはVLANタグの付いたパケットが流れるので、これを仮想マシンから利用できるようにする。&lt;/p&gt; &lt;h3&gt;仮想化ホストを接続する&lt;/h3&gt; &lt;p&gt;ポート1を仮想化ホストに接続する。複数のホスト機がある場合、間にハブを入れて分配すると楽。&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_T3muQjjXDaE/TD8iNcqHdxI/AAAAAAAACOU/zVI2JC4aOuU/image%5B34%5D.png?imgmax=800" width="241" height="111"&gt; &lt;/p&gt; &lt;p&gt;仮想化ホストとしてはVMware ESXiを使っている。vSwitchにネットワークを必要なだけ登録して、それぞれにVLAN IDを割り当ててやる。VLAN 1（Management Network）についてはタグなしで届くので、VLANの設定は行わない。&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="esxi" border="0" alt="esxi" src="http://lh3.ggpht.com/_T3muQjjXDaE/TD8iN2eEFlI/AAAAAAAACOY/6lbBZPEn3fs/esxi%5B2%5D.png?imgmax=800" width="564" height="210"&gt; &lt;/p&gt; &lt;p&gt;ここで“Routing Network”というのは特別なネットワークで、VLAN IDを4095に設定する。こうするとすべてのVLANのパケットがタグのついたまま届くようになる。これは後述するように、ルータを仮想化するときに利用できる。&lt;/p&gt; &lt;p&gt;以上の設定を正しく行えば、仮想マシンを各ネットワークに接続することにより、任意の物理的なネットワークとつながるようになる。&lt;/p&gt; &lt;h3&gt;ルータを仮想化する&lt;/h3&gt; &lt;p&gt;ネットワークセグメントが複数あると、それらの相互接続のためにルータが必要となる。ここでは、すべてのネットワークにVLAN IDを割り当てているので、VLAN間ルーティングが出来るといい。&lt;/p&gt; &lt;p&gt;ルータの仮想化には&lt;a href="http://www.vyatta.com/" target="_blank"&gt;vyatta&lt;/a&gt;を利用している。VMware用に仮想アプライアンスが提供されていて、コマンド一つで導入できるようになっている。&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="vyatta" border="0" alt="vyatta" src="http://lh6.ggpht.com/_T3muQjjXDaE/TD8iOl_MUTI/AAAAAAAACOc/d5ikvG63c0M/vyatta%5B4%5D.png?imgmax=800" width="400" height="300"&gt; &lt;/p&gt; &lt;p&gt;仮想アプライアンスを、先ほどのRouting Networkに接続する。VLAN間ルーティングを行うには、ルータのIPアドレス設定に”interfaces ethernet ethX vif”コマンドが使える。例えば、次のようにアドレスを設定する。&lt;/p&gt; &lt;p&gt;interfaces {&lt;br&gt;&amp;nbsp; ethernet eth0 {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address 192.168.0.1/24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # VLAN 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hw-id 00:0c:29:00:00:00&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vif 2 {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; address x.x.x.x/xx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # VLAN 2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vif 3 {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; address 192.168.1.1/24&amp;nbsp;&amp;nbsp; # VLAN 3&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp; }&lt;br&gt;} &lt;p&gt;必要に応じて、DNSやDHCP、IPマスカレードやファイアーウォールの設定を行う。IPマスカレードであれば、次のような設定になる。&lt;/p&gt; &lt;p&gt;service {&lt;br&gt;&amp;nbsp; nat {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rule 10 {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outbound-interface eth0.2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type masquerade&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp; }&lt;br&gt;} &lt;h3&gt;まとめ&lt;/h3&gt; &lt;p&gt;最終的に、物理的なネットワークは次のようになる。&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_T3muQjjXDaE/TD8iPEWNSqI/AAAAAAAACOg/HZerLnEQjLc/image%5B37%5D.png?imgmax=800" width="424" height="201"&gt; &lt;/p&gt; &lt;p&gt;ひとつ問題点として、ルータを仮想化してしまうと、インターネットとの通信がすべて仮想化ホストを通ることになり、システムに負荷が掛かる。また、仮想マシンを落とすたびにインターネットに繋がらなくなるので、けっこう不便。インターネットとの接続には物理的なルータを通したほうが何かと楽ではある。&lt;/p&gt; &lt;p&gt;あと、セグメントの数が3つやそこらであれば、苦労してVLANを活用するよりも、仮想化ホストに物理的にLANカードを増設してやるほうが楽だったりする。VLANを使うと自由度は高まるけど、慣れないうちは苦労する。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;はたして苦労するだけの価値があるのかどうかよくわからないが、いろいろ試した末にこういう形に落ち着いたので、簡単ながらまとめてみた。&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937630342534694453-4365405356935413923?l=ksk-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksk-notes.blogspot.com/feeds/4365405356935413923/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ksk-notes.blogspot.com/2010/07/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937630342534694453/posts/default/4365405356935413923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937630342534694453/posts/default/4365405356935413923'/><link rel='alternate' type='text/html' href='http://ksk-notes.blogspot.com/2010/07/blog-post.html' title='小規模オフィスのネットワーク仮想化を考える'/><author><name>Keisuke Nishida</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_T3muQjjXDaE/TD8iKd9eIvI/AAAAAAAACOA/CMC0yLrBxKw/s72-c/image%5B19%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
