質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

Q&A

解決済

1つの仮想サーバ上のSQUIDでの複数IP運用について

chapter
chapter

総合スコア36

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

1回答

0グッド

1クリップ

12588閲覧

投稿2016/05/28 17:47

いつもお世話になっております。

現在、GMO ALTUSにて1つの仮想サーバにSQUIDを導入して
プロキシサーバとして稼働させています。

CentOS 6.4
SQUID 3.1.23

1つのグローバルIPで稼働させていた時は特に問題なく
利用できていたのですが、
このたび複数IPでの運用をしたいと思い、
試行錯誤している状態です。

GMO ALTUS上で、1つの仮想サーバに対して複数IPを割り当てる
方法については、GMOのサイトに記載されていた方法にしたがって、
セカンダリーIPアドレスを追加して、そのローカルIPに対して、
新たに追加したグローバルIPでNATの有効化まで完了しました。

https://support.gmocloud.com/pf/guide/basic/console/nat.html
https://support.gmocloud.com/pf/guide/basic/useful/ip.html

Bash

1$ ip a 21: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 3 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 4 inet 127.0.0.1/8 scope host lo 5 inet6 ::1/128 scope host 6 valid_lft forever preferred_lft forever 72: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 8 link/ether 06:81:84:00:21:24 brd ff:ff:ff:ff:ff:ff 9 inet 172.31.28.67/21 brd 172.31.31.255 scope global eth0 10 inet 172.31.26.135/20 brd 172.31.31.255 scope global eth0:0 11 inet6 fe80::481:84ff:fe00:2124/64 scope link 12 valid_lft forever preferred_lft forever

この後、SQUIDで複数IPで運用する方法について、調べた結果として、
試したのが以下になります。

Bash

1$ vi /etc/squid/squid.conf 2 3# ポートのLISTENにローカルIPを設定 4http_port 172.31.28.67:80 5http_port 172.31.26.135:80 6 7# aclを記述 8acl ip1 myip 172.31.28.67/24 9acl ip2 myip 172.31.26.135/24 10 11# outgoingアドレスでグローバルIPを設定 12tcp_outgoing_address XXX.XXX.XXX.XX1 ip1 13tcp_outgoing_address XXX.XXX.XXX.XX2 ip2

また、「dns_nameservers」の設定も必要という情報があったので、
/etc/resolv.conf に記述されていたIPアドレスを記述しました。

上記を設定した後、SQUIDを再起動させたところ、
起動自体は問題なく完了しました。

しかしながら、プロキシサーバとして接続を試みたところ、
両方のIPアドレスともに以下のようなエラーが発生してしまいました。

ERROR The requested URL could not be retrieved The following error was encountered while trying to retrieve the URL: http://www.cybersyndrome.net/env.cgi ソケット作成に失敗 システムが以下のエラーを返しました: (99) Cannot assign requested address おそらく過大な負荷のため、SquidはTCPソケットを作成できませんでした。再度リクエストしてください。

SQUIDの複数IPでの運用というよりも、別なエラーのようにも思えるので
直接上記のエラーに関するタイトルで質問した方がよいかも知れず、
現在のこのタイトルでの質問で適切か自信がなかったのですが、

1つのIPでの運用時は特に問題はなく、設定を戻してみると正常に繋がるので、
複数IPでの運用のために追加した設定に何らかの不備があると思い、
今回のタイトルで質問させていただきました。

複数IPでの運用方法や上記のエラーに関して、何か解決のヒントになるようなことが
ございましたら、ご教授いただけると助かります。

それでは、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

tcp_outgoing_address はグローバルIPアドレスではなく、サーバーが持っているローカルIPアドレスにしないと bind できないのでダメだと思います。
インターネットに出て行くときに、GMO 側でローカルIPアドレスをグローバルIPアドレスに変換してくれるはずです。

また、エラーとは関係ないですが、acl ip1 myip, acl ip2 myipip a で、ネットワークプレフィックスが合っていません。
ip a に合わせて 172.31.28.67/21, 172.31.26.135/20 とするか、172.31.28.67/32, 172.31.26.135/32 でもいいと思います。

