AWS EC2 で DDNS サービス (No-ip.com) を使った時に嵌まった
AWS EC2 で DDNS サービス (no-ip.com) を利用しようとした時に嵌まったのでその備忘。
やりたいこと
AWS上の単一のEC2 Webサーバー(Ubuntu) に No-ip.com で取得したドメインでアクセスしたい。
DUC のインストール
公式のインストールガイドを参考にした。
https://www.noip.com/support/knowledgebase/installing-the-linux-dynamic-update-client-on-ubuntu/
cd /usr/local/src wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz tar xf noip-duc-linux.tar.gz cd noip-2.1.9-1 make install
嵌まりポイント
make install 後、以下の表示から先に進まなくなってしまった。
if [ ! -d /usr/local/bin ]; then mkdir -p /usr/local/bin;fi if [ ! -d /usr/local/etc ]; then mkdir -p /usr/local/etc;fi cp noip2 /usr/local/bin/noip2 /usr/local/bin/noip2 -C -c /tmp/no-ip2.conf Auto configuration for Linux client of no-ip.com.
動きやソースコード(noip2.c)からネットワーク関係で詰まってそうな感じ。 AWS のセキュリティグループで Outbound のポートを制限していたので、試しに全開放したところツールが動き出した。
no-ip.com や AWS のサイトに記述が無さそうだったので、ソースコードを追ったり tcpdump
してみた。
すると、8245 ポート宛てに通信していたので、Outbound に「TCP/8245, 任意のIP」のルールを追加して解決。
以下ソースから抜粋
~~~ (省略) ~~~ #define CLIENT_IP_PORT 8245 ~~~ (省略) ~~~ int main(int argc, char *argv[]) { char *p; struct passwd *nobody; port_to_use = CLIENT_IP_PORT; ~~~ (省略) ~~~ if ((x = Connect(port_to_use)) != SUCCESS) { ~~~ (省略) ~~~ int Connect(int port) { int fd, i; struct in_addr saddr; struct sockaddr_in addr; struct hostent *host; host = gethostbyname(NOIP_NAME); if (!host) return NOHOSTLOOKUP; memcpy(&saddr.s_addr, host->h_addr_list[0], 4); memset((char *) &addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = saddr.s_addr; fd = socket(AF_INET, SOCK_STREAM, 0); ~~~ (省略) ~~~