Installing Windows on a IPv6 VPS
If you happen to have a cloud server that does not provide Windows images, you might want to try installing Windows yourself.
If you happen to have a high-configuration cloud server (like my Afly Black Friday VPS) that doesn’t provide Windows images, you might want to try installing Windows yourself using the DD method.
What is DD System Installation?#
As the name suggests, DD system installation uses the dd command to transfer a vhd file to a specific partition, then configures boot files to make it bootable. As scripts have evolved, many features have been added (like installation from img or iso images, system rescue). However, this isn’t the main focus - this tutorial aims to cover the pitfalls I encountered while using such scripts, and how to solve them.
My Environment Configuration#
First, let me introduce my environment (these configurations might seem unusual, but these specific characteristics led to some interesting problems):
- CPU: 3 Core AMD Ryzen 9 9950X
- RAM: 4.5GB
- SSD: 125GB
- Network: IPv6 /128 Only (Yes, pure IPv6 environment with no IPv4 access! And only a /128 IPv6 allocation, which becomes important later)
Preparation#
Script Used#
I chose this script: https://github.com/bin456789/reinstall ↗
I strongly recommend carefully reading the README first, as the repository contains detailed instructions on how to use the script.
System Image Selection#
I used an image from TeddySun’s collection, which you can find by searching https://teddysun.com/?s=DD ↗ to find your preferred image. I selected Windows 10 LTSC because it’s relatively clean.
Quick Installation Commands#
If you’re in a hurry, here are the basic installation commands:
# Download the script
curl -O https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh || wget -O reinstall.sh
# Execute the installation
bash reinstall.sh dd --img https://dl.lamp.sh/vhd/zh-cn_windows10_ltsc.xz
bashRemember to install curl beforehand (if your system doesn’t have it)
First Issue: Incorrect DNS Configuration#
This problem was mainly caused by my specific network environment. The DNS configuration in the script’s Alpine environment was incorrect, preventing files from being downloaded. Here’s my solution:
#!/bin/sh
# Modify /etc/resolv.conf file
echo "nameserver 2001:4860:4860::8888" > /etc/resolv.conf
echo "nameserver 2001:4860:4860::8844" >> /etc/resolv.conf
if [ -f /etc/systemd/resolved.conf ]; then
echo "[Resolve]" >> /etc/systemd/resolved.conf
echo "DNS=2001:4860:4860::8888" >> /etc/systemd/resolved.conf
echo "DNS=2001:4860:4860::8844" >> /etc/systemd/resolved.conf
systemctl restart systemd-resolved
fi
echo "DNS successfully changed to Google IPv6 DNS"
bashOf course, if you have a normal dual-stack environment, you probably won’t encounter this issue.
Second Issue: Password Setup#
I found this particularly interesting: when the script first runs, it prompts you to enter a password, but this password is not the one you’ll use to log into Windows! Despite the script’s README mentioning this, I missed it.
In fact, the Windows login password is determined by the image. For TeddySun’s image that I used:
- Username: Administrator
- Password: Teddysun.com
Third Issue: Windows IPv6 Privacy Protection#
This problem puzzled me for a long time. If you run ipconfig /all
on a Windows computer, you might notice something called “temporary address.” This is because Windows “protects your online privacy,” but in my environment with only a /128 IPv6 allocation, this became a problem: external access to your machine is through that fixed IP address, but your machine accesses external websites using a temporary address. This means you can connect via Remote Desktop but can’t access the internet.
The solution is simple - open Command Prompt as administrator:
netsh interface ipv6 set privacy state=disable
# Then restart the network adapter
cmdFourth Issue: Workarounds for Pure IPv6 Environment#
This issue also stems from my special network environment. Not having IPv4 access is quite inconvenient, so I used Cloudflare WARP to provide IPv4 access. However, note that if you directly use the Windows version of WARP, after enabling it, your IPv6 address will also change to WARP’s address, preventing you from connecting to Remote Desktop!
I used a solution provided by a user on the Nodeseek forum (original post ↗):
- Download and install the official CloudFlare WARP client
- In WARP settings:
- Click the gear icon in the bottom right → Preferences
- Advanced → Configure Proxy Mode
- Enable proxy mode and set a memorable port
This effectively gives you a locally available Cloudflare-provided IPv4 exit socks proxy, which you can use however you like - with SwitchyOmega or other tools, configure as you prefer. This way, you can maintain Remote Desktop connections while gaining IPv4 access.
Fifth Issue: LTSC Minor Problem#
If you chose the LTSC 2021 version of Windows like I did, you might notice that the wsappx
service is always running in the background. This issue has a solution on the PCbeta forum; if you’re interested, check out this post: LTSC Optimization Guide ↗