• ベストアンサー

iptablesとsquid

local networkには、サーバーAとサーバーBがあります。 サーバーBではsquidが動いています(ポート:3128) IPは外部へ公開していません。 外部からのプロキシへの通信はサーバーAに届きます。 届いた外部の通信をiptablesでローカルネットワークでサーバーBへ転送したいと考えています。 これは可能でしょうか。 方法をご教授いただければ助かります。 なお、iptablesではなく、他の方法でもOKです。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

 "なにかの業務用のWebアプリのシステム" (クラウド上) | Internet | 社内LAN  |"サーバーA" (グローバルIP)  |"サーバーB(squid)" があって、システム側でクライアントのIP制限がしてあるので 社内のクライアントPCからは、直接アクセスできないが サーバーBをProxyとして利用することで使えている。 さらに、このシステムに、社外会社からのアクセスが必要になったが このシステムに直接アクセス可能なサーバーBのIPアドレスは知られたくないので、 外部会社にはサーバーAのIPアドレスとポート番号を告知するだけにしたい。 っていうことなのですね。 それなら、サーバーAのiptablesでポート転送してしまえばよいです。 いろいろやりかたはありますが、DNATを使うなら iptables -t nat -A PREROUTING -d {サーバーAのIPアドレス} -p tcp --dport {サーバーAで待ち受けているポート番号} -j DNAT --to-destination {サーバーBのIPアドレス}:{squidのポート番号} って感じです。 (例えば、iptables -t nat -A PREROUTING -d 192.168.0.3 -p tcp --dport 3128 -j DNAT --to-destination 192.168.0.100:3128 ) アクセス元となる外部会社のIPアドレスが固定IPなら、さらに -s {外部会社側のグローバルIPアドレス} も指定すると、クライアントのIPアドレス制限をしていることになるので、 より安全です。 ただ… 確かにこうすれば、見かけ上は、サーバーBのIPは外部会社には知られていませんが サーバーAにアクセスできれば、サーバーBにアクセスできてしまうことになるので サーバーBのIPを知らせて、Proxyを外部公開しているのとほどんど変わりません。 なので、なにか意味があるのかな という気はしますが。 (サーバーAがDDos攻撃等を受けても、サーバーBには影響しないというメリットはありますが)

get_star
質問者

補足

ありがとうございます。 試してみましたが、うまくいけていないです。 sysctl -w net.ipv4.ip_forward=1 sysctl net.ipv4.ip_forward # net.ipv4.ip_forward = 1 (1)初期状態: iptables -L =============================== Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere ACCEPT udp -- anywhere anywhere ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination =============================== iptables -t nat -L =============================== Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination =============================== (2)設定 iptables -t nat -A PREROUTING -d Aの外部IP -p tcp --dport 20002 -j DNAT --to-destination Bの内部IP:BのSquidのport iptables -t nat -A PREROUTING -d Aの内部IP -p tcp --dport 20002 -j DNAT --to-destination Bの内部IP:BのSquidのport iptables -t nat -A PREROUTING -d Aの外部IP -p udp --dport 20002 -j DNAT --to-destination Bの内部IP:BのSquidのport iptables -t nat -A PREROUTING -d Aの内部IP -p udp --dport 20002 -j DNAT --to-destination Bの内部IP:BのSquidのport ※外部IPと内部IPのどちらがいいかわからないので、とりあえず全部設定しました。udpも。 (3)結果 iptables -t nat -L =============================== Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- anywhere xxxxxxxxxxxxxxxxx tcp dpt:commtact-http to:Bの内部IP:BのSquidのport DNAT tcp -- anywhere xxxxxxxxxxxxxxxxx tcp dpt:commtact-http to:Bの内部IP:BのSquidのport DNAT udp -- anywhere xxxxxxxxxxxxxxxxx udp dpt:commtact-http to:Bの内部IP:BのSquidのport DNAT udp -- anywhere xxxxxxxxxxxxxxxxx udp dpt:commtact-http to:Bの内部IP:BのSquidのport Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination =============================== (4)試し 別のサーバーで~/.wgetrcにproxyを設定して、wgetで試したら、レスポンスが戻ってこないです。 サーバーAでservice iptables restartでリセットして、 再度wgetで試したら、すぐに「failed: Connection refused.」が戻ってきました。 つまり、サーバーAのiptablesの設定は有効になっていますが、まだなんらかの設定が足りていないようです。 宜しくお願い致します。

その他の回答 (4)

回答No.5

> 転送先からレスポンスが戻ってきた際に、転送元への転送の設定は要りますか。 ネットワーク構成が不明ですので、なんとも。 転送先(この場合サーバーB)と転送元(サーバーA)は同一セグメントですか? それとも サーバーAとサーバーBの間にルータ相当のものはありますか? それぞれのデフォルトゲートウェイは同じですか?

get_star
質問者

お礼

