Linux(CentOS)1台で、複数のグローバルIPを使い分けるProxyサーバを作りたいと考えています。

どういう物かと言いますと、グローバルIPとしてA.A.A.Aを持ち、その追加IPとしてA.A.A.BとA.A.A.Cが割り当てられたマシンがあるとします。
こちらのマシンのPort81にProxy接続すると外部IPとしてA.A.A.Bを使い、Port82に接続するとA.A.A.Cという外部IPを使うというものです。

ApacheかSquidなどでおそらく出来ると考えておりますが、Port81の場合には外部ネットワークとA.A.A.BというIPアドレスを使って通信させる方法が分かりません。
というのも、Port81をListenするだけではそのマシンのメインIP、A.A.A.Aが使われてしまうためです。

このような事はどのように設定すると実現出来るのでしょうか。
ネットワーク利用者が増えて外部通信時のIPを増やした場合にも問題なくスケール出来るロジックですとベストです。
具体的な設定方法またはそれが分かるURLを教えて頂けると幸いです。

なお、最近スパム投稿が増えてきてしまっているため、大変恐縮ですが初めて人力検索はてなで解答される方はコメント欄に一言頂けましたら、オープンします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/09/15 00:22:01
  • 終了:2010/09/22 00:25:03

回答(2件)

id:monyot No.1

monyo回答回数146ベストアンサー獲得回数182010/09/15 01:49:23

ポイント35pt

squidで実装する場合は、

http_port x.x.x.x:80

http_port x.x.x.x:81

acl localip1 myport 80

tcp_outgoing_address A.A.A.A localip1

acl localip2 myport 81

tcp_outgoing_address A.A.A.B localip2

のような形態で実装できませんか。

x.x.x.x は内側のIPアドレスです。

id:ko-takada

なるほど、こういう設定が出来るのですね。

完璧です。ありがとうございました。他に方法がなければこちらの手法を使いたいと思います。

squidはセキュリティをかなりきつくしないと悪用されかねないので、慎重に設定をします。

もしApacheやその他アプリケーションで出来る方法をどなたかご存じでしたら、教えて頂けると幸いです。

2010/09/16 08:57:03
id:t-wata No.2

t-wata回答回数82ベストアンサー獲得回数132010/09/16 14:29:01

ポイント35pt

apache + mod_proxyでやるならこんな感じです。(x.x.x.a, b, cはグローバルIPアドレス)

Listen x.x.x.a:80
Listen x.x.x.b.81
Listen x.x.x.c:82

<VirtualHost x.x.x.a:80>
# ローカルコンテンツを返す
ServerName hostname.example.com
DocumentRoot /var/www
</VirtualHost>

<VirtualHost x.x.x.b:81>
ProxyPreserveHost On
ProxyPass / http://A.A.A.B
ProxyPassReverse / http://A.A.A.B/
ServerName hostname2.example.com
</VirtualHost>

<VirtualHost x.x.x.c:82>
ProxyPreserveHost On
ProxyPass / http://A.A.A.C
ProxyPassReverse / http://A.A.A.C/
ServerName hostname3.example.com
</VirtualHost>
 

また、上記VirtualHostのリスンアドレスを全部同じに設定しても、クライアントがホスト名を使ってアクセスしてくるのであれば

hostname1.example.com, hostname2.example.com, hostname3.example.comで振り分けることもできます。

この場合IPアドレスは1つでも複数のマシンに対するリバースプロキシが構成できるので、LANの中のマシンが100台、200台に増えた場合でもグローバルIPアドレス1つで対応できます(負荷を考えなければ)。

