質問: いつもお世話になっております。 現在、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: 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: 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での運用方法や上記のエラーに関して、何か解決のヒントになるようなことが ございましたら、ご教授いただけると助かります。 それでは、よろしくお願いいたします。
回答: `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 など)に接続できるか