###(2016/05/30 10:28 追記) ネットワークの問題切り分け
outbound (ip2からインターネット)
サーバー内から telnet, wget, curl, nmap などのコマンド(どれか 1つ)で Source address に ip2 を指定してインターネットに接続できるか確認します。

# telnet -b 172.31.26.135 www.google.com 80 Connected to www.google.com. Escape character is '^]'. GET / HTTP/1.0 (←入力後、リターン 2回) HTTP/1.0 302 Found (←応答が返ればOK) (略) # wget --bind-address 172.31.26.135 http://www.google.com/ (index.html がダウンロードできればOK) # curl --interface eth0:0 http://www.google.com/ (応答があればOK) # nmap -S 172.31.26.135 -e eth0 -Pn -sT -p 80 www.google.com (「80/tcp open http」であればOK)

inbound (インターネットからip2)

  • インターネットから ip2(のグローバルIPアドレス)に ping で接続できるか
  • telnet コマンドなどが利用できる場合、インターネットから ip2 のプロキシーポートに接続できるか
> telnet (ip2のグローバルIPアドレス) 80 GET http://www.google.com/ HTTP/1.0 (←入力後、リターン 2回)
  • インターネットから ip2(のグローバルIPアドレス)の他のサービス(sshd など)に接続できるか

投稿2016/05/29 03:13

編集2016/05/30 01:28
TaichiYanagiya

総合スコア11991

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

chapter

2016/05/29 04:53

TaichiYanagiyaさん、前回に引き続きご回答いただきありがとうございます。 アドバイスの通り、以下のようにSQUIDの設定ファイルを変更してみました。 -------------------------------------- # ポートのLISTENにローカルIPを設定 http_port 172.31.28.67:80 http_port 172.31.26.135:80 # aclを記述 acl ip1 myip 172.31.28.67/21 acl ip2 myip 172.31.26.135/20 # outgoingアドレスでローカルIPを設定 tcp_outgoing_address 172.31.28.67 ip1 tcp_outgoing_address 172.31.26.135 ip2 # DNSに/etc/resolv.conf に記述されていたIPアドレスを設定 dns_nameservers 172.31.25.152 -------------------------------------- SQUIDを再起動させたところ、最初に設定していた1つ目のグローバルIPでは プロキシサーバとして問題なく接続できるようになりましたが、 追加した2つ目のグローバルIPでは、ブラウザでアクセスした際に 下記エラーが出てしまいました。 -------------------------------------- インターネット接続がありません プロキシ サーバーに問題がある、またはアドレスが正しくありません。 -------------------------------------- acl ip1 myipの記述を以下に変更しても同様でした。 -------------------------------------- acl ip1 myip 172.31.28.67/32 acl ip2 myip 172.31.26.135/32 -------------------------------------- 何となくですが、SQUIDの設定ファイルに関しては、TaichiYanagiyaさんに アドバイスいただいた今回の方法で解決したけれど、 今度はGMO ALTUSのネットワーク設定周りの不備によって、 まだエラーが残っているのではないかと感じています。 なお、別のサーバから追加したグローバルIPにPingを送ると、 問題なく通信できている状態です。 (dns_nameserversに設定したローカルIPもPingは通りました。) また、GMO ALTUSのセキュリティーグループの「受信規則」では 今回のプロキシサーバで利用している80ポートは0.0.0.0/0で 許可してある状態です。 上記を踏まえまして、今回のエラーで何か注意すべきことや確認すべきことなど 何かございましたら、アドバイスいただけると幸いです。
TaichiYanagiya

2016/05/29 05:52

切り分けとして、サーバー内から「squidclient -h 172.31.26.135 -p 80 (URL)」で接続できるかどうか、/var/log/squid/access.log にログが記録されるかどうか確認ください。 サーバー内から接続できるのであれば、ファイアーウォール(iptables)や GMO 側の要因ではないかと思います。
chapter

2016/05/29 08:47