4週間は経過しまして、質問は締め切りとなりました。 この問題はまだ解決できていませんが、今までご回答を頂きまして、ありがとうございました。 ベストアンサーにします。

get_star
質問者

補足

サーバーAとサーバーBは同じセグメントです. AとBの間に、ルータはありません。 デフォルトゲートウェイは同じです。

回答No.4

応答おそくなりました。 これまでのご説明された内容を読んでも、いまだにネットワークの構成はっきりしませんが、 もしかして、サーバーB側でアクセス元のIP制限をしているのかもしれませんね。 これを調べてみては如何でしょう。 それ以外にも 外部→内部があるということは、L3スイッチまたはルータがあるっていうことでしょうから そこでのポート転送やIP制限 またはDMZ設定内容 また、サーバーAでのFirewall設定やルーティングや サーバーBでのFirewall設定、squidでのACL 等々が絡んできますから、現状を整理し直すことをお薦めします。

get_star
質問者

補足

回答ありがとうございます。 他に制限されていることろはないと思いますが、調べてみます。 ちなみに、初歩的な質問ですみませんが、 iptableのPREROUTINGで転送元から転送先へ転送していますが、 転送先からレスポンスが戻ってきた際に、転送元への転送の設定は要りますか。 よろしくお願いいたします

回答No.2

>>サーバーBをネットワーク設定(IPアドレスやデフォルトゲートウェイやDNS設定) >>をすればよいだけです。 >すみませんが、ネットワークの設定についてこちらは全然詳しくないです。 >もし簡単にできそうであれば、教えていただけますか。 上記は、LAN内からサーバーBのProxyサービスを使えればよいだけの場合の話で、 外部へProxyを公開するための話ではありません。 Inbound方向のポート転送をどんな機器でやってるか 全ポートを無条件にサーバーAに向けているのか・それともWWWポートだけなのか サーバーAのOSのディストリビューションやバージョン サーバーBのアクセス制限(IP等) 等々のネットワーク構成の詳細が不明確ですので、 そのあたりを明確にしないと無理です。 なお、Proxyの外部公開なんてのは、かなりリスキーな行為です。 クライアント側のIP制限またはクライアント証明または認証を行わずに 無条件に公開すると、 IPを隠ぺいするために悪用されることになります。 ネットワークには詳しくないとのことですが、このあたりはネットワーク管理者に 相談して、セキュリティーポリシーとして違反していないかをきちんと確認してもらってからのほうがよいです。

get_star
質問者

補足

返事が遅れましてすみません。 うちのシステムには厳しいIP制限があり、 サーバーBからの接続しか許可していません。 サーバーBのSquidにBasic認証があり、契約したお客さんだけが利用できるようになっています。 この度、システムの新機能追加で外部会社への委託が検討されていますが、サーバーBのIPは知られたくないです。  ※お客さんが使用しているBasic認証のアカウントは自由に変更できないです。 ということで、サーバーAを立ち上げ、サーバーBにリクエストを転送することになりました。 ちなみに、サーバーAのIPも許可すればいいということですが、 既存システムの変更はNGになっています。 システムの詳細:  システムはAWSのEC2にあります。  サーバーAとサーバーBはCentos6です。  サーバーBのIP制限はないです。Basic認証のみ。  転送するのはHTTPとHTTPS通信だけです。 宜しくお願い致します。

回答No.1

構成がよくわかりませんが (1) Internet | 【BBルーター】等  (※ OUT→INは特定ポートはサーバーAへ転送) | |-サーバーA(公開Web用?) |-サーバーB(squidでProxy) |-PC etc (2) Internet | 【サーバーAでルータ兼用】   (iptablesでIN→OUTはIPマスカレード / OUT→INはDROP) | |-サーバーB(squid) |-PC etc のどちらでしょう? また、やりたいことは、Proxy(squid)の外部公開ですか? それとも、サーバーBのsquidが外部に通信してWeb代理アクセスできればよいだけですか? 後者なら 「届いた外部の通信をiptablesでローカルネットワークでサーバーBへ転送したいと考えています。」 のような、OUT→INのポート転送をする必要はありません。 ローカルのPCが外部のWebサーバーへアクセスできるのと同じように サーバーBをネットワーク設定(IPアドレスやデフォルトゲートウェイやDNS設定) をすればよいだけです。

get_star
質問者

補足

ご回答ありがとうございます。 実現したいのは、プロキシサーバーBの公開ですが、 サーバーBのIPは社内の事情で公開できないです。 なお、サーバーAにSquidのインストールもできないです。 >ローカルのPCが外部のWebサーバーへアクセスできるのと同じように >サーバーBをネットワーク設定(IPアドレスやデフォルトゲートウェイやDNS設定) >をすればよいだけです。 すみませんが、ネットワークの設定についてこちらは全然詳しくないです。 もし簡単にできそうであれば、教えていただけますか。