ykore::tech_memo

技術的な事を適当に書きます

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);

~~~ (省略) ~~~