在VPC內部以及與其他網路之間傳輸資料時,需要使用路由表來指導資料包的直接選取。對於彈性網卡來說,正確的路由配置是保證其能夠正確發送和接收資料的關鍵。ECS在附加網卡時,通常情況下會自動為附加的網卡配置預設路由。如果現有的路由不滿足您的需求,您可以按照本章節的指引通過配置路由表和規則來自行配置路由。
為網卡配置策略路由
策略路由是一種網路技術,允許根據特定的規則來決定資料包的傳輸路徑,而不是僅僅依賴於路由表中的預設路由。通過配置路由表和規則,您可以實現不同的路由策略,將特定的網路流量通過指定的網卡進行轉寄,以便更加精確地控制和管理網路流量的轉寄路徑。
適用情境
多網卡網路通訊問題:在使用輔助彈性網卡配合Elastic IP Address或NAT Gateway時,由於其預設路由優先順序低於主網卡,出站流量預設優先通過主網卡發送,可能導致流量經輔助網卡流入後由主網卡返回,引發Elastic IP Address通訊異常。此時可以通過配置策略路由,強制流量從接收資料的網卡原路返回,確保進出路徑一致。
流量負載平衡:多網卡環境下,每個網路介面可能串連到不同的網路或者服務於不同的目的,使用預設路由可能無法滿足所有的需求。例如,您可以將出站流量按照一定規則分配給不同的網路介面,從而實現流量的負載平衡。
存取控制:基於源地址、目的地址或其他參數定義路由規則,限制某些類型的流量只能通過指定的介面或路徑傳輸,實現一定程度上的網路隔離。
前提條件
網卡已綁定到執行個體。
具體操作,請參見建立並使用彈性網卡。
網卡已在執行個體作業系統內部生效。
具體操作,請參見配置彈性網卡在執行個體內部生效。
操作樣本
以下以輔助彈性網卡為例,您需要根據實際情況替換命令中的網卡標識、IP地址等資訊:
Linux執行個體
執行如下命令,為網卡添加路由表並配置路由策略。
ip -4 route add default via <eth1的網關地址> dev eth1 table 1001 ip -4 rule add from <eth1的IP地址> lookup 1001本樣本中以eth1為例,建立一張eth1使用的路由表1001和一條關聯至該路由表的路由策略,表示來自172.16.20.193的資料包由路由表1001決定其路徑,即將資料包發送至eth1出口。配置如下所示:
ip -4 route add default via 172.16.20.253 dev eth1 table 1001 ip -4 rule add from 172.16.20.193 lookup 1001配置開機時自動更新路由,使配置永久生效。
為eth1配置路由後,需要將上一步執行的命令寫入檔案,以便在開機時自動更新路由,否則重啟執行個體後該路由配置會失效。如果您是臨時測試,可忽略此步驟。
執行如下命令,開啟
/etc/rc.local檔案。vim /etc/rc.local按
i鍵進入編輯模式,將您上一步實際執行的命令寫入檔案,然後按Esc鍵退出編輯模式,輸入:wq儲存退出。說明注意替換命令中的網卡標識、網關地址等資訊。
執行如下命令,為
/etc/rc.local檔案添加執行許可權。sudo chmod +x /etc/rc.local
執行如下命令,查看建立的路由表和策略路由。
ip route list table 1001 && \ ip rule list系統返回查詢結果如下,表示建立的路由表和策略路由成功。
root@xxx:/etc/netplan# ip route list table 1001 && ip rule list default via 172.16.20.253 dev eth1 0: from all lookup local 32765: from 172.16.20.193 lookup 1001 32766: from all lookup main 32767: from all lookup default
Windows執行個體
執行如下命令,為網卡配置策略路由。
route add -p <目標網路> mask <子網路遮罩> <網關> if <介面索引> metric <路由優先順序>本樣本中以乙太網路2為例,設定一條路由,讓所有來自172.16.12.76的資料包都通過
172.16.12.253這個網關轉寄。配置如下所示:route add -p 0.0.0.0 mask 0.0.0.0 172.16.12.253 if 6 metric 1參數說明:
-p:使該路由成為永久性路由,重啟後仍然有效。預設不加
-p為臨時生效。目標網路:使用
0.0.0.0通常代表預設路由,即當沒有更具體的路由匹配時將使用的路由。子網路遮罩和預設閘道:網卡的子網路遮罩和預設閘道,您可以通過
ipconfig命令查看:C:\Users\Administrator>ipconfig Windows IP 配置 乙太網路適配器 乙太網路: 串連特定的 DNS 尾碼 . . . . . . . : cn-hangzhou.ecs.internal 本地連結 IPv6 地址. . . . . . . . : fe80::6926:88f5:e002:7443%3 IPv4 地址 . . . . . . . . . . . . : 172.16.20.241 子網路遮罩 . . . . . . . . . . . . : 255.255.255.0 預設閘道. . . . . . . . . . . . . : 172.16.20.253 乙太網路適配器 乙太網路 2: 串連特定的 DNS 尾碼 . . . . . . . : cn-hangzhou.ecs.internal 本地連結 IPv6 地址. . . . . . . . : fe80::46bd:a7fb:362e:f79f%6 IPv4 地址 . . . . . . . . . . . . : 172.16.12.76 子網路遮罩 . . . . . . . . . . . . : 255.255.255.0 預設閘道. . . . . . . . . . . . . : 172.16.12.253介面索引:網路介面的索引值。您可以通過
netsh interface ipv4 show interfaces命令查看:樣本中,乙太網路 2 對應的介面索引(Idx)為 6。
C:\Users\Administrator>netsh interface ipv4 show interfaces Idx Met MTU 狀態 名稱 --- ---------- ---------- ------------ --------------------------- 1 75 4294967295 connected Loopback Pseudo-Interface 1 3 15 1500 connected 乙太網路 6 15 1500 connected 乙太網路 2路由優先順序:metric n,數字越小優先順序越高。
執行
route print,查看新增加的路由是否已經出現在列表中。C:\Users\Administrator>route print =========================================================================== 介面列表 3...00 16 3e 0a d5 39 ......Red Hat VirtIO Ethernet Adapter 6...00 16 3e 4c 88 9c ......Red Hat VirtIO Ethernet Adapter #2 1...........................Software Loopback Interface 1 =========================================================================== IPv4 路由表 =========================================================================== 活動路由: 網路目標 網路遮罩 網關 介面 躍點數 0.0.0.0 0.0.0.0 172.16.12.253 172.16.12.76 15 0.0.0.0 0.0.0.0 172.16.12.253 172.16.20.241 15 127.0.0.0 255.0.0.0 在鏈路上 127.0.0.1 331 127.0.0.1 255.255.255.255 在鏈路上 127.0.0.1 331 127.255.255.255 255.255.255.255 在鏈路上 127.0.0.1 331 172.16.12.0 255.255.255.0 在鏈路上 172.16.12.76 271 172.16.12.76 255.255.255.255 在鏈路上 172.16.12.76 271 172.16.12.255 255.255.255.255 在鏈路上 172.16.12.76 271 172.16.20.0 255.255.255.0 在鏈路上 172.16.20.241 271 172.16.20.241 255.255.255.255 在鏈路上 172.16.20.241 271 172.16.20.255 255.255.255.255 在鏈路上 172.16.20.255 271 224.0.0.0 240.0.0.0 在鏈路上 127.0.0.1 331 224.0.0.0 240.0.0.0 在鏈路上 172.16.20.241 271 224.0.0.0 240.0.0.0 在鏈路上 172.16.12.76 271 255.255.255.255 255.255.255.255 在鏈路上 127.0.0.1 331 255.255.255.255 255.255.255.255 在鏈路上 172.16.20.241 271 255.255.255.255 255.255.255.255 在鏈路上 172.16.12.76 271 =========================================================================== 永久路由: 網路地址 網路遮罩 網關地址 躍點數 0.0.0.0 0.0.0.0 172.16.12.253 1 ===========================================================================
情境樣本
本樣本以Alibaba Cloud Linux 3.2為例,說明多網卡情境下,資料包從eth1進入,從eth0離開的情境。如果您對資料流向有嚴格要求,比如在安全性原則中設定了源IP白名單,僅授權特定網路介面對應的IP地址,但由於未正確繫結資料流量路徑,可能導致合法請求因源IP與介面不匹配而被拒絕,引髮網絡不通。您可以通過配置策略路由解決。
環境準備。
購買一台ECS執行個體。
具體操作,請參見自訂購買執行個體。
為ECS執行個體綁定一張輔助彈性網卡。
具體操作,請參見綁定輔助彈性網卡。
申請EIP,並以普通模式綁定到輔助彈性網卡eth1。
具體操作,請參見將EIP綁定至輔助彈性網卡。
綁定成功後,在 ECS 執行個體詳情頁單擊彈性網卡頁簽,可查看輔助網卡狀態為已綁定,IP 位址列顯示已指派的公網 IP(即 EIP)和主私網 IP。
準備測試端。
您可以以另一台開通了公網的ECS執行個體作為測試端,或者以您本地機器作為用戶端進行測試。
執行個體所在安全性群組添加入方向的允許訪問規則,源IP指定為測試端的公網IP,以允許通過ping EIP訪問ECS執行個體。
具體操作,請參見案例4:只允許特定協議的業務訪問。
在測試端執行以下命令,向ECS執行個體發送資料包。
ping 47.xx.xx.109注意替換IP地址為您為輔助網卡綁定的EIP的地址。
在ECS執行個體上執行以下命令對兩個網路介面eth0、eth1分別進行ICMP資料包監測。
執行以下命令,在網路介面
eth0上捕獲 ICMP協議的資料包。tcpdump -i eth0 icmp重新開啟一個視窗,執行以下命令,在網路介面
eth1上捕獲 ICMP協議的資料包。tcpdump -i eth1 icmp
查看結果。
未配置策略路由
可以看到,預設情況下,資料包從eth1介面進入,即eth1收到請求(request),但是從eth0返回(reply)。
在 eth0 上抓包,可以看到 ICMP echo reply:
[root@xxx ~]# tcpdump -i eth0 icmp dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 14:01:55.129356 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 142, length 40 14:01:56.141993 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 143, length 40 14:01:57.145388 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 144, length 40 14:01:58.163042 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 145, length 40在 eth1 上抓包,可以看到 ICMP echo request:
[root@xxx ~]# tcpdump -i eth1 icmp dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 14:01:55.129339 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 142, length 40 14:01:56.141980 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 143, length 40 14:01:57.145376 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 144, length 40 14:01:58.163030 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 145, length 40通過查看ECS執行個體的預設路由,可以看到eth0的預設路由優先順序為100(數值越小,優先順序越高),高於eth1的優先順序,因此資料包預設從eth0發出。
[root@i xxx ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.20.253 0.0.0.0 UG 100 0 0 eth0 0.0.0.0 172.16.20.253 0.0.0.0 UG 101 0 0 eth1 172.16.20.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 172.16.20.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1配置策略路由之後
參照為網卡配置策略路由的操作樣本,為ECS執行個體配置策略路由。
ip -4 route add default via 172.16.20.253 dev eth1 table 1001 ip -4 rule add from 172.16.20.177 lookup 1001再次在測試端執行
ping EIP。再次在ECS執行個體上監測不同網卡的ICMP資料包。
可以看到,資料包從eth1介面進入,收到請求(request)。之後,依然從網路介面eth1回複(reply),保持了源進源出的特性。
[root@xxx ~]# tcpdump -i eth0 icmp dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes [root@xxx ~]# tcpdump -i eth1 icmp dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 14:15:13.249277 IP 123.xxx.xxx.4 > iZbp1gt1xxx Z: ICMP echo request, id 2050, seq 150, length 40 14:15:13.249293 IP iZbxxx lh49gbqovzZ : 4: ICMP echo reply, id 2050, seq 150, length 40 14:15:14.263769 IP 123.xxx.xxx.4 > iZbp1gt1xxx Z: ICMP echo request, id 2050, seq 151, length 40 14:15:14.263783 IP iZbxxx lh49gbqovzZ : 4: ICMP echo reply, id 2050, seq 151, length 40 14:15:15.267143 IP 123.xxx.xxx.4 > iZbp1gt1xxx Z: ICMP echo request, id 2050, seq 152, length 40 14:15:15.267155 IP iZbxxx lh49gbqovzZ : 4: ICMP echo reply, id 2050, seq 152, length 40 14:15:16.275436 IP 123.xxx.xxx.4 > iZbp1gt1xxx Z: ICMP echo request, id 2050, seq 153, length 40 14:15:16.275449 IP iZbxxx lh49gbqovzZ : 4: ICMP echo reply, id 2050, seq 153, length 40
為網卡配置預設路由
目前ECS在附加網卡時,通常情況下會自動為附加的網卡配置預設路由。部分作業系統如Ubuntu 16不會為輔助彈性網卡配置預設路由(Ubuntu 18及以上會自動設定),預設路由的缺失可能導致您在指定網卡進行外部通訊時,出現網路連通問題。您可以參考如下步驟為網卡配置預設路由。
以下以Ubuntu16為例,為輔助彈性網卡eth1配置預設路由:
執行如下命令,查看網卡資訊。
ip aroot@xxx:/etc/network# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:16:3e:15:74:ee brd ff:ff:ff:ff:ff:ff inet 172.16.20.231/24 brd 172.16.20.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::216:3eff:fe15:74ee/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:16:3e:46:31:f4 brd ff:ff:ff:ff:ff:ff inet 172.16.20.199/24 brd 172.16.20.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::216:3eff:fe46:31f4/64 scope link valid_lft forever preferred_lft forever可以看到,輔助彈性網卡eth1已經在執行個體內部生效。
執行如下命令,查看路由資訊。
route -n可以看到,系統只為eth1配置了用於內部通訊的路由,沒有配置處理外部通訊的路由,即從eth1網路介面出去的路由。
root@xxx:/etc/network# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.20.253 0.0.0.0 UG 0 0 0 eth0 172.16.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 172.16.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1執行如下命令,為網卡配置預設路由。
ip -4 route add default via 172.16.20.253 dev eth1 metric 200-4:表示只處理IPv4地址172.16.20.253:eth1的網關地址metric 200:設定了此路由的度量值(優先順序)為200。較低的度量值表示更高的優先順序。如果存在多條到達同一目的地的不同路由,則會選擇度量值最低的一條。
配置開機時自動更新路由,使配置永久生效。
為eth1配置路由後,需要將上一步執行的命令寫入檔案,以便在開機時自動更新路由,否則重啟執行個體後該路由配置會失效。如果您是臨時測試,可忽略此步驟。
執行如下命令,開啟
/etc/rc.local檔案。vim /etc/rc.local按
i鍵進入編輯模式,將您上一步實際執行的命令寫入檔案,然後按Esc鍵退出編輯模式,輸入:wq儲存退出。說明注意替換命令中的網卡標識、網關地址等資訊。
執行如下命令,為
/etc/rc.local檔案添加執行許可權。sudo chmod +x /etc/rc.local
再次執行如下命令,可以看到為eth1添加的路由。
route -nroot@ixxxxxxxxxx:/etc/network# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.20.253 0.0.0.0 UG 0 0 0 eth0 0.0.0.0 172.16.20.253 0.0.0.0 UG 200 0 0 eth1 172.16.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 172.16.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1