1つの仮想サーバ上のSQUIDでの複数IP運用について
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 9,950
いつもお世話になっております。
現在、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
$ 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/20 brd 172.31.31.255 scope global eth0:0
inet6 fe80::481:84ff:fe00:2124/64 scope link
valid_lft forever preferred_lft forever
この後、SQUIDで複数IPで運用する方法について、調べた結果として、
試したのが以下になります。
$ vi /etc/squid/squid.conf
# ポートのLISTENにローカルIPを設定
http_port 172.31.28.67:80
http_port 172.31.26.135:80
# aclを記述
acl ip1 myip 172.31.28.67/24
acl ip2 myip 172.31.26.135/24
# outgoingアドレスでグローバルIPを設定
tcp_outgoing_address XXX.XXX.XXX.XX1 ip1
tcp_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での運用方法や上記のエラーに関して、何か解決のヒントになるようなことが
ございましたら、ご教授いただけると助かります。
それでは、よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
tcp_outgoing_address
はグローバルIPアドレスではなく、サーバーが持っているローカルIPアドレスにしないと bind できないのでダメだと思います。
インターネットに出て行くときに、GMO 側でローカルIPアドレスをグローバルIPアドレスに変換してくれるはずです。
また、エラーとは関係ないですが、acl ip1 myip
, acl ip2 myip
と ip 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 など)に接続できるか
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/29 13:53
アドバイスの通り、以下のように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で
許可してある状態です。
上記を踏まえまして、今回のエラーで何か注意すべきことや確認すべきことなど
何かございましたら、アドバイスいただけると幸いです。
2016/05/29 14:52
サーバー内から接続できるのであれば、ファイアーウォール(iptables)や GMO 側の要因ではないかと思います。
2016/05/29 17:47
プロキシサーバから、以下のコマンドを入力したところ、
-------------------------------
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を全て許可したりなど、試してみようと思いますが、
ひとまず途中経過をご報告させていただきました。
問題の切り分けに関するアドバイス、非常に助かりました。
ありがとうございます。
2016/05/29 22:57
おそらく、outbound (ip2 からインターネット)の新規接続が許可されていないのではないでしょうか。
2016/05/30 02:38
「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 での接続ができたので解決できたかと思ったのですが、
残念ながらまだ何か問題が残っているようです。
これまでの状況で、更に何か確認すべき設定などがございますでしょうか?
2016/05/30 02:46
SQUIDのエラーページと思われるのが表示されますが、
---------------------------------------------
ERROR
The requested URL could not be retrieved
---------------------------------------------
追加した2つ目のグローバルIPをブラウザに入力すると、
以下のようなエラーとなっている状態です。
---------------------------------------------
このサイトにアクセスできません
XXX.XXX.XXX.XXX からの応答時間が長すぎます。
---------------------------------------------
2016/05/30 10:29
今度は inbound がダメになったのでしょうか?
切り分け方法を回答に追記しました。
2016/05/30 13:52
追記の切り分け方法について確認してみました。
> 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では接続できない状態のようです。
このような状態で何が原因かヒントになるようなことはございますでしょうか?
度々の質問で大変恐縮ですが、アドバイスいただけると助かります。
2016/05/30 14:46
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」が正しいです。
2016/05/31 00:07
ネットマスクを「/32」にしたところ、squidclient でも成功しなくなりましたので、
outboundはどれもダメのようですね。
お陰さまで問題の切り分けがかなりできてきましたので、
GMOの技術サポートの方に問い合わせフォームから
これまで設定した内容を伝えた上で、セカンダリIPに割り当てたグローバルIPで
インターネットと接続するために、ネットワーク関連の設定で漏れがないか
確認しているところです。
解決策が分かるかどうかは不明ですが、また進捗がありましたらこちらに
追記させていただきますので、勝手ながら今しばらくはこちらの質問は
クローズさせないでおきます。
たくさんのお時間とお手間をとっていただき、ありがとうございました。
2016/05/31 13:52
その後の結果をご報告いたします。
GMO ALTUSでセカンダリIPアドレスを追加した場合、
初回は仮想サーバーの再起動ではなく、コンソールからの停止・起動を
行わないと、正しい情報が反映されない仕様ということでした。
内部ファイル作成の問題で、現状ではサービス上の仕様とのことです。
お恥ずかしながらあまり重要視していませんでしたが、
今後はサーバの設定変更した場合は、再起動ではなく
停止・起動で対処しようと思います。
今回の大元の原因はGMOの仕様上、セカンダリIPの追加時には
サーバの停止・起動を行わないと正常に反映されないということでしたが、
それ以外にも当初はSQUIDの設定ファイルの記述方法も間違っていたので、
そちらの修正について教えていただいたことと、
SQUIDとGMO側の問題の切り分けについてアドバイスいただいたことで
無事に解決できました。
本当にありがとうございました。