TaichiYanagiyaさん、ご返信ありがとうございます。 プロキシサーバから、以下のコマンドを入力したところ、 ------------------------------- squidclient -h 172.31.26.135 -p 80 http://google.com/ ------------------------------- しばらく時間がかかった後、「Alarm clock」と表示されました。 また、/var/log/squid/access.log のログには、次のように記録されていました。 ------------------------------- 1464510310.166 120004 172.31.26.135 TCP_MISS/000 0 GET http://google.com/ - DIRECT/google.com - ------------------------------- MISSというのが気になりましたが、こちらはキャッシュがヒットしなかっただけで 正常に接続できたということのようですので、ファイヤーウォールや GMO側の要因について、改めて調べなおしてみます。 ちょうど今別のテストでプロキシサーバを利用中なので、 後ほどiptablesを全て許可したりなど、試してみようと思いますが、 ひとまず途中経過をご報告させていただきました。 問題の切り分けに関するアドバイス、非常に助かりました。 ありがとうございます。
TaichiYanagiya

2016/05/29 13:57

TCP_MISS はキャッシュに存在しないということだと思いますが、相手から応答がなくタイムアウトしています。 おそらく、outbound (ip2 からインターネット)の新規接続が許可されていないのではないでしょうか。
chapter

2016/05/29 17:38

TaichiYanagiyaさん、ご返信ありがとうございます。 「Alarm clock」というのがタイムアウトだったのですね。 その後、iptablesを停止させてみましたが、変わらなかったので、 GMO ALTUSの説明ページをもう一度見直してみました。 https://support.gmocloud.com/pf/guide/basic/useful/ip.html STEP8の「NETMASK」利用しているネットワークのCIDRを指定 というところで、例示されている「NETMASK=255.255.240.0」を そのまま使ってしまったのですが、元々のローカルIPが 「172.31.28.67/21」となっていたので、 「NETMASK=255.255.248.0」に変更して、 ネットワークの設定を削除&追加してみました。 ---------------------------------------------------------- $ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 06:81:84:00:21:24 brd ff:ff:ff:ff:ff:ff inet 172.31.28.67/21 brd 172.31.31.255 scope global eth0 inet 172.31.26.135/21 brd 172.31.31.255 scope global secondary eth0:0 inet6 fe80::481:84ff:fe00:2124/64 scope link valid_lft forever preferred_lft forever ---------------------------------------------------------- こちらに合わせて、SQUIDの設定ファイルを一部以下のように変更してみました。 ---------------------------------------------------------- # aclを記述 acl ip1 myip 172.31.28.67/21 acl ip2 myip 172.31.26.135/21 ---------------------------------------------------------- SQUIDを再起動後に、改めてプロキシサーバから接続の確認をしたところ ---------------------------------------------------------- squidclient -h 172.31.26.135 -p 80 http://www.yahoo.co.jp/ ---------------------------------------------------------- ソースコードが無事に表示され、ログにも以下のように記録されました。 ---------------------------------------------------------- 1464542967.164 59 172.31.26.135 TCP_MISS/200 19958 GET http://www.yahoo.co.jp/ - DIRECT/183.79.71.173 text/html ---------------------------------------------------------- しかしながら、172.31.26.135に割り当てたグローバルIPでのプロキシ接続は 依然として下記エラーが出てしまう状況は変わりませんでした。 ---------------------------------------------------------- インターネット接続がありません プロキシ サーバーに問題がある、またはアドレスが正しくありません。 ---------------------------------------------------------- squidclient での接続ができたので解決できたかと思ったのですが、 残念ながらまだ何か問題が残っているようです。 これまでの状況で、更に何か確認すべき設定などがございますでしょうか?
chapter

2016/05/29 17:46

ちなみに、元々設定していたグローバルIPをブラウザに入力したところ、 SQUIDのエラーページと思われるのが表示されますが、 --------------------------------------------- ERROR The requested URL could not be retrieved --------------------------------------------- 追加した2つ目のグローバルIPをブラウザに入力すると、 以下のようなエラーとなっている状態です。 --------------------------------------------- このサイトにアクセスできません XXX.XXX.XXX.XXX からの応答時間が長すぎます。 ---------------------------------------------
TaichiYanagiya

2016/05/30 01:29

outbound は接続できたようですね。 今度は inbound がダメになったのでしょうか? 切り分け方法を回答に追記しました。
chapter

2016/05/30 04:52

