こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

iptablesとsquid

local networkには、サーバーAとサーバーBがあります。

サーバーBではsquidが動いています(ポート:3128)
IPは外部へ公開していません。

外部からのプロキシへの通信はサーバーAに届きます。
届いた外部の通信をiptablesでローカルネットワークでサーバーBへ転送したいと考えています。

これは可能でしょうか。
方法をご教授いただければ助かります。

なお、iptablesではなく、他の方法でもOKです。

宜しくお願い致します。

投稿日時 - 2017-12-17 20:45:57

QNo.9408913

困ってます

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

 "なにかの業務用の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には影響しないというメリットはありますが)

投稿日時 - 2017-12-21 00:54:54

補足

ありがとうございます。

試してみましたが、うまくいけていないです。

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の設定は有効になっていますが、まだなんらかの設定が足りていないようです。

宜しくお願い致します。

投稿日時 - 2017-12-21 23:56:44

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

> 転送先からレスポンスが戻ってきた際に、転送元への転送の設定は要りますか。

ネットワーク構成が不明ですので、なんとも。

転送先(この場合サーバーB)と転送元(サーバーA)は同一セグメントですか?
それとも サーバーAとサーバーBの間にルータ相当のものはありますか?
それぞれのデフォルトゲートウェイは同じですか?

投稿日時 - 2017-12-29 13:43:22

補足

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

投稿日時 - 2017-12-29 22:03:24

お礼

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

投稿日時 - 2018-01-15 22:45:41

ANo.4

応答おそくなりました。
これまでのご説明された内容を読んでも、いまだにネットワークの構成はっきりしませんが、
もしかして、サーバーB側でアクセス元のIP制限をしているのかもしれませんね。
これを調べてみては如何でしょう。

それ以外にも
外部→内部があるということは、L3スイッチまたはルータがあるっていうことでしょうから
そこでのポート転送やIP制限 またはDMZ設定内容
また、サーバーAでのFirewall設定やルーティングや
サーバーBでのFirewall設定、squidでのACL
等々が絡んできますから、現状を整理し直すことをお薦めします。

投稿日時 - 2017-12-26 11:49:28

補足

回答ありがとうございます。

他に制限されていることろはないと思いますが、調べてみます。

ちなみに、初歩的な質問ですみませんが、
iptableのPREROUTINGで転送元から転送先へ転送していますが、
転送先からレスポンスが戻ってきた際に、転送元への転送の設定は要りますか。

よろしくお願いいたします

投稿日時 - 2017-12-29 06:59:09

ANo.2

>>サーバーBをネットワーク設定(IPアドレスやデフォルトゲートウェイやDNS設定)
>>をすればよいだけです。
>すみませんが、ネットワークの設定についてこちらは全然詳しくないです。
>もし簡単にできそうであれば、教えていただけますか。

上記は、LAN内からサーバーBのProxyサービスを使えればよいだけの場合の話で、
外部へProxyを公開するための話ではありません。

Inbound方向のポート転送をどんな機器でやってるか
全ポートを無条件にサーバーAに向けているのか・それともWWWポートだけなのか
サーバーAのOSのディストリビューションやバージョン
サーバーBのアクセス制限(IP等)
等々のネットワーク構成の詳細が不明確ですので、
そのあたりを明確にしないと無理です。


なお、Proxyの外部公開なんてのは、かなりリスキーな行為です。
クライアント側のIP制限またはクライアント証明または認証を行わずに
無条件に公開すると、 IPを隠ぺいするために悪用されることになります。
ネットワークには詳しくないとのことですが、このあたりはネットワーク管理者に
相談して、セキュリティーポリシーとして違反していないかをきちんと確認してもらってからのほうがよいです。

投稿日時 - 2017-12-19 11:38:59

補足

返事が遅れましてすみません。

うちのシステムには厳しいIP制限があり、
サーバーBからの接続しか許可していません。
サーバーBのSquidにBasic認証があり、契約したお客さんだけが利用できるようになっています。

この度、システムの新機能追加で外部会社への委託が検討されていますが、サーバーBのIPは知られたくないです。
 ※お客さんが使用しているBasic認証のアカウントは自由に変更できないです。

ということで、サーバーAを立ち上げ、サーバーBにリクエストを転送することになりました。

ちなみに、サーバーAのIPも許可すればいいということですが、
既存システムの変更はNGになっています。

システムの詳細:
 システムはAWSのEC2にあります。
 サーバーAとサーバーBはCentos6です。
 サーバーBのIP制限はないです。Basic認証のみ。
 転送するのはHTTPとHTTPS通信だけです。

宜しくお願い致します。

投稿日時 - 2017-12-20 23:23:13

ANo.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設定)
をすればよいだけです。

投稿日時 - 2017-12-18 17:18:12

補足

ご回答ありがとうございます。

実現したいのは、プロキシサーバーBの公開ですが、
サーバーBのIPは社内の事情で公開できないです。
なお、サーバーAにSquidのインストールもできないです。

>ローカルのPCが外部のWebサーバーへアクセスできるのと同じように
>サーバーBをネットワーク設定(IPアドレスやデフォルトゲートウェイやDNS設定)
>をすればよいだけです。

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

投稿日時 - 2017-12-18 23:49:09