<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Homelab &#8211; NhanVPH&#039;s Blog</title>
	<atom:link href="https://blntech.io.vn/category/homelab/feed/" rel="self" type="application/rss+xml" />
	<link>https://blntech.io.vn</link>
	<description></description>
	<lastBuildDate>Fri, 29 May 2026 09:36:03 +0000</lastBuildDate>
	<language>vi</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://blntech.io.vn/wp-content/uploads/2026/04/cropped-cropped-Logo-BLN-32x32.jpg</url>
	<title>Homelab &#8211; NhanVPH&#039;s Blog</title>
	<link>https://blntech.io.vn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Cloudflare: Hướng Dẫn Lấy Zone ID Và API Token</title>
		<link>https://blntech.io.vn/cloudflare-huong-dan-lay-zone-id-va-api-token/</link>
		
		<dc:creator><![CDATA[nhanvph]]></dc:creator>
		<pubDate>Fri, 29 May 2026 09:36:03 +0000</pubDate>
				<category><![CDATA[Homelab]]></category>
		<category><![CDATA[API-Token]]></category>
		<category><![CDATA[Cloudclare]]></category>
		<guid isPermaLink="false">https://blntech.io.vn/?p=1631</guid>

					<description><![CDATA[Bài viết hôm nay sẽ hướng dẫn các bạn cách lấy Zone ID và tạo API Token từ Cloudflare một [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Bài viết hôm nay sẽ hướng dẫn các bạn cách lấy Zone ID và tạo API Token từ Cloudflare một cách nhanh chóng và dễ dàng. Chúng ta sẽ thường xuyên cần sử dụng Zone ID và API Token khi thiết lập và cấu hình mạng, chẳng hạn như cấu hình Dynamic DNS hay thiết lập Wildcard SSL.</p>



<h2 class="wp-block-heading">1. Zone ID là gì?</h2>



<p class="wp-block-paragraph"><strong>Zone ID</strong>&nbsp;là mã số định danh duy nhất cho từng tên miền (zone) mà bạn quản lý trên Cloudflare. Zone ID được sử dụng trong nhiều lệnh API của Cloudflare để xác định chính xác tên miền mà bạn muốn thao tác.</p>



<p class="wp-block-paragraph">Ví dụ: Khi bạn muốn cập nhật DNS thông qua API, bạn sẽ cần cung cấp Zone ID để Cloudflare biết tên miền nào cần chỉnh sửa.</p>



<h2 class="wp-block-heading">2. Cách lấy Zone ID trên Cloudflare</h2>



<p class="wp-block-paragraph">Truy cập vào trang chủ của Cloudflare tại&nbsp;<a href="https://www.cloudflare.com/" rel="noreferrer noopener" target="_blank">https://www.cloudflare.com</a>&nbsp;và đăng nhập vào tài khoản của bạn.</p>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-zone-id-api-token-1.png" alt=""/></figure>



<p class="wp-block-paragraph">Sau khi đăng nhập, bạn sẽ thấy danh sách các tên miền đã thêm vào Cloudflare. Bấm chọn vào tên miền bạn muốn tìm Zone ID</p>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-zone-id-api-token-2.jpg" alt=""/></figure>



<p class="wp-block-paragraph">Sau khi vào trang quản lý của tên miền, kéo xuống dưới cùng của trang&nbsp;<strong>Overview</strong>, phía cột bên phải bạn sẽ thấy mục&nbsp;<strong>Zone ID</strong>&nbsp;nằm trong phần&nbsp;<strong>API</strong>.</p>



<p class="wp-block-paragraph">Ví dụ:</p>



<pre class="wp-block-code"><code>Zone ID: 43423423423432430abcdef</code></pre>



<p class="wp-block-paragraph">Hãy sao chép Zone ID này lại để sử dụng khi cần.</p>



<h2 class="wp-block-heading">3. API Token là gì và tại sao cần tạo API Token?</h2>



<p class="wp-block-paragraph"><strong>API Token</strong>&nbsp;là mã thông báo bảo mật cho phép truy cập và thực hiện các thao tác trên Cloudflare thông qua API. Bạn có thể tạo các API Token với quyền hạn cụ thể tùy vào từng mục đich sử dụng, giúp tăng cường bảo mật.</p>



<p class="wp-block-paragraph">Ví dụ: bạn có thể tạo một API Token chỉ để cập nhật DNS, hoặc một API Token khác để quản lý Firewall Rules.</p>



<h2 class="wp-block-heading">4. Cách tạo API Token trên Cloudflare<a href="https://thuanbui.me/cloudflare-zone-id-api-token/#4-c%C3%A1ch-t%E1%BA%A1o-api-token-tr%C3%AAn-cloudflare">#</a></h2>



<p class="wp-block-paragraph">Truy cập vào&nbsp;<a href="https://dash.cloudflare.com/profile/api-tokens" rel="noreferrer noopener" target="_blank">https://dash.cloudflare.com/profile/api-tokens</a>&nbsp;để vào trang quản lý API Tokens. Hoặc từ trang chủ Cloudflare, bấm vào biểu tượng Tài khoản rồi chọn My Profile</p>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-zone-id-api-token-3.jpg" alt=""/></figure>



<p class="wp-block-paragraph">Tiếp theo, bấn chọn vào mục API Token ở Menu bên trái</p>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-zone-id-api-token-4.png" alt=""/></figure>



<p class="wp-block-paragraph">Để tạo Token mới, bấm vào nút Create Token</p>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-zone-id-api-token-5.jpg" alt=""/></figure>



<p class="wp-block-paragraph">Cloudflare đã tạo sẵn nhiều mẫu (template) để chúng ta có thể cấu hình nhanh thông số cho Token. Nếu chỉ cần API Token liên quan đến DNS, bấm chọn vào nút Use template của mục Edit Zone DNS</p>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-zone-id-api-token-6.png" alt=""/></figure>



<p class="wp-block-paragraph">Tiếp theo, cấu hình quyền cho Token. Sau đó bấm Continue to Summary</p>



<ul class="wp-block-list">
<li>Chọn quyền <strong>Zone**</strong>:Edit** để có thể đọc và chỉnh sửa thông tin của tên miền.</li>



<li>Chọn cụ thể tên miền (hoặc tất cả tên miền) mà API Token này sẽ được phép truy cập.</li>
</ul>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-zone-id-api-token-7.png" alt=""/></figure>



<p class="wp-block-paragraph">Bấm Create Token để xác nhận</p>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-zone-id-api-token-8.png" alt=""/></figure>



<p class="wp-block-paragraph">Cloudflare sẽ hiển thị mã API Token của bạn một lần duy nhất. Hãy sao chép và lưu lại mã này để sử dụng.</p>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-zone-id-api-token-9.png" alt=""/></figure>



<p class="wp-block-paragraph">Lưu ý: Không chia sẻ API Token của bạn với người khác và tránh lưu trữ ở những nơi không an toàn.</p>



<p class="wp-block-paragraph">Bạn có thể xác nhận lại token có hoạt động hay không bằng cách gõ dòng lệnh&nbsp;<code>curl ...</code>&nbsp;vào terminal. Nếu thấy kết quả trả về có dòng&nbsp;<code>"status": "active"</code>&nbsp;nghĩa là token đang hoạt động.</p>



<pre class="wp-block-code"><code>{"result":{"id":"2a8376b6ab629d04aba6957570fd1d56","status":"active"},"success":true,"errors":&#91;],"messages":&#91;{"code":10000,"message":"This API Token is valid and active","type":null}]}%</code></pre>



<h2 class="wp-block-heading">5. Lưu ý bảo mật</h2>



<ul class="wp-block-list">
<li>Bạn nên sử dụng <strong>API Token</strong> thay vì <strong>Global API Key</strong> để tăng cường bảo mật.</li>



<li>Chỉ cấp các quyền cần thiết cho API Token.</li>



<li>Mỗi ứng dụng nên sử dụng một API Token riêng.</li>



<li>Xóa các API Token không còn sử dụng.</li>



<li>Sử dụng các công cụ quản lý mật khẩu như Bitwarden hoặc 1Password để lưu trữ API Token an toàn.</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cập Nhật IP Động Cho Tên Miền Qua CloudFlare</title>
		<link>https://blntech.io.vn/cap-nhat-ip-dong-cho-ten-mien-qua-cloudflare/</link>
		
		<dc:creator><![CDATA[nhanvph]]></dc:creator>
		<pubDate>Fri, 29 May 2026 09:30:12 +0000</pubDate>
				<category><![CDATA[Homelab]]></category>
		<guid isPermaLink="false">https://blntech.io.vn/?p=1687</guid>

					<description><![CDATA[Có hai cách để chúng ta có thể truy cập homelab từ bên ngoài: Đa số mọi người sẽ chọn [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Có hai cách để chúng ta có thể truy cập homelab từ bên ngoài:</p>



<ul class="wp-block-list">
<li>Truy cập trực tiếp bằng Public IP của modem</li>



<li>Truy cập qua tên miền được cấu hình trỏ đến Public IP.</li>
</ul>



<p class="wp-block-paragraph">Đa số mọi người sẽ chọn cách thứ hai vì nó đơn giản, dễ nhớ hơn so với chuỗi dãy số IP&nbsp;<code>xxx.xxx.xxx.xxx</code>. Tuy nhiên nếu mạng ở nhà sử dụng IP động (đa số trường hợp), tên miền cần phải được tự động cập nhật mỗi khi Public IP thay đổi để tránh kết nối bị lỗi.</p>



<p class="wp-block-paragraph">Hiện tại mình đang dùng 1 bash script trên Raspberry Pi để tự động cập nhật IP động cho tên miền qua dịch vụ CloudFlare. Nhờ vậy tên miền luôn được trỏ đến IP mới nhất được cấp cho modem mạng ở nhà.</p>



<p class="wp-block-paragraph">Dưới đây là hướng dẫn chi tiết cách thiết lập</p>



<h2 class="wp-block-heading">1. Yêu cầu</h2>



<ul class="wp-block-list">
<li>Đã có sẵn tên miền và đã có tài khoản Cloudflare.</li>



<li>Tên miền đã được chuyển về CloudFlare quản lý</li>



<li>Máy tính / máy ảo chạy Linux (Ubuntu / Arch / CentOS / …) hoặc Raspberry Pi (đời nào cũng được)</li>
</ul>



<p class="wp-block-paragraph">Lưu ý: Tên miền sử dụng phải là loại&nbsp;<strong>trả phí</strong>&nbsp;(.com, .net, .org, .me, …), không thể sử dụng các loại tên miền miễn phí (.tk, .ga, .ml, .cf, .gq, …) vì Cloudflare không hỗ trợ.</p>



<h2 class="wp-block-heading">2. Cài đặt Cloudflare.sh script</h2>



<p class="wp-block-paragraph">Bạn cần truy cập SSH vào máy tính để thiết lập script.</p>



<p class="wp-block-paragraph">Tạo file <code><strong>cloudflare.sh</strong></code> trong thư mục <code><strong>$HOME</strong></code></p>



<pre class="wp-block-code"><code>cd ~
mkdir cloudflare
cd cloudflare
nano cloudflare.sh</code></pre>



<p class="wp-block-paragraph">Nhập vào nội dung sau</p>



<pre class="wp-block-code"><code>#!/bin/bash

# Forked from benkulbertis/cloudflare-update-record.sh
# CHANGE THESE

# API Token (Recommended)                                                                      #####
auth_token="xxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# Domain and DNS record for synchronization
zone_identifier="f1nd7h3fuck1n6z0n31d3n71f13r4l50" # Can be found in the "Overview" tab of your domain
record_name="ipv4.example.org"                     # Which record you want to be synced

# DO NOT CHANGE LINES BELOW

# SCRIPT START
echo -e "Check Initiated"

# Check for current external network IP
ip=$(curl -s4 https://icanhazip.com/)
if &#91;&#91; ! -z "${ip}" ]]; then
  echo -e "  > Fetched current external network IP: ${ip}"
else
  >&amp;2 echo -e "Network error, cannot fetch external network IP."
fi

# The execution of update
if &#91;&#91; ! -z "${auth_token}" ]]; then
  header_auth_paramheader=( -H '"Authorization: Bearer '${auth_token}'"' )
else
  header_auth_paramheader=( -H '"X-Auth-Email: '${auth_email}'"' -H '"X-Auth-Key: '${auth_key}'"' )
fi

# Seek for the record
seek_current_dns_value_cmd=( curl -s -X GET '"https://api.cloudflare.com/client/v4/zones/'${zone_identifier}'/dns_records?name='${record_name}'&amp;type=A"' "${header_auth_paramheader&#91;@]}" -H '"Content-Type: application/json"' )
record=`eval ${seek_current_dns_value_cmd&#91;@]}`

# Can't do anything without the record
if &#91;&#91; -z "${record}" ]]; then
  >&amp;2 echo -e "Network error, cannot fetch DNS record."
  exit 1
elif &#91;&#91; "${record}" == *'"count":0'* ]]; then
  >&amp;2 echo -e "Record does not exist, perhaps create one first?"
  exit 1
fi

# Set the record identifier from result
record_identifier=`echo "${record}" | sed 's/.*"id":"//;s/".*//'`

# Set existing IP address from the fetched record
old_ip=`echo "${record}" | sed 's/.*"content":"//;s/".*//'`
echo -e "  > Fetched current DNS record value   : ${old_ip}"

# Compare if they're the same
if &#91; "${ip}" == "${old_ip}" ]; then
  echo -e "Update for A record '${record_name} (${record_identifier})' cancelled.\\n  Reason: IP has not changed."
  exit 0
else
  echo -e "  > Different IP addresses detected, synchronizing..."
fi

# The secret sause for executing the update
json_data_v4="'"'{"id":"'${zone_identifier}'","type":"A","proxied":true,"name":"'${record_name}'","content":"'${ip}'","ttl":120}'"'"
update_cmd=( curl -s -X PUT '"https://api.cloudflare.com/client/v4/zones/'${zone_identifier}'/dns_records/'${record_identifier}'"' "${header_auth_paramheader&#91;@]}" -H '"Content-Type: application/json"' )

# Execution result
update=`eval ${update_cmd&#91;@]} --data $json_data_v4`

# The moment of truth
case "$update" in
*'"success":true'*)
  echo -e "Update for A record '${record_name} (${record_identifier})' succeeded.\\n  - Old value: ${old_ip}\\n  + New value: ${ip}";;
*)
  >&amp;2 echo -e "Update for A record '${record_name} (${record_identifier})' failed.\\nDUMPING RESULTS:\\n${update}"
  exit 1;;
esac</code></pre>



<p class="wp-block-paragraph">Bạn cần phải điền thông tin vào các dòng sau:</p>



<ul class="wp-block-list">
<li>auth_token: Cloudflare API Token</li>



<li>zone_identifier: Zone ID</li>



<li>record_name: Tên miền</li>
</ul>



<h2 class="wp-block-heading">3. Tìm Zone ID và tạo API Token</h2>



<p class="wp-block-paragraph">Tham khảo bài viết này : <strong>Cloudflare: Hướng dẫn lấy Zone ID và tạo API Token nhanh chóng</strong></p>



<h2 class="wp-block-heading">4. Tạo A Record cho tên miền</h2>



<p class="wp-block-paragraph">Ví dụ mình muốn sử dụng tên miền&nbsp;<code>alibaba.thuanbui.me</code>&nbsp;để truy cập đến homelab ở nhà. Bấm vào Add record và tạo một A record mới.</p>



<ul class="wp-block-list">
<li>Name: điền vào <code>alibaba</code></li>



<li>IPv4: điền tạm <code>1.1.1.1</code>, thông số này sẽ được tự động cập nhật về IP của modem sau khi chạy script.</li>
</ul>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-create-a-record.png" alt="Tạo A Record cho subdomain alibaba.thuanbui.me"/><figcaption class="wp-element-caption"><strong>Tạo A Record cho subdomain alibaba.thuanbui.me</strong></figcaption></figure>



<h2 class="wp-block-heading">5. Cập nhật script</h2>



<p class="wp-block-paragraph">Thông tin cần thiết đã có đầy đủ, mình cập nhật lại vào file&nbsp;<code>cloudflare.sh</code>&nbsp;và lưu lại</p>



<pre class="wp-block-code"><code>#!/bin/bash

# Forked from benkulbertis/cloudflare-update-record.sh
# CHANGE THESE

# API Token (Recommended)                                                                  #####
auth_token="LrAB--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# Domain and DNS record for synchronization
zone_identifier="48bxxxxxxxxxxxxxxxxxxxx60" # Can be found in the "Overview" tab of your domain
record_name="alibaba.thuanbui.me"                     # Which record you want to be synced

# DO NOT CHANGE LINES BELOW

# SCRIPT START
echo -e "Check Initiated"

# Check for current external network IP
ip=$(curl -s4 https://icanhazip.com/)
if &#91;&#91; ! -z "${ip}" ]]; then
  echo -e "  > Fetched current external network IP: ${ip}"
else
  >&amp;2 echo -e "Network error, cannot fetch external network IP."
fi

# The execution of update
if &#91;&#91; ! -z "${auth_token}" ]]; then
  header_auth_paramheader=( -H '"Authorization: Bearer '${auth_token}'"' )
else
  header_auth_paramheader=( -H '"X-Auth-Email: '${auth_email}'"' -H '"X-Auth-Key: '${auth_key}'"' )
fi

# Seek for the record
seek_current_dns_value_cmd=( curl -s -X GET '"https://api.cloudflare.com/client/v4/zones/'${zone_identifier}'/dns_records?name='${record_name}'&amp;type=A"' "${header_auth_paramheader&#91;@]}" -H '"Content-Type: application/json"' )
record=`eval ${seek_current_dns_value_cmd&#91;@]}`

# Can't do anything without the record
if &#91;&#91; -z "${record}" ]]; then
  >&amp;2 echo -e "Network error, cannot fetch DNS record."
  exit 1
elif &#91;&#91; "${record}" == *'"count":0'* ]]; then
  >&amp;2 echo -e "Record does not exist, perhaps create one first?"
  exit 1
fi

# Set the record identifier from result
record_identifier=`echo "${record}" | sed 's/.*"id":"//;s/".*//'`

# Set existing IP address from the fetched record
old_ip=`echo "${record}" | sed 's/.*"content":"//;s/".*//'`
echo -e "  > Fetched current DNS record value   : ${old_ip}"

# Compare if they're the same
if &#91; "${ip}" == "${old_ip}" ]; then
  echo -e "Update for A record '${record_name} (${record_identifier})' cancelled.\\n  Reason: IP has not changed."
  exit 0
else
  echo -e "  > Different IP addresses detected, synchronizing..."
fi

# The secret sause for executing the update
json_data_v4="'"'{"id":"'${zone_identifier}'","type":"A","proxied":true,"name":"'${record_name}'","content":"'${ip}'","ttl":120}'"'"
update_cmd=( curl -s -X PUT '"https://api.cloudflare.com/client/v4/zones/'${zone_identifier}'/dns_records/'${record_identifier}'"' "${header_auth_paramheader&#91;@]}" -H '"Content-Type: application/json"' )

# Execution result
update=`eval ${update_cmd&#91;@]} --data $json_data_v4`

# The moment of truth
case "$update" in
*'"success":true'*)
  echo -e "Update for A record '${record_name} (${record_identifier})' succeeded.\\n  - Old value: ${old_ip}\\n  + New value: ${ip}";;
*)
  >&amp;2 echo -e "Update for A record '${record_name} (${record_identifier})' failed.\\nDUMPING RESULTS:\\n${update}"
  exit 1;;
esac</code></pre>



<p class="wp-block-paragraph">Mặc định, script này sẽ kích hoạt chế độ proxy trên Cloudflare nhằm mục đích ẩn IP của modem, giảm nguy cơ bị tấn công vào mạng nhà. Nếu vì lý do nào đó không muốn ẩn IP của mình thì có thể thay đổi thông số <code><strong>"proxied":true</strong></code> thành <code><strong>"proxied":false</strong></code></p>



<h2 class="wp-block-heading">6. Chạy thử nghiệm</h2>



<p class="wp-block-paragraph">Thiết lập quyền thực thi cho file <code><strong>cloudflare.sh</strong></code></p>



<pre class="wp-block-code"><code>chmod +X cloudflare.sh</code></pre>



<p class="wp-block-paragraph">Chạy thử xem nào</p>



<pre class="wp-block-code"><code>./cloudflare.sh</code></pre>



<p class="wp-block-paragraph">Terminal window</p>



<pre class="wp-block-code"><code>thuanbui@raspberrypi:~/cloudflare $ ./cloudflare.sh
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
Check Initiated
  > Fetched current external network IP: 27.xx.xx.xx
  > Fetched current DNS record value   : 1.1.1.1
  > Different IP addresses detected, synchronizing...
Update for A record 'alibaba.thuanbui.me (48bxxxxxxxxxxxxxxxxxxxx60)' succeeded.
  - Old value: 1.1.1.1
  + New value: 27.xx.xx.xx</code></pre>



<p class="wp-block-paragraph">Quay lại Cloudflare, tên miền <code><strong>alibaba.thuanbui.me</strong></code>, mình thấy đã được tự động cập nhật với IP mới. Ngon lành!</p>



<figure class="wp-block-image aligncenter"><img decoding="async" src="https://media.thuanbui.me/cdn-cgi/image/format=auto,onerror=redirect/images/cloudflare-update-a-record.png" alt=""/></figure>



<h2 class="wp-block-heading">7. Thiết lập cron tự động</h2>



<p class="wp-block-paragraph">Việc cuối cùng cần làm là thiết lập cron để script tự động chạy 24/7. Sau đó, không cần bận tâm đến nó nữa</p>



<pre class="wp-block-code"><code>crontab -e</code></pre>



<p class="wp-block-paragraph">Mình chỉnh cho script tự động chạy sau mỗi 10 phút bằng cách thêm dòng này vào dưới cùng</p>



<pre class="wp-block-code"><code>*/10 * * * * /bin/bash /home/thuanbui/cloudflare/cloudflare.sh</code></pre>



<p class="wp-block-paragraph">Chú ý nhớ thay <code><strong>/home/thuanbui/cloudflare/cloudflare.sh</strong></code> thành đường dẫn đến nơi lưu file <code><strong>cloudflare.sh</strong></code> của bạn.</p>



<p class="wp-block-paragraph">Chúc bạn thực hiện thành công!</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cấu Hình Mạng Ảo Trong Hyper-V: External Switch, Internal Switch, Private Switch</title>
		<link>https://blntech.io.vn/cau-hinh-mang-ao-trong-hyper-v-external-switch-internal-switch-private-switch/</link>
		
		<dc:creator><![CDATA[nhanvph]]></dc:creator>
		<pubDate>Fri, 29 May 2026 07:45:15 +0000</pubDate>
				<category><![CDATA[Homelab]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[Hyper-V]]></category>
		<guid isPermaLink="false">https://blntech.io.vn/?p=1747</guid>

					<description><![CDATA[Cấu hình mạng ảo là một trong những thành phần quan trọng nhất khi sử dụng Hyper-V để thiết lập [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Cấu hình mạng ảo là một trong những thành phần quan trọng nhất khi sử dụng Hyper-V để thiết lập homelab. Mạng ảo trong Hyper-V được tạo dựng bởi các bộ chia mạng ảo với tên gọi Virtual Switch. Cần phải hiểu rõ cách thức hoạt động của từng loại switch ảo này thì mới thiết lập được một hệ thống mạng ảo hoạt động hiệu quả.</p>



<p class="wp-block-paragraph">Bài viết này mình sẽ chia sẻ sự khác nhau giữa các loại Virtual Switch của Hyper-V và cách chọn loại Virtual Switch phù hợp cho nhu cầu sử dụng của bạn</p>



<h2 class="wp-block-heading">Virtual Switch là gì?</h2>



<p class="wp-block-paragraph">Virtual Switch (bộ chia mảng ảo) trong Hyper-V vận hành y hệt như một Physical Switch (bộ chia mạng vật lý). Nó hoạt động ở Layer 2 của&nbsp;<a href="https://en.wikipedia.org/wiki/OSI_protocols" target="_blank" rel="noreferrer noopener">OSI Protocol</a>&nbsp;với nhiệm vụ gửi gói dữ liệu đến địa chỉ MAC Address và quản lý VLAN Tagging.</p>



<p class="wp-block-paragraph">Nếu bạn chưa hiểu rõ về các khái niệm mạng (OSI Protocol, MAC Address, VLAN) mình vừa mới nhắc đến, hãy tham gia khoá học&nbsp;<a href="https://skillsforall.com/course/networking-essentials" target="_blank" rel="noreferrer noopener">Networking Essentials</a>&nbsp;(miễn phí) của Cisco để trang bị kiến thức căn bản về hệ thống mạng. Nó sẽ giúp bạn không chỉ trong việc quản lý Homelab, mà còn hữu ích trong công việc sau này.</p>



<figure class="wp-block-image aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="668" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-79-1024x668.png" alt="" class="wp-image-6427" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-79-1024x668.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-79-300x196.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-79-768x501.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-79.png 1181w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Trong Hyper-V, Virtual Switch được chia làm 3 loại:</p>



<ul class="wp-block-list">
<li><strong>External Virtual Switch</strong>: Tạo mạng ảo kết nối với mạng nội bộ trong nhà thông qua card mạng vật lý (network interface card) của Host. Các thiết bị trong mạng ảo có thể kết nối đến các thiết bị mạng vật lý trong mạng nội bộ.</li>



<li><strong>Internal Virtual Switch</strong>: Kết nối host và các máy ảo với nhau. Dữ liệu được trao đổi giữa các máy ảo và host.</li>



<li><strong>Private Virtual Switch</strong>: Kết nối các máy ảo với nhau, chỉ cho phép trao đổi dữ liệu giữa các máy ảo. Host và máy ảo không giao tiếp được với nhau.</li>
</ul>



<p class="wp-block-paragraph">Chi tiết về mô hình hoạt động của từng loại Virtual Switch, các bạn xem tiếp bên dưới sẽ hiểu rõ hơn</p>



<h2 class="wp-block-heading">External Virtual Switch</h2>



<p class="wp-block-paragraph">External Virtual Network sử dụng adapter mạng vật lý của máy chủ để tạo mạng ảo. Card mạng vật lý trên máy chủ Hyper-V sẽ được biến thành Virtual Switch, không được cấp IP. Máy chủ sẽ tự động tạo thêm 1 card mạng ảo và kết nối vào External Virtual Switch.</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="755" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-80-1024x755.png" alt="" class="wp-image-6428" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-80-1024x755.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-80-300x221.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-80-768x566.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-80.png 1044w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Do External Switch hoạt động dựa trên card mạng vật lý nên nếu máy bạn chỉ có 1 card mạng vật lý, bạn chỉ có thể tạo được duy nhất 1 External Network trong Hyper-V.</p>



<p class="wp-block-paragraph">Để tạo External Virtual Switch, bạn mở Hyper-V Manager và truy cập vào mục Virtual Swich Manager, bấm vào New virtual network switch, chọn External. Bấm Create Virtual Swich</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="536" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-81-1024x536.png" alt="" class="wp-image-6429" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-81-1024x536.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-81-300x157.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-81-768x402.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-81.png 1385w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><strong>Chọn External và bấm Create Virtual Switch</strong></figcaption></figure>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="536" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-82-1024x536.png" alt="" class="wp-image-6430" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-82-1024x536.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-82-300x157.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-82-768x402.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-82.png 1385w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><strong>Chọn External network, sau đó chọn Card mạng vật lý đang sử dụng trên máy chủ</strong></figcaption></figure>



<p class="wp-block-paragraph">Khi tạo External network, bạn sẽ có thêm lựa chọn “Allow management operating system to share this network adapter”.</p>



<ul class="wp-block-list">
<li>Nếu bấm chọn: Card mạng ảo của Host sẽ được kết nối vào Virtual Switch Network.</li>



<li>Nếu không chọn: Card mạng ảo của Host sẽ <strong>KHÔNG </strong>được kết nối vào Virtual Switch Network.</li>
</ul>



<figure class="wp-block-image aligncenter"><img loading="lazy" decoding="async" width="1024" height="878" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-83-1024x878.png" alt="" class="wp-image-6431" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-83-1024x878.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-83-300x257.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-83-768x658.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-83.png 1400w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><strong>Allow management operating system to share this network adapter: Checked</strong></figcaption></figure>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="878" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-84-1024x878.png" alt="" class="wp-image-6432" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-84-1024x878.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-84-300x257.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-84-768x658.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-84.png 1400w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><strong>Allow management operating system to share this network adapter: Unchecked</strong></figcaption></figure>



<p class="wp-block-paragraph">Lưu ý: Nếu bạn không chọn mục&nbsp;<em>Allow management operating system to share this network adapter</em>, Host sẽ không thể kết nối được với Router mạng trong nhà và sẽ bị mất kết nối Internet.</p>



<p class="wp-block-paragraph">Nếu muốn có kết nối Internet trên Host, bạn có 2 lựa chọn:</p>



<ul class="wp-block-list">
<li>Vào chính sửa External Virtual Swich, bấm chọn lại <em>Allow management operating system to share this network adapter</em>.</li>



<li>Tạo thêm 1 Internal Virtual Switch, kết nối với 1 máy ảo được cấu hình làm Router mạng để chia sẻ Internet với Host. Xem tiếp phần Internal Switch, mình sẽ có hình minh hoạt</li>
</ul>



<h2 class="wp-block-heading">Internal Virtual Switch</h2>



<p class="wp-block-paragraph">Internal Virtual switch không sử dụng kết nối đến NIC vật lý nào trên máy chủ. Nó là một switch tách biệt hoàn toàn trong Hyper-V. Hệ điều hành Host sẽ kết nối vào Internal Virtual Switch thông qua một card mạng ảo được Hyper-V tạo ra khi thiết lập Internal Switch.</p>



<p class="wp-block-paragraph">Mặc định, Hyper-V đã tạo ra sẵn 1 Internal Swich có tên gọi Default Switch, với cấu hình DHCP và NAT để các máy ảo có thể kết nối với mạng vật lý / mạng Internet mà không cần phải cấu hình gì thêm.</p>



<p class="wp-block-paragraph">Bạn có thể tạo thêm Internal Switch bằng cách truy cập vào Virtual Switch Manager và bấm vào New vỉtual network switch.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="722" height="682" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-85.png" alt="" class="wp-image-6433" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-85.png 722w, https://blntech.io.vn/wp-content/uploads/2026/05/image-85-300x283.png 300w" sizes="auto, (max-width: 722px) 100vw, 722px" /><figcaption class="wp-element-caption"><strong>Tạo thêm Internal network tên gọi pfSense switch</strong></figcaption></figure>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="755" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-86-1024x755.png" alt="" class="wp-image-6434" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-86-1024x755.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-86-300x221.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-86-768x566.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-86.png 1044w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><strong>Trên Windows 10 Host tự động tao ra card mạng vEthernet (pfSense Switch) để kết nối vào Virtual Switch vừa tạo trước đó trong Hyper-V.</strong></figcaption></figure>



<p class="wp-block-paragraph">Lưu ý: Nếu bạn tạo thêm Internal Switch, cần phải kết nối nó với một máy ảo được cấu hình làm Router (dùng VyOS, pfSense, OPNsense,…) thì các máy ảo khác trong cùng Switch mới được cấp DHCP. Virtual Switch không có chức năng cấp DHCP cho thiết bị kết nối.</p>



<p class="wp-block-paragraph">Trong hình ở trên, các bạn có thể thấy vEthernet (pfSense Switch) báo Unidentified Network. Lý do vì trên Switch chưa có kết nối đến Router, nên nó không được cấp IP và báo lỗi.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="559" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-87-1024x559.png" alt="" class="wp-image-6435" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-87-1024x559.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-87-300x164.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-87-768x419.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-87-1536x838.png 1536w, https://blntech.io.vn/wp-content/uploads/2026/05/image-87.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><strong>Internal Switch (Màu đỏ hồng) trong Hyper-V</strong></figcaption></figure>



<p class="wp-block-paragraph">Như trong hình này, Host đang có IP 172.16.0.10 do máy ảo pfSense cung cấp. Cả Host và pfSense đều không thể truy cập Internet do chưa kết nối đến mạng vật lý bên ngoài. Mình có thể kết nối pfSense đến External Switch để chia sẻ Internet đến Host (hiện đang không có kết nối đến External Switch) như sau</p>



<figure class="wp-block-image aligncenter"><img loading="lazy" decoding="async" width="722" height="682" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-88.png" alt="" class="wp-image-6436" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-88.png 722w, https://blntech.io.vn/wp-content/uploads/2026/05/image-88-300x283.png 300w" sizes="auto, (max-width: 722px) 100vw, 722px" /><figcaption class="wp-element-caption"><strong>Vào phần Setting của máy ảo pfSense, tạo thêm Network Adapter, kết nối vào External Switch</strong></figcaption></figure>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="559" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-89-1024x559.png" alt="" class="wp-image-6437" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-89-1024x559.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-89-300x164.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-89-768x419.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-89-1536x838.png 1536w, https://blntech.io.vn/wp-content/uploads/2026/05/image-89.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><strong>Máy ảo pfSense vừa có kết nối đến External Swich, vừa có kết nối đến Internal Switch</strong></figcaption></figure>



<p class="wp-block-paragraph">pfSense có thể được cấu hình NAT để chia sẻ kết nối từ subnet 192.168.0.1/24 đến subnet 172.16.0.1/24, Host có thể truy cập Internet thông qua pfSense.</p>



<h2 class="wp-block-heading">Private Virtual Switch</h2>



<p class="wp-block-paragraph">Private Virtual Switch hoạt động y hệt như Internal Virtual Switch, chỉ khác là Host không có kết nối đến trên Private Switch. Do đó, các máy ảo trên Private Switch có thể giao tiếp với nhau, nhưng không thể giao tiếp với Host. Ngược lại, Host cũng không thể kết nối đến các máy ảo trên Private Network thông qua Private Virtual Switch.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="559" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-90-1024x559.png" alt="" class="wp-image-6438" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-90-1024x559.png 1024w, https://blntech.io.vn/wp-content/uploads/2026/05/image-90-300x164.png 300w, https://blntech.io.vn/wp-content/uploads/2026/05/image-90-768x419.png 768w, https://blntech.io.vn/wp-content/uploads/2026/05/image-90-1536x838.png 1536w, https://blntech.io.vn/wp-content/uploads/2026/05/image-90.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><strong>Private Virtual Switch</strong></figcaption></figure>



<p class="wp-block-paragraph">Mục đích của Private Virtual Switch là để thiết lập các mạng riêng ảo Private Network hoàn toàn tách biệt với nhau. Nếu muốn các mạng riêng ảo này kết nói với nhau, hoặc kết nối đến Host, bạn cần phải tạo 1 máy ảo làm nhiệm vụ Router để liên kết các mạng ảo với nhau.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="722" height="682" src="https://blntech.io.vn/wp-content/uploads/2026/05/image-91.png" alt="" class="wp-image-6439" srcset="https://blntech.io.vn/wp-content/uploads/2026/05/image-91.png 722w, https://blntech.io.vn/wp-content/uploads/2026/05/image-91-300x283.png 300w" sizes="auto, (max-width: 722px) 100vw, 722px" /><figcaption class="wp-element-caption"><strong>Tạo Private Switch với tên gọi pfSense Switch</strong></figcaption></figure>



<p class="wp-block-paragraph">Trong hình minh hoạ ở trên, các bạn có thể thấy mình sử dụng pfSense làm nhiệm vụ Router + Firewall để kết nối mạng từ subnet 172.16.0.1/24 đến subnet 192.168.0.1/24. Nếu cấu hình NAT trên pfSense, các máy ảo trong Private Switch có thể kết nối đến Router Mikrotik trong mạng vật lý để truy cập vào Host hoặc truy cập Internet.</p>



<h2 class="wp-block-heading">Sử dụng Virtual Switch nào?</h2>



<p class="wp-block-paragraph">Lựa chọn loại Virtual Switch nào để sử dụng hoàn toàn phụ thuộc vào nhu cầu thiết lập Homelab của bạn. Có rất nhiều kịch bản bạn có thể áp dụng:</p>



<ul class="wp-block-list">
<li>Nếu bạn muốn thiết lập máy ảo để chạy Pi-Hole hoặc AdGuard Home để chặn quảng cáo cho cả nhà, tốt nhất nên cho máy ảo này kết nối vào External Switch để tối ưu hoạt động.</li>



<li>Nếu bạn muốn tạo web server để có thể truy cập từ Internet, bạn nên sử dụng Private Switch và thiết lập thêm máy ảo pfSense làm tường lửa để tăng bảo mật. Đồng thời, ngăn chặn truy cập trái phép từ Internet vào hệ thống mạng vật lý trong nhà.</li>



<li>Bạn còn có thể thiết lập VLAN để phân chia mạng LAN ảo trên cùng một Virtual Switch, giúp việc cấu hình đơn giản hơn.</li>
</ul>



<p class="wp-block-paragraph">Hy vọng bài viết mang đến thông tin hữu ích cho bạn trong bước đầu nghiên cứu về Hyper-V và Virtualization.</p>



<p class="wp-block-paragraph">Chúc bạn thiết lập Homelab thành công!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Nguồn: thuanbui</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