TaichiYanagiyaさん、度々のご返信ありがとうございます。 追記の切り分け方法について確認してみました。 > outbound (ip2からインターネット) タイムアウトしてしまいました。 ------------------------------------- #telnet -b 172.31.26.135 www.google.com 80 Trying 216.58.220.228... telnet: connect to address 216.58.220.228: Connection timed out Trying 2404:6800:4004:814::2004... Couldn't bind to 172.31.26.135 172.31.26.135: Invalid argument ------------------------------------- > inbound (インターネットからip2) > インターネットから ip2(のグローバルIPアドレス)に ping で接続できるか ping接続はできました。 > telnet コマンドなどが利用できる場合、インターネットから ip2 のプロキシーポートに接続できるか > インターネットから ip2(のグローバルIPアドレス)の他のサービス(sshd など)に接続できるか telnet、ssh接続ともにタイムアウトしてしまいました。 念のため、改めてプロキシサーバから接続の確認をしたところ こちらはやはり大丈夫のようでした。 ------------------------------------- # squidclient -h 172.31.26.135 -p 80 http://www.google.com/ ------------------------------------- /var/log/squid/access.log ------------------------------------- 1464583039.599 7 172.31.26.135 TCP_MISS/302 600 GET http://www.google.com/ - DIRECT/216.58.197.196 text/html ------------------------------------- また、プロキシサーバのiptablesを停止させた状態でも同じ結果でした。 ちなみに、GMO側のファイヤーウォールの設定は、送信規則は制限なしで、 受信規則で許可しているのは、CIDR「0.0.0.0/0」でポートは80、443の他、 SSH用、MySQL用、Memchaced用、munin用になります。 現状、outboundはsquidclientでは接続できますが、telnetでは接続できない状態で、 inboundはpingでは接続できますが、telnetやsshでは接続できない状態のようです。 このような状態で何が原因かヒントになるようなことはございますでしょうか? 度々の質問で大変恐縮ですが、アドバイスいただけると助かります。
TaichiYanagiya

2016/05/30 05:46

最初の質問時点では、inbound ping および 80番ポートへ接続できていたようですが、現時点では inbound ping のみですね。 GMO ALTUS 側の設定に原因があると思うのですが、私にはわかりません。 outbound について、telnet で失敗、squidclient で成功は矛盾しています。 おそらく、squid.conf の acl ip1/ip2 myip のネットマスクを「/32」にしないと、両方 ip1 になってしまい、tcp_outgoing_address 172.31.28.67 ip1 で通信しているのだと思います。 前言撤回となってしまい申し訳ありませんが、acl ip1/ip2 myip のネットマスクは「/32」が正しいです。
chapter

2016/05/30 15:07

TaichiYanagiyaさん、ご返信ありがとうございます。 ネットマスクを「/32」にしたところ、squidclient でも成功しなくなりましたので、 outboundはどれもダメのようですね。 お陰さまで問題の切り分けがかなりできてきましたので、 GMOの技術サポートの方に問い合わせフォームから これまで設定した内容を伝えた上で、セカンダリIPに割り当てたグローバルIPで インターネットと接続するために、ネットワーク関連の設定で漏れがないか 確認しているところです。 解決策が分かるかどうかは不明ですが、また進捗がありましたらこちらに 追記させていただきますので、勝手ながら今しばらくはこちらの質問は クローズさせないでおきます。 たくさんのお時間とお手間をとっていただき、ありがとうございました。
chapter

2016/05/31 04:52

TaichiYanagiyaさん、こんにちは。 その後の結果をご報告いたします。 GMO ALTUSでセカンダリIPアドレスを追加した場合、 初回は仮想サーバーの再起動ではなく、コンソールからの停止・起動を 行わないと、正しい情報が反映されない仕様ということでした。 内部ファイル作成の問題で、現状ではサービス上の仕様とのことです。 お恥ずかしながらあまり重要視していませんでしたが、 今後はサーバの設定変更した場合は、再起動ではなく 停止・起動で対処しようと思います。 今回の大元の原因はGMOの仕様上、セカンダリIPの追加時には サーバの停止・起動を行わないと正常に反映されないということでしたが、 それ以外にも当初はSQUIDの設定ファイルの記述方法も間違っていたので、 そちらの修正について教えていただいたことと、 SQUIDとGMO側の問題の切り分けについてアドバイスいただいたことで 無事に解決できました。 本当にありがとうございました。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。