設定 EC2 Instance - Ubuntu 的第二張網卡


因為 這個 需求,我先在自己的機器實驗成功後,到公司 AWS EC2 設定。公司 AWS 架構比較複雜,所有的機器都在 VPC 裡面,如果要能夠讓外面進來,只有兩個選擇:ELB 或者是 加掛 EIP。 要讓 EIP 可以出去,就必須走 Internet Gateway (IGW),如果 EC2 Instance 放在 VPC 裡,那麼預設都是走 VGW (Virtual Gateway)。要讓這台機器可以同時在 VGW / IGW 兩端游走,後來想到的方法就是加掛另一張網卡 ENI,只是這張網卡的 CIDR 是在 IGW 的 Subnet。他們的關係大概長這樣:

1
2
3
4
5
6
7
      VPC
/ \
IGW VGW
/|\ /|\
Subnet Subnet --> NAT --> EC2 Instances
|
+--> EC2 Instance with EIP

設定好第二張網卡,以為直接掛上 EC2 Instance 就可以,AMI 是可以,但是 Ubuntu 似乎不行。AWS EC2 上的 Ubuntu 不會主動 attach 第二張網卡,流程大概如下:

  1. 取的網卡的網路資訊, 包含 IP/Mask/Gateway … etc
  2. 將網路資訊寫入設定,ubuntu 是放在 /etc/network/interfaces.d/
  3. 重新啟動網卡,分別測試兩張網卡是否正常

取得第二張網卡的資訊

所以要手動執行以下 script。這段流程是:

  1. 取得網路資訊
  2. 透過 ifconfig 取的相關資訊, 產生 eth1.cfg
  3. 把產生的設定檔,寫回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 取的網路資訊
sudo cp /etc/network/interfaces.d/eth0.cfg /etc/network/interfaces.d/eth1.cfg
sudo sed -i "s/eth0/eth1/g" /etc/network/interfaces.d/eth1.cfg
sudo ifdown eth1
sudo ifup eth1
sudo ifconfig eth1 | tee /tmp/ifconfig-eth1-output.txt
sudo ifdown eth1
sudo rm -f /etc/network/interfaces.d/eth1.cfg

# 取得網路資訊, 寫到 eth1.cfg
ETH0_IP=$(cat /tmp/ifconfig-eth1-output.txt | grep "inet addr:" | cut -f 2 -d':' | cut -f 1 -d' ')
ETH0_NETMASK=$(cat /tmp/ifconfig-eth1-output.txt| grep "inet addr:" | cut -f 4 -d':')
ETH0_GATEWAY=$(echo ${ETH0_IP} | sed "s/[0-9]*$/1/g")
echo "auto eth1" > /tmp/eth1.cfg
echo "iface eth1 inet static" >> /tmp/eth1.cfg
echo "address ${ETH0_IP}" >> /tmp/eth1.cfg
echo "netmask ${ETH0_NETMASK}" >> /tmp/eth1.cfg
echo "up ip route add default via ${ETH0_GATEWAY} dev eth1 table 1 metric 10001" >> /tmp/eth1.cfg
echo "up ip rule add from ${ETH0_IP}/32 table 1 priority 10001" >> /tmp/eth1.cfg
echo "up ip route flush cache" >> /tmp/eth1.cfg

# 將 eth1.cfg 寫回,啟動網卡
sudo cp -f /tmp/eth1.cfg /etc/network/interfaces.d/
sudo ifup eth1

完成後,確認 eth1 狀況

透過 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
root@ip-10-2-52-51:~# ifconfig
eth0 Link encap:Ethernet HWaddr 06:01:a0:26:fb:41
inet addr:10.2.52.51 Bcast:10.2.52.255 Mask:255.255.255.0
inet6 addr: fe80::401:a0ff:fe26:fb41/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:4437 errors:0 dropped:0 overruns:0 frame:0
TX packets:3214 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:929906 (929.9 KB) TX bytes:572028 (572.0 KB)
eth1 Link encap:Ethernet HWaddr 06:c5:fd:dd:e0:63
inet addr:10.2.53.51 Bcast:10.2.53.255 Mask:255.255.255.0
inet6 addr: fe80::4c5:fdff:fedd:e063/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:2053 errors:0 dropped:0 overruns:0 frame:0
TX packets:1618 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:173985 (173.9 KB) TX bytes:468061 (468.0 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:440 (440.0 B) TX bytes:440 (440.0 B)

測試

分別指定不同網卡,下 HTTP Request,確認是否有正確的 response,這邊對 ipinfo.io 下 request.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@ip-10-2-52-51:~# curl --interface eth0 --silent http://ipinfo.io
{
"ip": "xxx.xxx.xxx.xxx",
"hostname": "ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com",
"city": "Tokyo",
"region": "Tokyo",
"country": "JP",
"loc": "35.6850,139.7514",
"org": "AS16509 Amazon.com, Inc.",
"postal": "100-0001"
}
root@ip-10-2-52-51:~# curl --interface eth1 --silent http://ipinfo.io
{
"ip": "xxx.xxx.xxx.xxx",
"hostname": "ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com",
"city": "Tokyo",
"region": "Tokyo",
"country": "JP",
"loc": "35.6850,139.7514",
"org": "AS16509 Amazon.com, Inc.",
"postal": "100-0001"
}
root@ip-10-2-52-51:~#

後續

  • 兩張網卡就會有權重的問題
  • Routing table 的問題
  • 因為第二張是對外開放,所以就會有資安的問題,Security Group 就要格外的小心設定。

Reference


Comments