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

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

ただいまの
回答率

90.50%

  • CentOS

    3138questions

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

  • プロキシ

    34questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 4,943

chapter

score 28

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

現在、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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

また、エラーとは関係ないですが、acl ip1 myipacl ip2 myip と ip a で、ネットワークプレフィックスが合っていません。
ip a に合わせて 172.31.28.67/21172.31.26.135/20 とするか、172.31.28.67/32172.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 13: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で
    許可してある状態です。


    上記を踏まえまして、今回のエラーで何か注意すべきことや確認すべきことなど
    何かございましたら、アドバイスいただけると幸いです。

    キャンセル

  • 2016/05/29 14:52

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

    キャンセル

  • 2016/05/29 17: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を全て許可したりなど、試してみようと思いますが、
    ひとまず途中経過をご報告させていただきました。

    問題の切り分けに関するアドバイス、非常に助かりました。
    ありがとうございます。

    キャンセル

  • 2016/05/29 22:57

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

    キャンセル

  • 2016/05/30 02: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 での接続ができたので解決できたかと思ったのですが、
    残念ながらまだ何か問題が残っているようです。

    これまでの状況で、更に何か確認すべき設定などがございますでしょうか?

    キャンセル

  • 2016/05/30 02:46

    ちなみに、元々設定していたグローバルIPをブラウザに入力したところ、
    SQUIDのエラーページと思われるのが表示されますが、
    ---------------------------------------------
    ERROR
    The requested URL could not be retrieved
    ---------------------------------------------

    追加した2つ目のグローバルIPをブラウザに入力すると、
    以下のようなエラーとなっている状態です。
    ---------------------------------------------
    このサイトにアクセスできません
    XXX.XXX.XXX.XXX からの応答時間が長すぎます。
    ---------------------------------------------

    キャンセル

  • 2016/05/30 10:29

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

    キャンセル

  • 2016/05/30 13: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では接続できない状態のようです。

    このような状態で何が原因かヒントになるようなことはございますでしょうか?

    度々の質問で大変恐縮ですが、アドバイスいただけると助かります。

    キャンセル

  • 2016/05/30 14: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」が正しいです。

    キャンセル

  • 2016/05/31 00:07

    TaichiYanagiyaさん、ご返信ありがとうございます。

    ネットマスクを「/32」にしたところ、squidclient でも成功しなくなりましたので、
    outboundはどれもダメのようですね。

    お陰さまで問題の切り分けがかなりできてきましたので、
    GMOの技術サポートの方に問い合わせフォームから

    これまで設定した内容を伝えた上で、セカンダリIPに割り当てたグローバルIPで
    インターネットと接続するために、ネットワーク関連の設定で漏れがないか
    確認しているところです。

    解決策が分かるかどうかは不明ですが、また進捗がありましたらこちらに
    追記させていただきますので、勝手ながら今しばらくはこちらの質問は
    クローズさせないでおきます。

    たくさんのお時間とお手間をとっていただき、ありがとうございました。

    キャンセル

  • 2016/05/31 13:52

    TaichiYanagiyaさん、こんにちは。

    その後の結果をご報告いたします。

    GMO ALTUSでセカンダリIPアドレスを追加した場合、
    初回は仮想サーバーの再起動ではなく、コンソールからの停止・起動を
    行わないと、正しい情報が反映されない仕様ということでした。

    内部ファイル作成の問題で、現状ではサービス上の仕様とのことです。

    お恥ずかしながらあまり重要視していませんでしたが、
    今後はサーバの設定変更した場合は、再起動ではなく
    停止・起動で対処しようと思います。


    今回の大元の原因はGMOの仕様上、セカンダリIPの追加時には
    サーバの停止・起動を行わないと正常に反映されないということでしたが、

    それ以外にも当初はSQUIDの設定ファイルの記述方法も間違っていたので、
    そちらの修正について教えていただいたことと、
    SQUIDとGMO側の問題の切り分けについてアドバイスいただいたことで
    無事に解決できました。

    本当にありがとうございました。

    キャンセル

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

  • CentOS

    3138questions

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

  • プロキシ

    34questions

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