vyattaを使って透過型プロキシ環境を構築する時の設定内容

公開日:2013/03/12 更新日:2013/03/12
vyattaを使って透過型プロキシ環境を構築する時の設定内容のサムネイル

透過型プロキシ環境は、クライアントPC(下図のubuntu1)側でプロキシサーバを使うための設定を一切していないにも関わらず、プロキシサーバ(下図のSquid)がクライアントPCの通信に介入して、クライアントPCにプロキシサーバの存在を意識させることなく(透過的に)使わせる環境です。

この透過型プロキシ環境をvyattaのPolicy Based Routing (PBR)機能を使って構築したので、vyattaの設定内容をメモします。なお、透過型プロキシとして使う場合のsquidの設定はsquidを透過型プロキシとして使う時の設定を参照して下さい。

PBRはその名の通り、一般のルーティングが宛先アドレスに基づいてルーティングを行うのに対して、ポリシー(例えば宛先ポート番号や送信元アドレスなど)に基づいてルーティングを行うための機能です。

構築した環境の構成は下図になります。

proxy_configure1.png

※ちなみに、vyattaはプロキシサーバ、キャッシュサーバとして利用されるsquidが標準でインストールされており、vyatta自体をプロキシサーバとして使うことができます(vyattaをプロキシサーバとして使うを参照)が、ここではvyattaとは別にプロキシサーバ(ubuntuにsquidをインストールして使用)を用意し、vyattaのPolicy Based Routing (以降、PBR)を使って透過型のプロキシサーバ環境を構築しました。なお、実機ではなくKVM上の仮想マシンで構築した環境になります。

設定内容と方法について

上図のvyatta Aにubuntu1のhttpトラフィック(宛先ポート番号80番)をSquidにルーティングするためのPBRの設定を行います。vyattaのPBRでは、

  • vyattaに流入してきたトラフィックの内、ルーティングするトラフィックの条件
  • ルーティングするトラフィックの条件に合致したトラフィックのルーティング先
この2つを設定します。

条件に合致したトラフィックのルーティング先の設定

説明の都合上、はじめに条件に合致したトラフィックのルーティング先の指定方法を説明します。今回の環境では、vyatta Aに流入したトラフィックの内、条件に合致したトラフィックをSquid(IPアドレス:192.168.101.101)にルーティングします。そのために、下記のコマンドをvyatta Aで実行してtableを作成します。

set protocols static table 1 route 0.0.0.0/0 next-hop 192.168.101.101

上記のように宛先アドレスが0.0.0.0/0であるトラフィック(つまり宛先アドレスに関わらない全トラフィック)を192.168.101.101(図中のSquidのIPアドレス)にルーティングするためのtableを作成しています。そして、ここで作成した「table 1」をルーティングするトラフィックの条件の設定時に使用します。なお「table」の後に続く数字の1は任意につける適当な数字です。下記がtable 1の設定内容です。

vyatta@vyatta# show protocols static table 1
   route 0.0.0.0/0 {
      next-hop 192.168.101.101 {
      }
   }

ルーティングするトラフィックの条件の設定

次にルーティングするトラフィックの条件を下記のコマンドを実行して指定します。下記では、vyatta Aに流入してきたトラフィックの内、

  • 送信元アドレスのネットワークアドレスが192.168.101.0/24である
  • 宛先ポート番号が80番である
上記の2つを満たすトラフィックをルーティングするための条件を指定しています。
set policy route PROXYROUTE rule 10 protocol tcp
set policy route PROXYROUTE rule 10 destination address 0.0.0.0/0
set policy route PROXYROUTE rule 10 destination port 80
set policy route PROXYROUTE rule 10 source address 192.168.101.0/24
set policy route PROXYROUTE rule 10 source mac-address !aa:bb:cc:dd:ee:ff
set policy route PROXYROUTE rule 10 set table 1
・1行目
ルーティングするトラフィックの条件としてtcpトラフィックを指定しています。ここでtcpを指定しないと、3行目でポート番号の指定ができません。なお、「PROXYROUTE」は任意のポリシー名であり、「rule」の後に続く「10」も適当な番号です。
・2行目
宛先アドレスを指定しています。ここでは「0.0.0.0/0」を指定しているため、どの宛先アドレスでも条件に合致することになります。つまり、この設定はしなくても問題ありません。特定の宛先アドレスを条件に指定する場合は「0.0.0.0/0」を具体的なIPアドレスに置き換えることになります。
・3行目
宛先ポート番号として80番を指定しています。ここでは80番を指定しているため、httpトラフィックをルーティングの条件としています。そのため、443番を使用するhttpsトラフィックは対象となりません。
・4行目
送信元アドレスを指定しています。ここではクライアントPCであるubuntu1が属するネットワーク192.168.101.0/24からのトラフィックを対象としています。
・5行目
送信元のMACアドレスを指定しています。ここでは、squid以外のトラフィックを対象とするために、squidのMACアドレスaa:bb:cc:dd:ee:ffに除外を意味する「!」をつけて指定しています。この設定により、squidもIPアドレスは192.168.101.0/24であるため4行目の条件を満たしますが、MACアドレスが条件を満たさないためにsquidからのトラフィックはvyatta Aによってルーティングされません。この設定がないと、squidがクライアントPCに代わってコンテンツを取得するためのトラフィックがsquidに再度ルーティングされて、以降ループしてしまいます。
・6行目
これまでに設定した条件に合致したトラフィックのルーティング先を「table 1」に設定しています。すなわち、条件に合致したトラフィックは、「table 1」のnext-hopに記述された192.168.101.101にルーティングされます。

上記のコマンドによる設定内容が下記になります。

vyatta@vyatta#show policy route PROXYROUTE
rule 10 {
   destination {
       address 0.0.0.0/0
       port 80
   }
   protocol tcp
   set {
       table 1
   }
   source {
      address 192.168.101.0/24
   }
}

インターフェースへのポリシーの適用

最後に上記で設定したポリシー(ルーティングの条件とルーティング先)を下記のコマンドによってインターフェースに適用します。ここでは、vyatta Aのeth0に適用します。これにより、vyatta Aのeth0に入ってきたトラフィックのうち、上記で設定した条件に合致するトラフィックはプロキシサーバ(図中squid)にルーティングされます。

vyatta@vyatta# set interfaces ethernet eth0 policy route PROXYROUTE

以上でvyatta Aでの設定は完了です。ここまでの設定で、ubuntu1のhttpトラフィックはSquidにルーティングされます。squidの設定についてはsquidを透過型プロキシとして使う時の設定を参照して下さい。

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。