<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Vnic on Tarragon</title><link>https://tarrragon.github.io/blog/tags/vnic/</link><description>Recent content in Vnic on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 27 Oct 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/vnic/index.xml" rel="self" type="application/rss+xml"/><item><title>VNIC（虛擬網路卡）</title><link>https://tarrragon.github.io/blog/devops/infra/knowledge-cards/vnic/</link><pubDate>Tue, 27 Oct 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/devops/infra/knowledge-cards/vnic/</guid><description>&lt;p>VNIC（virtual network interface card，虛擬網路卡）是雲端主機接上虛擬網路的那一張網卡。主機在網路上的身分都掛在它上面：所在的 &lt;a href="https://tarrragon.github.io/blog/devops/infra/knowledge-cards/subnet/" data-link-title="Subnet（子網路）" data-link-desc="VPC 內按可用區與暴露程度切出的子網段，決定資源有沒有一條通往網際網路的路徑">Subnet（子網路）&lt;/a>、私有 IP、公開 IP（有配發時），以及網卡層的防火牆規則（Oracle Cloud 的 NSG、AWS 的 &lt;a href="https://tarrragon.github.io/blog/devops/infra/knowledge-cards/security-group/" data-link-title="Security Group" data-link-desc="掛在資源網卡層級的有狀態防火牆，逐埠決定哪些來源能連進這個資源">Security Group&lt;/a>）。各家的名稱不同：Oracle Cloud 叫 VNIC，AWS 叫 ENI（Elastic Network Interface），Google Cloud 叫 network interface。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>主機與網路設定之間隔著 VNIC 這一層，所以「這台主機的私有 IP 是多少」「這台主機套用了哪些網卡層的防火牆規則（&lt;a href="https://tarrragon.github.io/blog/devops/infra/knowledge-cards/security-group/" data-link-title="Security Group" data-link-desc="掛在資源網卡層級的有狀態防火牆，逐埠決定哪些來源能連進這個資源">Security Group&lt;/a> 這一類）」查的都是它的 VNIC，不是主機本身。Oracle Cloud 的 CLI 也是這樣分工：&lt;code>oci compute instance list-vnics&lt;/code> 列出主機的 VNIC 與私有 IP，掛上或拿掉 NSG 用的是 &lt;code>oci network vnic update --nsg-ids&lt;/code>，而不是主機的指令。&lt;/p>
&lt;p>建立主機時，業者同時替它建一張主要的 VNIC；主機被刪除時，這張 VNIC 也跟著刪除，上面的私有 IP 與防火牆規則的掛載關係一起消失。所以主機被刪除再重建時，新主機拿到的是一張新的 VNIC：私有 IP 多半換了一個，原本掛在舊 VNIC 上的 NSG 要重新掛上去；而 NSG 本身與它的規則屬於虛擬網路，不跟著主機消失。主機只是停止時，VNIC 與私有 IP 都留著。在 Oracle Cloud 上實際重建過一次的資源去留與重新掛 NSG 的指令，見 &lt;a href="https://tarrragon.github.io/blog/devops/infra/cloud-providers/oracle-cloud/hands-on/private-ubuntu-egress-console-rebuild/" data-link-title="Oracle Cloud 私有子網路 Ubuntu 主機的實測紀錄：套件來源的出站（NAT gateway、路由與 NSG）、序列主控台的連線，以及被回收之後的重建" data-link-desc="要在 Oracle Cloud 沒有公開 IP 的私有子網路裡跑一台 Ubuntu 主機、讓它裝得到套件更新，或要經由序列主控台看主機的開機過程，或主機被閒置回收、停止或刪除之後要照原樣重建，或想知道 NAT gateway 要不要另外付費、開機磁碟扣掉多少區塊磁碟額度、合計超過 200 GB 時放不進額度的那一顆怎麼算、怎麼用 quota 擋下超額的建立、線上加大開機磁碟超過額度時怎麼算、空出額度之後付費磁碟多久轉成免費時，查實際跑過的指令、錯誤原文、重建腳本與每一步的讀法">Oracle Cloud 私有子網路 Ubuntu 主機的實測紀錄：套件來源的出站（NAT gateway、路由與 NSG）、序列主控台的連線，以及被回收之後的重建&lt;/a>〈被回收之後的重建：怎麼發現、留下與消失的資源、重建腳本〉。&lt;/p>
&lt;p>一台主機可以另外掛第二張以上的 VNIC，接到另一個 subnet；那些額外的網卡依各家的規則可以單獨拿掉，主要的那一張跟主機一起建立、一起刪除。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>主機重建之後，原本連得到網際網路的套件更新又逾時、而沒有任何錯誤訊息：新的 VNIC 沒有掛上原本的出站規則&lt;/li>
&lt;li>剛建好的主機，列出 VNIC 的查詢一時回空值：主機還在建立，VNIC 的掛載紀錄還沒出現&lt;/li>
&lt;li>同一個 subnet 裡兩台主機的防火牆行為不同：subnet 層的規則相同，差在各自 VNIC 上掛的 NSG 或 security group&lt;/li>
&lt;/ul>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>網卡層的規則只影響掛上它的那幾張 VNIC，subnet 層的規則影響整個 subnet，所以放規則的位置決定了影響範圍；而 VNIC 會隨主機重建而換新，所以：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>規則放在哪一層&lt;/strong>：只給一台主機的放行（例如只有它需要的出站）放在網卡層，掛在它的 VNIC 上；整個 subnet 都需要的放在 subnet 層。兩層怎麼合併見 &lt;a href="https://tarrragon.github.io/blog/devops/infra/cloud-providers/vm-options/networking/" data-link-title="網路：subnet、私有 IP、公開 IP 與防火牆規則" data-link-desc="雲端主機建立頁網路區塊的選項：主機放進哪個虛擬網路與 subnet、私有 IP 與公開 IP 各自的用途與生命週期、防火牆規則掛在 subnet、網卡與作業系統哪一個位置以及各家怎麼合併，以及主控台新建的網路預設對外開放了什麼">網路：subnet、私有 IP、公開 IP 與防火牆規則&lt;/a>〈防火牆規則的位置與合併方式〉&lt;/li>
&lt;li>&lt;strong>重建時的重新掛載&lt;/strong>：用腳本或 IaC 重建主機時，把「掛上網卡層規則」寫成重建流程的一步，或在建立主機時就指定（Oracle Cloud 的 &lt;code>instance launch --nsg-ids&lt;/code>），不靠人記得&lt;/li>
&lt;li>&lt;strong>整份替換&lt;/strong>：Oracle Cloud 的 &lt;code>vnic update --nsg-ids&lt;/code> 用給的清單取代整份 NSG 清單，加一個 NSG 時要把原本掛著的那幾個一起寫進去&lt;/li>
&lt;/ul>
&lt;h2 id="鄰卡">鄰卡&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/devops/infra/knowledge-cards/subnet/" data-link-title="Subnet（子網路）" data-link-desc="VPC 內按可用區與暴露程度切出的子網段，決定資源有沒有一條通往網際網路的路徑">Subnet（子網路）&lt;/a> — VNIC 接在哪一個 subnet，決定它的私有 IP 範圍與 subnet 層的規則&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/devops/infra/knowledge-cards/security-group/" data-link-title="Security Group" data-link-desc="掛在資源網卡層級的有狀態防火牆，逐埠決定哪些來源能連進這個資源">Security Group&lt;/a> — 掛在網卡層的有狀態防火牆，Oracle Cloud 的對應是 NSG&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/devops/infra/knowledge-cards/nat/" data-link-title="NAT Gateway" data-link-desc="private subnet 或沒有外部 IP 的 VM 要主動對外連線、評估 NAT 的數量與出站成本、或在 AWS 與 GCP 之間對照出站做法時，查 NAT Gateway 的職責、部署模式與取捨">NAT Gateway&lt;/a> — 沒有公開 IP 的 VNIC 往外連時經過的出口&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/devops/infra/knowledge-cards/vpc/" data-link-title="VPC（Virtual Private Cloud）" data-link-desc="雲端帳號內的一塊邏輯隔離私有網段，是所有網路切分的起點與容器">VPC（Virtual Private Cloud）&lt;/a> — VNIC 所在的虛擬網路&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>VNIC（virtual network interface card，虛擬網路卡）是雲端主機接上虛擬網路的那一張網卡。主機在網路上的身分都掛在它上面：所在的 <a href="/blog/devops/infra/knowledge-cards/subnet/" data-link-title="Subnet（子網路）" data-link-desc="VPC 內按可用區與暴露程度切出的子網段，決定資源有沒有一條通往網際網路的路徑">Subnet（子網路）</a>、私有 IP、公開 IP（有配發時），以及網卡層的防火牆規則（Oracle Cloud 的 NSG、AWS 的 <a href="/blog/devops/infra/knowledge-cards/security-group/" data-link-title="Security Group" data-link-desc="掛在資源網卡層級的有狀態防火牆，逐埠決定哪些來源能連進這個資源">Security Group</a>）。各家的名稱不同：Oracle Cloud 叫 VNIC，AWS 叫 ENI（Elastic Network Interface），Google Cloud 叫 network interface。</p>
<h2 id="概念位置">概念位置</h2>
<p>主機與網路設定之間隔著 VNIC 這一層，所以「這台主機的私有 IP 是多少」「這台主機套用了哪些網卡層的防火牆規則（<a href="/blog/devops/infra/knowledge-cards/security-group/" data-link-title="Security Group" data-link-desc="掛在資源網卡層級的有狀態防火牆，逐埠決定哪些來源能連進這個資源">Security Group</a> 這一類）」查的都是它的 VNIC，不是主機本身。Oracle Cloud 的 CLI 也是這樣分工：<code>oci compute instance list-vnics</code> 列出主機的 VNIC 與私有 IP，掛上或拿掉 NSG 用的是 <code>oci network vnic update --nsg-ids</code>，而不是主機的指令。</p>
<p>建立主機時，業者同時替它建一張主要的 VNIC；主機被刪除時，這張 VNIC 也跟著刪除，上面的私有 IP 與防火牆規則的掛載關係一起消失。所以主機被刪除再重建時，新主機拿到的是一張新的 VNIC：私有 IP 多半換了一個，原本掛在舊 VNIC 上的 NSG 要重新掛上去；而 NSG 本身與它的規則屬於虛擬網路，不跟著主機消失。主機只是停止時，VNIC 與私有 IP 都留著。在 Oracle Cloud 上實際重建過一次的資源去留與重新掛 NSG 的指令，見 <a href="/blog/devops/infra/cloud-providers/oracle-cloud/hands-on/private-ubuntu-egress-console-rebuild/" data-link-title="Oracle Cloud 私有子網路 Ubuntu 主機的實測紀錄：套件來源的出站（NAT gateway、路由與 NSG）、序列主控台的連線，以及被回收之後的重建" data-link-desc="要在 Oracle Cloud 沒有公開 IP 的私有子網路裡跑一台 Ubuntu 主機、讓它裝得到套件更新，或要經由序列主控台看主機的開機過程，或主機被閒置回收、停止或刪除之後要照原樣重建，或想知道 NAT gateway 要不要另外付費、開機磁碟扣掉多少區塊磁碟額度、合計超過 200 GB 時放不進額度的那一顆怎麼算、怎麼用 quota 擋下超額的建立、線上加大開機磁碟超過額度時怎麼算、空出額度之後付費磁碟多久轉成免費時，查實際跑過的指令、錯誤原文、重建腳本與每一步的讀法">Oracle Cloud 私有子網路 Ubuntu 主機的實測紀錄：套件來源的出站（NAT gateway、路由與 NSG）、序列主控台的連線，以及被回收之後的重建</a>〈被回收之後的重建：怎麼發現、留下與消失的資源、重建腳本〉。</p>
<p>一台主機可以另外掛第二張以上的 VNIC，接到另一個 subnet；那些額外的網卡依各家的規則可以單獨拿掉，主要的那一張跟主機一起建立、一起刪除。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>主機重建之後，原本連得到網際網路的套件更新又逾時、而沒有任何錯誤訊息：新的 VNIC 沒有掛上原本的出站規則</li>
<li>剛建好的主機，列出 VNIC 的查詢一時回空值：主機還在建立，VNIC 的掛載紀錄還沒出現</li>
<li>同一個 subnet 裡兩台主機的防火牆行為不同：subnet 層的規則相同，差在各自 VNIC 上掛的 NSG 或 security group</li>
</ul>
<h2 id="設計責任">設計責任</h2>
<p>網卡層的規則只影響掛上它的那幾張 VNIC，subnet 層的規則影響整個 subnet，所以放規則的位置決定了影響範圍；而 VNIC 會隨主機重建而換新，所以：</p>
<ul>
<li><strong>規則放在哪一層</strong>：只給一台主機的放行（例如只有它需要的出站）放在網卡層，掛在它的 VNIC 上；整個 subnet 都需要的放在 subnet 層。兩層怎麼合併見 <a href="/blog/devops/infra/cloud-providers/vm-options/networking/" data-link-title="網路：subnet、私有 IP、公開 IP 與防火牆規則" data-link-desc="雲端主機建立頁網路區塊的選項：主機放進哪個虛擬網路與 subnet、私有 IP 與公開 IP 各自的用途與生命週期、防火牆規則掛在 subnet、網卡與作業系統哪一個位置以及各家怎麼合併，以及主控台新建的網路預設對外開放了什麼">網路：subnet、私有 IP、公開 IP 與防火牆規則</a>〈防火牆規則的位置與合併方式〉</li>
<li><strong>重建時的重新掛載</strong>：用腳本或 IaC 重建主機時，把「掛上網卡層規則」寫成重建流程的一步，或在建立主機時就指定（Oracle Cloud 的 <code>instance launch --nsg-ids</code>），不靠人記得</li>
<li><strong>整份替換</strong>：Oracle Cloud 的 <code>vnic update --nsg-ids</code> 用給的清單取代整份 NSG 清單，加一個 NSG 時要把原本掛著的那幾個一起寫進去</li>
</ul>
<h2 id="鄰卡">鄰卡</h2>
<ul>
<li><a href="/blog/devops/infra/knowledge-cards/subnet/" data-link-title="Subnet（子網路）" data-link-desc="VPC 內按可用區與暴露程度切出的子網段，決定資源有沒有一條通往網際網路的路徑">Subnet（子網路）</a> — VNIC 接在哪一個 subnet，決定它的私有 IP 範圍與 subnet 層的規則</li>
<li><a href="/blog/devops/infra/knowledge-cards/security-group/" data-link-title="Security Group" data-link-desc="掛在資源網卡層級的有狀態防火牆，逐埠決定哪些來源能連進這個資源">Security Group</a> — 掛在網卡層的有狀態防火牆，Oracle Cloud 的對應是 NSG</li>
<li><a href="/blog/devops/infra/knowledge-cards/nat/" data-link-title="NAT Gateway" data-link-desc="private subnet 或沒有外部 IP 的 VM 要主動對外連線、評估 NAT 的數量與出站成本、或在 AWS 與 GCP 之間對照出站做法時，查 NAT Gateway 的職責、部署模式與取捨">NAT Gateway</a> — 沒有公開 IP 的 VNIC 往外連時經過的出口</li>
<li><a href="/blog/devops/infra/knowledge-cards/vpc/" data-link-title="VPC（Virtual Private Cloud）" data-link-desc="雲端帳號內的一塊邏輯隔離私有網段，是所有網路切分的起點與容器">VPC（Virtual Private Cloud）</a> — VNIC 所在的虛擬網路</li>
</ul>
]]></content:encoded></item></channel></rss>