• ベストアンサー

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設定) >をすればよいだけです。 すみませんが、ネットワークの設定についてこちらは全然詳しくないです。 もし簡単にできそうであれば、教えていただけますか。

関連するQ&A

  • iptablesの書き方

    iptablesの書き方を考えています。 後から見直した時、非常に見にくい物となったので、見やすい形で書き直したいと思っています。 もしくは、別の方がいいという意見がありましたらご教授ください ■書き方A:ipアドレスでまとめる方法(例として、宛先でまとめてます) <192.168.11.20への通信許可> ・192.168.11.11 から192.168.11.20への通信許可 ・192.168.11.1 から192.168.11.20への通信許可 <192.168.11.30への通信許可> ・192.168.11.11 から192.168.11.30への通信許可 ・192.168.11.1 から192.168.11.30への通信許可 ■書き方B:ポートでまとめる方法(例として、宛先ポートでまとめてます) ・192.168.11.11 から192.168.11.20:80への通信許可 ・192.168.11.1 から192.168.11.20:80への通信許可 ・192.168.11.1 から192.168.11.41:80への通信許可 iptablesは、どのように記述するのが後から見直した時に わかりやすいのでしょうか ご教授お願いします。

  • squid cache_peerのproxy-onlyオプションについて

    上位プロキシを指定したいsquidサーバのsquid.conf内で、   cache_peer 上位プロキシのIP parent 上位サーバのポート proxy-only とすると、下位squidではコンテンツをキャッシュしないのでしょうか? 構成は以下です。 インターネット ↑ squidサーバ#1 ↑ squidサーバ#2 ↑ クライアントPC 調べたところ、 「'proxy-only'を指定した場合、このキャッシュから取って来られたオブジェクトはローカルに保存されない。」 というような文献を見つけるのですが、 この「ローカル」の意味が、squidサーバ#2なのか、クライアントPCのブラウザキャッシュなのか、いまいち理解できないのです。 最終的に知りたいこととしては、proxy-onlyオプションを書いている限り、squidサーバ#2にキャッシュされることはないのか?ということです。 ご教授ください、宜しくお願いいたします。

  • linux squid squid.conf

    こんにちは、 <環境> OS:RedHat7 Proxy:Squid 100台ほどのクライアントのインターネットブラウズ用にプロキシサーバを2台用意している。 ブロードバンドルータは2台あり、2台のプロキシサーバが2台のブロードバンドルータにそれぞれつながっている。 クライアントは50台ずつ、利用するプロキシサーバを分けている。 職場のプロキシーサーバ(squid 別の人が設定)のsquid.confにブロードバンドルータのIPを示す箇所が見つかりません。ですが、ちゃんと それぞれのブロードバンドルータを利用している。 <質問> squidをプロキシとして利用していて squid.conf中にブロードバンドルータのIPを書いていない状況で、どのように特定のブロードバンドルータを見つけることができるのでしょうか? 何かお分かりの方がいましたら教えてください。よろしくお願いします。

  • DNSとiptablesについて

    DNSの仕組みについて分からないので教えて頂きたいです。 現在、マスターとスレーブサーバを構築しており、外向きの 名前解決など動作的には正常に動作していると思われます。 サーバはCentosで構築しており、iptablesで設定しています。 iptablesの一部で以下のように設定をしているのですが・・・ ------------------------------------------------------------------------- iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT ------------------------------------------------------------------------- 1.まず、TCP/UDP共にポートを開けておかないといかないと思うのですが、送信元   はANYで許可しておかないとダメでしょうか?   上位DNSサーバからの参照などに使われますよね?   もちろんbindの設定で、ゾーン転送はスレーブサーバへのみ許可しています。 2.スレーブサーバへのゾーン転送もできているのですが、マスタサーバ側のiptables   のログに下記のようなものが残っています。   送信元IPはスレーブサーバのIPでUDP送信ポート53が使われているようなのですが   送信ポート53は何に使われているのでしょうか?宛先ポート53との違いは? -------------------------------------------------------------------------- SRC=送信元IP DST=宛先IP LEN=72 TOS=0x00 PREC=0x00 TTL=62 ID=20999 PROTO=UDP SPT=53 DPT=47046 LEN=52 -------------------------------------------------------------------------- スレーブの53ポートからの通信がDNSの動作に必要なものであれば、iptablesのルールを追加 しようと思います。 情報が少ない場合は補足できる範囲で補足させて頂きます。 よろしくお願いします。

  • squidと多段プロキシ

    OS : RedHatLinux 7.2 + squid (標準でインストールされるバージョン) LAN側IP 192.168.1.0/24 GW 192.168.1.254 Linux IP:192.168.1.10 設定項目表を確認すると、WEBのプロキシサーバーのアドレスが 192.168.8.1:3128 となっているんです。 ただ、このサーバーは内部側になくてどうやら接続先に あるようなのです。教育機関のネットワークですので少し特殊と思います。 squid.confの中として http_port 8080 acl_*** src 192.168.1.0/255.255.255.0 http_access allow *** forwarded_for off この程度しか変更しておりません。 ただ、cache_peer 192.168.8.1 parene 3128 3130 の 項目を入れてみたのですが、変化無しでした。 Linux上でのブラウザでプロキシの設定のところを 192.168.8.1 に 設定するといいのですが、ローカルIP(192.168.1.10) を入れるとだめみたいです。 当然、クライアントにIP 192.168.8.1を入れると通ります。 クライアントはRedHatLinuxのプロキシを使いたいのです。 クライアント→Proxy→教育機関Proxy→WEB 皆様のお知恵をお借りしたいと思います。 よろしくお願いします。

  • Sorarisにおいてのsquidでのhttpレスポンスについて

    初めましてNo18-RBと申します。よろしくお願いします。 Soraris8でsquid-2.5.STABLE3を利用してプロキシサーバを構築しております。 Webサーバ1 -- Webサーバ2 -- プロキシサーバ -- インタネット このような構成になっているのですが、Webサーバ2はSoraris8でApache1.3.28を使用しmod_proxyモジュールでリバースプロキシを実現しています。 Webサーバ2とプロキシサーバ間の通信は8080ポートです。 Webサーバ1 -- Webサーバ2間の通信は80ポートです。 そこでインターネットからWebサーバ1のコンテンツにアクセスした際にプロキシサーバ→Webサーバ2とリバースプロキシされていくのですが、Webサーバ1からリダイレクトされたレスポンスのhttpヘッダーLocation部のURLの変化についてですが、 Webサーバ1 -- Webサーバ2へは Location:http://111.222.333.444(Webサーバ1のIP)/dir/ Webサーバ2 -- プロキシへは Location:http://AAA(Webサーバ2のhttpd.confのServername):8080/dir/ プロキシサーバ -- ブラウザへは Location:http://AAA(Webサーバ2のhttpd.confのServername):8080/dir/ のままレスポンスが返ってしまいリダイレクト先へアクセスできない状態です。Squidの設定でレスポンスのURLを変化させるような処理はできないのでしょうか? 以上よろしくお願い致します。

  • Squidの設定について

    教えてください。 CentOS6にSquidをインストールしました。 HTTP以外にもSMTPやDNS、FTPなどの通信も利用可能でしょうか? 設定方法とiptablesの設定方法を教えて頂けないでしょうか? よろしくお願いします。

  • iptablesを設定するとメールが送受信できません

    iptablesを設定すると外部からのメールの送受信ができません。 iptablesを止めると送受信ができます。 メールサーバー(OpenSSL+Postfix+Dovecot) OS:CentOS5 iptables内容: #!/bin/bash # set LOCALNET=(IPアドレス) #IPTABLES STOP /etc/rc.d/init.d/iptables stop #Default Rule iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP #LOCAL ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -s $LOCALNET -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH iptables -A INPUT -p tcp --dport 22 -j ACCEPT #HTTP iptables -A INPUT -p tcp --dport 80 -j ACCEPT # SSL iptables -A INPUT -p tcp --dport 443 -j ACCEPT #SMTPS iptables -A INPUT -p tcp --dport 465 -j ACCEPT #POP3S iptables -A INPUT -p tcp --dport 995 -j ACCEPT /etc/rc.d/init.d/iptables save /etc/rc.d/init.d/iptables start DNSは外部のを使っています。 サーバーには外部からSSHでアクセスしています。 iptablesを設定しても当たり前ですがSSHでアクセスができます。 メールはエラーというよりメーラーから出ていきません。 サイトにはアクセスができます。 ポートは空いています。 ただiptablesを設定すると465と995は到達ができません。 http://www.cman.jp/network/support/port.html こちらでチェック iptablesを止めるとすべてがうまくいくのでiptablesが原因だと思っていますが 素人すぎて情けないですがご教授のほど宜しくお願いします。,<(_ _)>

  • Linux 複数ISP時でのiptablesの設定

    ローカルとサーバー用にISPを分けて使用したいのですがその際の設定についてお聞かせください。 環境としてましてはISP1とISP2共に動的IP。CentOS6.2にNIC二枚挿しでルータ兼サーバとして使用しています。 インターネット ― (eth1)サーバ兼ルーター(eth0) ― ローカルPC サーバーIP:192.168.0.10 ネットワークアドレス:192.168.0.0/24 ppp0:ISP1(ローカルPC用) ppp1:ISP2(サーバ専用) 上記のようにしたいのですが現在はppp0のみで接続しています。 これにppp1を追加しサーバ専用に使いたいのですが思うようにいきません。 ppp0の設定をコピーしppp1を追加しifconfigにてppp1が稼動している事を確認。ip routeを設定してみるもうまくいかず。iptablesの設定も変えないといけないと思うのですが今一わかりません。 現在のppp0のみの設定は下記になります。これにppp1をサーバ用に追加するにはどうしたらいいか。 WAN='ppp0' LAN='eth0' LOCALNET='192.168.0.0/24' #----------------# # デフォルトルール # #----------------# iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT #---------------------------------# # 自ホストからのアクセスをすべて許可 # #---------------------------------# iptables -A INPUT -i lo -j ACCEPT #---------------------------------------------# # ローカルネットアドレスからのアクセスをすべて許可 # #---------------------------------------------# iptables -A INPUT -i $LAN -j ACCEPT iptables -A FORWARD -i $LAN -j ACCEPT #------------------------------------------------# # ローカルネットワーク内からのインターネット接続を許可 # #------------------------------------------------# iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward #--------------------------------------------------------# # 内部から行ったアクセスに対する外部からの応答アクセスを許可 # #--------------------------------------------------------# iptables -A INPUT -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT ~中略~ #----------------------------------------------------# # Webサーバー(80番ポート)HTTPへのアクセスをすべて許可 # #----------------------------------------------------# iptables -A INPUT -p tcp --dport 80 -j ACCEPT 上の設定の場合ppp1を追加する場合、WAN2を追加しWANを記述するべき箇所をコピーし追記するのか?もしくはeth1としたほうがいいのか? 例1: iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE WAN2='ppp1' iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE iptables -t nat -A POSTROUTING -o $WAN2 -j MASQUERADE 例:2 iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE WAN='eth1' iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE 正確な設定方法がわかりませんのでどこをどうすれば良いのか教えていただけると助かります。よろしくお願いします。

  • centos5.3でcupsを使ったプリンタ共有しています。(http

    centos5.3でcupsを使ったプリンタ共有しています。(http://192.168.1.1:631/printers/aaaa) この環境でプロキシサーバsquidを導入し、Windowsでプロキシサーバの設定をするとプリントできません。 (ローカルエリアネットワークの設定でアドレス欄192.168.1.1ポート3128) プリンタのプロパティは利用不可となります。cups+squidではネットワークプリンタは構築できないのでしょうか?