プロキシサーバの負荷が高い場合、グローバルIPアドレスが複数あれば、同じような設定のプロキシサーバを複数用意して、DNSラウンドロビンで負荷分散すれば良いです。

  • id:t-wata
    マシンA: A.A.A.A、マシンB: A.A.A.B、マシンC: A.A.A.C、いずれもグローバルIPアドレスだとして、
    A.A.A.A:80 → マシンA
    A.A.A.A:81 → マシンA (proxy) → マシンB
    A.A.A.A:82 → マシンA (proxy) → マシンC
    となるようにマシンAを設定したいのか、それとも
    A.A.A.A:80 → マシンA
    A.A.A.B:81 → マシンA (proxy) → マシンB
    A.A.A.C:82 → マシンA (proxy) → マシンC
    となるようにマシンAを設定したいのかが良く分からない。
    どちらかといえば後者のように読めるんだけど、後者は不可能だし、下みたいにすれば同じな訳で目的が良く分からないです。
    A.A.A.A:80 → マシンA
    A.A.A.B:81 → マシンB
    A.A.A.C:82 → マシンC
    もしどうしても後者のやり方でやりたいなら、前提であるIPアドレスの割り振りを見直して、マシンAにIPアドレス3つを割り当ててしまい、残りのマシンB,CはプライベートなIPアドレスを割り当てて、Aからプロキシするとか、そういうやり方しか無いです。
  • id:t-wata
    あと、異なるIPアドレスにバインドするなら、全部ポートは80でもいいのですが、なぜずらしているのでしょう?
    また、proxyするなら、マシンBやマシンCはグローバルIPアドレスを割り当てなくても良いのですが、わざわざグローバルIPを割り当てる理由は何でしょう?

    一応マシンAに3つのIPアドレスを持たせれば、
    A.A.A.A:80 → マシンA
    A.A.A.B:80 → マシンA (proxy) → マシンB(プライベートIPアドレス B.B.B.B)
    A.A.A.C:80 → マシンA (proxy) → マシンC(プライベートIPアドレス B.B.B.C)
    みたいにできるけど、これはDNSの設定ができるなら、IPアドレス1つでも
    siteA.yourcompany.com → A.A.A.A:80 → マシンA
    siteB.yourcompany.com → A.A.A.A:80 → マシンA(proxy) → マシンB(プライベートIPアドレス B.B.B.B)
    siteC.yourcompany.com → A.A.A.A:80 → マシンA(proxy) → マシンC(プライベートIPアドレス B.B.B.C)
    みたいにもできるわけで(後者はapacheのバーチャルホスト機能を使用)、IPアドレスを3つ持つ意味が無いです。

    > スケール出来るロジック
    これもよく分からないです。
    A.A.A.A:80 → マシンA
    A.A.A.B:80 → マシンB
    A.A.A.C:80 → マシンC
    これじゃ駄目なの?新しいIPアドレス増えたら、新しいマシンを追加するだけで簡単にスケールアウトできると思いますが。

    結局この手の話って負荷分散か、グローバルIP不足を克服することか、異なるサービスの受け口となるサーバを1つに集約してアクセス管理など管理を容易にすることか、セキュリティのためDMZを作ってB,Cを内部ネットワークに置くことなんかが目的として考えられるわけですが、どれにも該当しない(そう考えると矛盾する)ので良く分からないです。
  • id:ko-takada
    すみません、3つのIPを持ったProxyサーバに、その下にあるローカルIPを持った端末から接続する構成です。
    行いたい事としては回答者1の方が答えて頂いているので、その他の実装方法も調査中です。

    スケール出来るロジックに関してですが、例えばIPが29個あった場合、Proxyサーバを29台用意するのは非現実的ですよね?
    そして、LANの中のマシンが200台になったからと言って、グローバルIPを200個割り当てるのも非現実的だと思います。
  • id:b-wind
    >グローバルIPを200個割り当てるのも非現実的だと思います。
    別に200台分のアクセスをさばければ問題ないと思うけど?

    見る限り単なるリバースプロキシだしさほど現実的でないほどの性能が要求されるわけでもなさそうだし。
  • id:monyot
    質問文から、行いたいことは

    >すみません、3つのIPを持ったProxyサーバに、その下にあるローカルIPを持った端末から接続する構成です。

    ということはわかったので、その方法を回答してみました。ただ、スケールの観点でいうと、IPアドレスだけを振り分けてもあまり意味はないような……。IPアドレスを複数わけても、プロキシ処理をするのが、同一のプロキシサーバ内であれば、結局そこの処理が先にネックになるように思います。

    各IPが別々のプロバイダのネットワークにつながっているというのであれば、また話は別ですが。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません