- PR -

透過型Proxyを2台のサーバで実現するには・・・

投稿者投稿内容
Dr.Doraemon
ぬし
会議室デビュー日: 2002/03/23
投稿数: 265
投稿日時: 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アドレスは定義した例を見つけることが出来ませんでした。

実現は不可能なのでしょうか?

申し訳ありませんが、ご教授願います。
よろしくお願いいたします。
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2004-11-05 23:34
こんばんわ.
引用:

Dr.Doraemonさんの書き込み (2004-11-05 22:44) より:

現在、透過型Proxyを構築したく、Squid+iptablesを使っての構築を考えているのですが、ルータとなるPCと透過型ProxyになるSquidが別のサーバ機になる場合は、ルータとなるサーバ機にiptablesでどのようなコマンドを投げればよいのでしょうか?


external -- router -- proxy -- client
ということですよね?
普通に proxy 機が default gateway を router に向けるだけではダメですか?
下位の proxy に router としての機能を持たせたくないなら,
bridge にして iptables + squid とすれば良いのでは?
Dr.Doraemon
ぬし
会議室デビュー日: 2002/03/23
投稿数: 265
投稿日時: 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番だけを転送することは不可能なのでしょうか?
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2004-11-06 02:02
引用:

Dr.Doraemonさんの書き込み (2004-11-06 00:00) より:

 ルータにするサーバにsquidを入れて上位のProxyを見に行くことも考えたのですが、機器の性能があまりよくないので、ボトルネックになることを懸念し、その方法はとらない手法を検討しております。


squid が動くことで負荷がかかると懸念されてます?
であれば,router-sv で動く squid では cache させなければどうでしょう?
当然 cache を格納する disk space も消費しませんし...
no_cache deny all なんてやれば良いのでは?
で,上位の cache proxy へまわせば如何でしょう?
※なんなら logging もしない設定も出来ます.
この方法なら iptables で transparent して,http だけを上位の proxy へ回送し,
それ以外は router-sv の default gateway に投げてくれるんじゃないかと...

引用:

 逆にいうと、上記構成のままiptablesを使って、別のproxyサーバにTCP80番だけを転送することは不可能なのでしょうか?


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 へ向けてやると...

こんな感じで如何でしょう?
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 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 が透過ではないですが...
Mattun
ぬし
会議室デビュー日: 2004/08/10
投稿数: 1391
投稿日時: 2004-11-06 08:33
引用:

1台のサーバでルータ+squidの場合は、
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --t-port 3128

という感じで、ポートのリダイレクトだけでよいようですが、PREROUTINGという命令が入る場合は、あて先のIPアドレスは定義した例を見つけることが出来ませんでした。



今手元にないのであれなんですが、
[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へ転送する」
みたいな機能ですから、今回やりたいことと技術的には同じでしょう。
Dr.Doraemon
ぬし
会議室デビュー日: 2002/03/23
投稿数: 265
投稿日時: 2004-11-06 23:50
引用:

squid が動くことで負荷がかかると懸念されてます?
であれば,router-sv で動く squid では cache させなければどうでしょう?
当然 cache を格納する disk space も消費しませんし...
no_cache deny all なんてやれば良いのでは?
で,上位の cache proxy へまわせば如何でしょう?
※なんなら logging もしない設定も出来ます.
この方法なら iptables で transparent して,http だけを上位の proxy へ回送し,
それ以外は router-sv の default gateway に投げてくれるんじゃないかと...



なるほど、ログまではかないように出来るのですね。
ディスクのスペースが少ないということと、ディスク自身の速度が速くないのでその辺は気にしておりました。早速squidの設定を見てみたいと思います。


引用:

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 へ向けてやると...



このmarkingとは、具体的にどのようにすればいいのでしょうか?
というか、markingとはなんなのでしょうか?

申し訳ありません。
教えていただけますでしょうか・・・。
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2004-11-07 01:38
こんばんわ.
引用:

Dr.Doraemonさんの書き込み (2004-11-06 23:50) より:

引用:

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 へ向けてやると...



このmarkingとは、具体的にどのようにすればいいのでしょうか?
というか、markingとはなんなのでしょうか?


ごくごく簡単に説明すると,
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 様のご要望に沿う通信の流れが生じるのはないかと.

如何でしょう?

スキルアップ/キャリアアップ(JOB@IT)