Apologies if this has been done before, but I've been working on a little script that will both create an IPv6 tunnel, and update the endpoint automatically.
Key features:
- No external dependencies (e.g. wget) uses only commands built into windows
- Update endpoint only if needed
- Update endpoint over SSL
- Don't create tunnel if only the endpoint needed changing
- Do nothing if IPv6 is working
- Aims to be idiot proof
It needs to run as admin, so to run at startup do this (http://www.techrepublic.com/blog/windows-and-office/make-vista-launch-uac-restricted-programs-at-startup-with-task-scheduler/).
The aim is to be something you can just drop on the computer of a clueless friend or relative and forget about.
ToDo: Find a way to detect if native IPv6 becomes available and disable the tunnels, unfortunately I don't have native IPv6 available anywhere to test with.
Screenshot:
(http://i.imgur.com/U5ZXaVY.png)
@echo off
SET TunnelServer=IP of tunnel server
SET Tunnel=Put your /64 here
SET TunnelID=Found on the tunnel detailspage
SET TunnelKey=MD5 hashof your tunnel update key
SET UserID=Found on the main page below your real name
call:CheckIPv6||exit /b 0
if "%TunnelServer%"=="IP of tunnel server" (
start notepad %0
exit /b 1
)
set OldIPFile=%0\..\OldIP.txt
set UpdateResultFile=%temp%\output.txt
set EndPointUpdated=0
for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set ip=%%b
for /f "tokens=* delims= " %%a in ("%IP%") do set IP=%%a
for /f "delims=: tokens=2" %%a in ('nslookup myip.opendns.com resolver1.opendns.com 2^>nul ^| findstr "Address"') do (set ExternalIP=%%a)
for /f "tokens=* delims= " %%a in ("%ExternalIP%") do set ExternalIP=%%a
set OldIP=None
if exist %OldIPFile% for /f "tokens=*" %%c in (%OldIPFile%) do set OldIP=%%c
echo Current local IPv4 address : %IP%
echo Current external IPv4 address : %ExternalIP%
echo Previous external IPv4 address : %OldIP%
if not %OldIP%==%ExternalIP% (
call:UpdateEndpoint
call:CheckIPv6||exit /b 0
) else (
echo Skipping Endpoint update : [OK]
)
<nul set /p ".=Checking for admin rights : "
net session >nul 2>&1
if %ErrorLevel%==0 (
echo [OK]
<nul set /p ".=Deleting any existing tunnels : "
netsh interface teredo set state disabled >nul
netsh interface isatap set state disabled >nul
netsh interface 6to4 set state disabled >nul
netsh interface ipv6 delete interface IP6Tunnel >nul
echo [OK]
<nul set /p ".=Creating new tunnel : [Interface] "
netsh interface ipv6 add v6v4tunnel interface=IP6Tunnel %IP% %TunnelServer% >nul 2>nul
if not %ErrorLevel%==0 (
echo Failed to add interface!
) else (
<nul set /p ".=[Address] "
netsh interface ipv6 add address IP6Tunnel %Tunnel%::%IP% >nul 2>nul
if not %ErrorLevel%==0 (
echo [Error]
) else (
<nul set /p ".=[Route] "
netsh interface ipv6 add route ::/0 IP6Tunnel %Tunnel%::1 >nul 2>nul
if not %ErrorLevel%==0 (
echo [Error]
) else (
echo [OK]
call:CheckIPv6||exit /b 0
call:UpdateEndpoint
if not errorlevel 2 call:CheckIPv6||exit /b 0
exit /b 1
)
)
)
) else (
echo [Error]
)
exit /b 1
:CheckIPv6
<nul set /p ".=Checking IPv6 connectivity : "
ping -6 -n 1 ipv6.he.net | find "time=" >nul
if not errorlevel 1 (
echo [OK]
exit /b 1
) else (
echo [Failed]
exit /b 0
)
:UpdateEndpoint
if %EndPointUpdated%==1 exit /b 2
<nul set /p ".=Updating endpoint :"
bitsadmin /transfer "UpdateEndpoint" /priority foreground https://ipv4.tunnelbroker.net/ipv4_end.php?ip=%ExternalIP%^&pass=%TunnelKey%^&user_id=%UserID%^&tid=%TunnelID% %UpdateResultFile% > nul
for /f "delims=: tokens=1" %%a in (%UpdateResultFile%) do set Result=%%a
if not "%Result%"=="-OK" (
set /p Result2=<"%UpdateResultFile%"
if not "%Result2%"=="-ERROR: This tunnel is already associated with this IP address. Please try to limit your updates to IP changes." (
echo [Error]
echo %Result%
exit /b 1
)
)
echo [OK]
echo %ExternalIP%>%OldIPFile%
del %temp%\output.txt >nul 2>nul
set EndPointUpdated=1
exit /b 0