因為 這個 需求,我先在自己的機器實驗成功後,到公司 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 第二張網卡,流程大概如下:
- 取的網卡的網路資訊, 包含 IP/Mask/Gateway … etc
- 將網路資訊寫入設定,ubuntu 是放在
/etc/network/interfaces.d/
- 重新啟動網卡,分別測試兩張網卡是否正常
取得第二張網卡的資訊
所以要手動執行以下 script。這段流程是:
- 取得網路資訊
- 透過
ifconfig
取的相關資訊, 產生 eth1.cfg
- 把產生的設定檔,寫回
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