Ubuntu 14.04でNICをブリッジ

歴史的経緯があって同じサブネットが物理的に2つのネットワークに分かれて、
それら2つが互いに中継もされず運用されているにも関わらず、
1つのPCから両方にアクセスしたいというような
わけの分からない要求があるとします。
PCにある2つのNICをそれぞれのネットワークにつなげても、
サブネットが同じなのでIPアドレスの系がかぶり、まともにルーティングできないのですが、
いろいろ制約があるもののUbuntu 14.04でブリッジを使い
実現できたので書き残しておきます。

最初に以下を実行してブリッジが使えるようにします。

# apt-get install bridge-utils

次いで設定ファイル”/etc/networks/interfaces”に以下の内容を追加します。

iface eth0 inet manual
iface eth1 inet manual

auto br0
iface br0 inet dhcp
bridge_ports eth0 eth1

ここでは2つのNICであるeth0とeth1をまとめてブリッジbr0としています。
なお、双方のサブネットにDHCPサーバが存在すると、
どちらからIPアドレスをもらってくるか不定になってしまうため、
そういう場合は手動でIPアドレスを設定するのがよいでしょう。

iface br0 inet dhcp

の行を以下のように置き換えます。
IPアドレス等は環境に合わせ適宜読み替えてください。

iface br0 inet static
address 192.168.1.100
netmask 255.255.255.0
bridge_ports eth0 eth1
gateway 192.168.1.1
broadcast 192.168.1.255
network 192.168.1.0

さらにDSNサーバの設定のため”/etc/resolv.conf”も書き換えたいところですが、
Ubuntu14.04では起動時に自動生成されてされてしまうので、
“/etc/resolvconf/resolv.conf.d/base”に

nameserver <DSNサーバのIPアドレス>

の行を追加して、

# resolvconf -u

を実行するのが正しい解決法です。

さて、この状態だとこのUbuntu PCがeth0とeth1を中継して
理論的に1つの大きなネットワークになってしまいます。
それが嫌な場合は以下を実行します。

# ebtables -P FROWARD DROP

PC起動時からそうしたい場合は
設定スクリプトファイル”/etc/network/if-pre-up.d/bridge”の

if [ "$MODE" = "start" ] ; then

の行の直後に

ebtables -P FROWARD DROP

の行を追加しておけば実現できます。

もし両方に同じIPアドレスの機器が存在すると面倒なことになりますし、
他にも何か問題が発生するかもしれませんので、
TCP/IPについてよく理解してから試すことをお勧めします。