- - PR -
透過型Proxyを2台のサーバで実現するには・・・
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-11-05 22:44
お世話になっております。
現在、透過型Proxyを構築したく、Squid+iptablesを使っての構築を考えているのですが、ルータとなるPCと透過型ProxyになるSquidが別のサーバ機になる場合は、ルータとなるサーバ機にiptablesでどのようなコマンドを投げればよいのでしょうか? 1台のサーバでルータ+squidの場合は、 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --t-port 3128 という感じで、ポートのリダイレクトだけでよいようですが、PREROUTINGという命令が入る場合は、あて先のIPアドレスは定義した例を見つけることが出来ませんでした。 実現は不可能なのでしょうか? 申し訳ありませんが、ご教授願います。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2004-11-05 23:34
こんばんわ.
external -- router -- proxy -- client ということですよね? 普通に proxy 機が default gateway を router に向けるだけではダメですか? 下位の proxy に router としての機能を持たせたくないなら, bridge にして iptables + squid とすれば良いのでは? | ||||||||
|
投稿日時: 2004-11-06 00:00
kaz様、早速のレスありがとうございます。
最初に構成図をかんたんに・・・ ┌────┐ ┌────┐port80のみ┌─────┐ ┌────┐ │internet│------│proxy-sv│----------│ router-sv│------│ client │ └────┘ └────┘ └─────┘ └────┘ クライアントは、ルータとなるサーバ機のIPアドレスがデフォルトゲートウェイになります。ルータとなるサーバは、クライアントからのポートインターネットへ80番でアクセスを要求した場合は、proxy-sv(router-svと同一のセグメント)にアクセスされ、それ以外の通信は、ルータサーバの持っているデフォルトゲートウェイへ送られる仕組みなります。 kazさんのご指摘のとおり、 逆にProxyをデフォルトゲートウェイにしてしまって、自分の持っていなゾーンはすべて、ルータに投げるという手はありますね。そういう逆の発想はでてきませんでした。 ルータにするサーバにsquidを入れて上位のProxyを見に行くことも考えたのですが、機器の性能があまりよくないので、ボトルネックになることを懸念し、その方法はとらない手法を検討しております。 逆にいうと、上記構成のままiptablesを使って、別のproxyサーバにTCP80番だけを転送することは不可能なのでしょうか? | ||||||||
|
投稿日時: 2004-11-06 02:02
squid が動くことで負荷がかかると懸念されてます? であれば,router-sv で動く squid では cache させなければどうでしょう? 当然 cache を格納する disk space も消費しませんし... no_cache deny all なんてやれば良いのでは? で,上位の cache proxy へまわせば如何でしょう? ※なんなら logging もしない設定も出来ます. この方法なら iptables で transparent して,http だけを上位の proxy へ回送し, それ以外は router-sv の default gateway に投げてくれるんじゃないかと...
iptables だけでは出来ないでしょうけど,iproute2 も使えば可能だと思います. ちょっと構成は違いますが,概念は同じかと. http://www.linux.or.jp/JF/JFdocs/Adv-Routing-HOWTO/lartc.cookbook.squid.html iproute2 で default gateway を定義して, さらに iptables で http(80/tcp)を marking して, その marking した packet を iproute2 で proxy へ向けてやると... こんな感じで如何でしょう? | ||||||||
|
投稿日時: 2004-11-06 02:12
と,前述で書きましたが,httptunnel で出来ちゃうかもしれませんね.
router-sv に httptunnel 入れて, # htc -F 80 proxy-sv:3128 とやってやれば良いでしょう. -F 80 で「80/tcp で listen」 proxy-sv は ip address のほうが良いかな? 3128 は proxy-sv の squid の listen port です. これだと proxy が透過ではないですが... | ||||||||
|
投稿日時: 2004-11-06 08:33
今手元にないのであれなんですが、 [Red Hat Linux Firewalls] http://www.amazon.co.jp/exec/obidos/ASIN/4797322691/ref=pd_sr_ec_ir_aps/249-0011892-8062774 あたりに、そんな例が載ってたと思います。 今回の構成そのものの例ではなく、iptablesを利用したリバースプロクシ構築の例だったと 思いますが、リバースプロクシ自体が 「ServerAのXPortへの接続を、ServerBのYPortへ転送する」 みたいな機能ですから、今回やりたいことと技術的には同じでしょう。 | ||||||||
|
投稿日時: 2004-11-06 23:50
なるほど、ログまではかないように出来るのですね。 ディスクのスペースが少ないということと、ディスク自身の速度が速くないのでその辺は気にしておりました。早速squidの設定を見てみたいと思います。
このmarkingとは、具体的にどのようにすればいいのでしょうか? というか、markingとはなんなのでしょうか? 申し訳ありません。 教えていただけますでしょうか・・・。 | ||||||||
|
投稿日時: 2004-11-07 01:38
こんばんわ.
ごくごく簡単に説明すると, Netfilter の機能で packet にある種の印を付けるわけです. で,その印を付けた packet だけを iproute2 の機能で上位の proxy へ向かわせます. 印の付いていない packet は普通に default gateway に向かうでしょう. この辺,あくまでも想像だったりするので, 保証できませんのでちゃんと検証してくださいね. とりあえず,iptables だけでは実現できないと思います, というか自分には思いつきません. 前述の link の事例では, 手前の router で http(tcp/80)とそれ以外を振り分けて, http(tcp/80)は proxy へ,それ以外は default route たる gateway へ, 更に proxy は最終的に default route たる gateway へ向かっています. つまり,途中の通信は分岐してますけど,最終的には gateway へ向かいます. この proxy が別の方向へ default route を向けていたら, 或いは Dr.Doraemon 様のご要望に沿う通信の流れが生じるのはないかと. 如何でしょう? |