Contents
  1. 1. 前言
    1. 1.1. 緣起
    2. 1.2. 測試環境
  2. 2. 如何取得 EC2 Instance 的 Private IP address
  3. 3. 如何取得 EC2 Instance 的 Public IP address
    1. 3.1. 參考資料
  4. 4. ip 指令介紹
    1. 4.1. 在 CentOS 上需要另外安裝嗎?
    2. 4.2. 常用的 ip 指令
    3. 4.3. 備註:ip 指令的完整參數
    4. 4.4. 備註:ifconfig 指令的完整參數
    5. 4.5. 備註:hostname 指令的完整指令
    6. 4.6. 參考資料
  5. 5. Conclusion

前言

緣起

系統有一項功能需求,當新開啟的 EC2 Instance 需要自動地將本身的 IP 向系統註冊登錄,該如何讓 EC2 Instance 取得自己本身的 Private IP 和 Public IP address 呢?

最快的方法是在 EC2 上透過 curl 特定位置來查詢自身的 Metadata,除此之外,在 linux 環境下可透過 ipifconfig 指令來取得,算是比較通用的作法。

這邊整理上述2種做法,同時複習一下在 Linux 上查詢 IP 的相關指令。

測試環境

  • EC2 Instance 作業系統:CentOS 7
  • iproute2 工具包 v4.8 (ip 指令)

如何取得 EC2 Instance 的 Private IP address

  • 方法1:使用 ifconfig 指令

    1
    /sbin/ifconfig eth0 | grep 'inet ' | cut -f2 | awk '{ print $2}'
  • 方法2:SSH 登入 EC2 Instance 查詢 meta-data 資訊

    1
    curl http://169.254.169.254/latest/meta-data/local-ipv4

如何取得 EC2 Instance 的 Public IP address

  • 方法1:使用外部的查詢 IP 網頁來獲知自己的 IP 為何,例如

    1
    curl ifconfig.co
  • 方法2:AWS CLI aws ec2 describe-instances 搭配 jq 取得 EC2 資訊

    1
    aws ec2 describe-instances --filters Name=private-ip-address,Values=${ip} | jq -r '.Reservations[].Instances[].NetworkInterfaces[].Association.PublicIp'
  • 方法3:SSH 登入 EC2 Instance 查詢 meta-data 資訊

    1
    curl http://169.254.169.254/latest/meta-data/public-ipv4

參考資料

ip 指令介紹

ip 指令 (/bin/ip) 是 Linux 上有關 TCP/IP 流量控制與查詢的一系列工具 (工具包名稱是 iproute2)
其功能與老牌但已經不在維護的 ifconfig (/sbin/ifconfig) 相似,我們可以使用 ip 取代 ifconfig 指令。

在 CentOS 上需要另外安裝嗎?

不需要另外安裝,ip 指令在 RHEL 及 CentOS 也是預設安裝。而除了查詢網路設定外,也可以用作設定網路,以下是 ip 指令的一些常見用法。

常用的 ip 指令

查詢 ipv4 或 ipv6 的 IP address 資訊。

ipv4:

1
$ ip -4 addr

ipv6:

1
$ ip -6 addr

查詢個別網卡的資訊(網卡名稱及 IP address),有以下三種方式:

1
2
3
$ ip addr show eth0
$ ip addr list eth0
$ ip addr show dev eth0

備註:ip 指令的完整參數

1
2
3
4
5
6
7
8
9
10
11
12
13
# -> # ip --help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |
netns | l2tp | tcp_metrics | token }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
-4 | -6 | -I | -D | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } |
-o[neline] | -t[imestamp] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -a[ll] }

備註:ifconfig 指令的完整參數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-> # ifconfig --help
Usage:
ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]
[add <address>[/<prefixlen>]]
[del <address>[/<prefixlen>]]
[[-]broadcast [<address>]] [[-]pointopoint [<address>]]
[netmask <address>] [dstaddr <address>] [tunnel <address>]
[outfill <NN>] [keepalive <NN>]
[hw <HW> <address>] [mtu <NN>]
[[-]trailers] [[-]arp] [[-]allmulti]
[multicast] [[-]promisc]
[mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]
[txqueuelen <NN>]
[[-]dynamic]
[up|down] ...
<HW>=Hardware Type.
List of possible hardware types:
loop (Local Loopback) slip (Serial Line IP) cslip (VJ Serial Line IP)
slip6 (6-bit Serial Line IP) cslip6 (VJ 6-bit Serial Line IP) adaptive (Adaptive Serial Line IP)
ash (Ash) ether (Ethernet) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) rose (AMPR ROSE) tunnel (IPIP Tunnel)
ppp (Point-to-Point Protocol) hdlc ((Cisco)-HDLC) lapb (LAPB)
arcnet (ARCnet) dlci (Frame Relay DLCI) frad (Frame Relay Access Device)
sit (IPv6-in-IPv4) fddi (Fiber Distributed Data Interface) hippi (HIPPI)
irda (IrLAP) ec (Econet) x25 (generic X.25)
infiniband (InfiniBand) eui64 (Generic EUI-64)
<AF>=Address family. Default: inet
List of possible address families:
unix (UNIX Domain) inet (DARPA Internet) inet6 (IPv6)
ax25 (AMPR AX.25) netrom (AMPR NET/ROM) rose (AMPR ROSE)
ipx (Novell IPX) ddp (Appletalk DDP) ec (Econet)
ash (Ash) x25 (CCITT X.25)

備註:hostname 指令的完整指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-> # hostname --help
Usage: hostname [-b] {hostname|-F file} set host name (from file)
hostname [-a|-A|-d|-f|-i|-I|-s|-y] display formatted name
hostname display host name
{yp,nis,}domainname {nisdomain|-F file} set NIS domain name (from file)
{yp,nis,}domainname display NIS domain name
dnsdomainname display dns domain name
hostname -V|--version|-h|--help print info and exit
Program name:
{yp,nis,}domainname=hostname -y
dnsdomainname=hostname -d
Program options:
-a, --alias alias names
-A, --all-fqdns all long host names (FQDNs)
-b, --boot set default hostname if none available
-d, --domain DNS domain name
-f, --fqdn, --long long host name (FQDN)
-F, --file read host name or NIS domain name from given file
-i, --ip-address addresses for the host name
-I, --all-ip-addresses all addresses for the host
-s, --short short host name
-y, --yp, --nis NIS/YP domain name
Description:
This command can get or set the host name or the NIS domain name. You can
also get the DNS domain or the FQDN (fully qualified domain name).
Unless you are using bind or NIS for host lookups you can change the
FQDN (Fully Qualified Domain Name) and the DNS domain name (which is
part of the FQDN) in the /etc/hosts file.

參考資料

Conclusion

  • 取得 EC2 的 IP 最快的方法是在 EC2 上透過 curl 特定位置來查詢自身的 Metadata
  • 若要比較通用的作法,可在 linux 環境下可透過 ipifconfig 指令來取得。
Contents
  1. 1. 前言
    1. 1.1. 緣起
    2. 1.2. 測試環境
  2. 2. 如何取得 EC2 Instance 的 Private IP address
  3. 3. 如何取得 EC2 Instance 的 Public IP address
    1. 3.1. 參考資料
  4. 4. ip 指令介紹
    1. 4.1. 在 CentOS 上需要另外安裝嗎?
    2. 4.2. 常用的 ip 指令
    3. 4.3. 備註:ip 指令的完整參數
    4. 4.4. 備註:ifconfig 指令的完整參數
    5. 4.5. 備註:hostname 指令的完整指令
    6. 4.6. 參考資料
  5. 5. Conclusion