View Full Version : [SOLVED] ddns client config
scott.bouch
January 3rd, 2015, 12:18 AM
I'm really quite lost here... any help will be greatly appreciated...
This is my first time trying to do this, so need a bit of a guiding hand.. I've googled for answers and have become quite lost, hence me now asking for a pointer in the right direction from the Ubuntu community. I'm confused in a sea of dnsmasq, bind9, etc.. and don't know what to do. :confused:
Scenario:
I've just bought (a couple of hours ago) www.scottbouch.com (http://www.scottbouch.com) - I have a server computer at home (Ubuntu Server 14.04 with LAMP installed) which has a little test website on it. I've made my router point external / public port 80 to internal port 80 on the server's IP address. My router is a Huawei 533 from TalkTalk.
I bought the domain from NameCheap, who provide a DDNS service. They provide a DDNS client application for Windows only (https://www.namecheap.com/support/knowledgebase/article.aspx/111/11/using-namecheap-dynamic-dns-client-version-20x-beta).
I'm assuming the purpose of the DDNS client is to send NameCheap's DDNS server my router's public IP address to keep it's records up to date? Am I correct with this?
I entered into my domain account management page of their website my public IP address at the time of purchasing it, and my home-hosted website worked! Woohoo! ..However......
In the last hour or so, we received a new public IP address (my ISP, TalkTalk seem to change it very often indeed), and my little website fell over. I visited my namecheap account management page on their website again, and updated my public IP address manually, which corrected the issue... however, I know that tomorrow it'll fail again if they change my public IP address again.
SO, my BIG question is:
Does Ubuntu server 14.04 come with a DDNS client to send my public IP address to NameCheap's DDNS server as and when it changes? Or am I barking up the wrong tree, is it done a different way?
If it comes with one, how do I configure it for NameCheap's DDNS to work?
Many, many thanks in advance, Scott.
bab1
January 3rd, 2015, 12:49 AM
Try here: https://help.ubuntu.com/community/DynamicDNS
scott.bouch
January 3rd, 2015, 10:14 AM
Hi Bab1, thank you for the pointer.. I've followed the guidance, and am now more confident with it, thanks.
I think I'm 99% there, but have not quite cracked it..
This is my config file:
# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf
use=web, web=checkip.dyndns.com/, web-skip='IP Address'
protocol=namecheap
use=if, if=eth0
server=freedns1.registrar-servers.com
login=scottbouch
password='a lovely long password'
scottbouch.com
daemon=3600
Here's the result of the debug:
scott@6FC:/etc$ sudo ddclient -daemon=0 -debug -verbose -noquiet
WARNING: file /var/cache/ddclient/ddclient.cache, line 3: Invalid Value for keyword 'ip' = ''
=== opt ====
opt{cache} : <undefined>
opt{cmd} : <undefined>
opt{cmd-skip} : <undefined>
opt{daemon} : 0
opt{debug} : 1
opt{exec} : <undefined>
opt{facility} : <undefined>
opt{file} : <undefined>
opt{force} : <undefined>
opt{foreground} : <undefined>
opt{fw} : <undefined>
opt{fw-login} : <undefined>
opt{fw-password} : <undefined>
opt{fw-skip} : <undefined>
opt{geturl} : <undefined>
opt{help} : <undefined>
opt{host} : <undefined>
opt{if} : <undefined>
opt{if-skip} : <undefined>
opt{ip} : <undefined>
opt{login} : <undefined>
opt{mail} : <undefined>
opt{mail-failure} : <undefined>
opt{max-interval} : 2592000
opt{min-error-interval} : 300
opt{min-interval} : 30
opt{options} : <undefined>
opt{password} : <undefined>
opt{pid} : <undefined>
opt{postscript} : <undefined>
opt{priority} : <undefined>
opt{protocol} : <undefined>
opt{proxy} : <undefined>
opt{query} : <undefined>
opt{quiet} : 0
opt{retry} : <undefined>
opt{server} : <undefined>
opt{ssl} : <undefined>
opt{syslog} : <undefined>
opt{test} : <undefined>
opt{timeout} : <undefined>
opt{use} : <undefined>
opt{verbose} : 1
opt{web} : <undefined>
opt{web-skip} : <undefined>
=== globals ====
globals{daemon} : 60
globals{debug} : 1
globals{if} : eth0
globals{login} : scottbouch
globals{password} : a lovely long password
globals{protocol} : namecheap
globals{quiet} : 0
globals{server} : freedns1.registrar-servers.com
globals{use} : if
globals{verbose} : 1
globals{web} : checkip.dyndns.com/
globals{web-skip} : IP Address
=== config ====
config{scottbouch.com}{atime} : 0
config{scottbouch.com}{cacheable} : ARRAY(0x2500310)
config{scottbouch.com}{cmd} : <undefined>
config{scottbouch.com}{cmd-skip} :
config{scottbouch.com}{fw} :
config{scottbouch.com}{fw-login} : <undefined>
config{scottbouch.com}{fw-password} :
config{scottbouch.com}{fw-skip} :
config{scottbouch.com}{host} : scottbouch.com
config{scottbouch.com}{if} : eth0
config{scottbouch.com}{if-skip} :
config{scottbouch.com}{ip} : <undefined>
config{scottbouch.com}{login} : scottbouch
config{scottbouch.com}{max-interval} : 2592000
config{scottbouch.com}{min-error-interval} : 300
config{scottbouch.com}{min-interval} : 300
config{scottbouch.com}{mtime} : 0
config{scottbouch.com}{password} : a lovely long password
config{scottbouch.com}{protocol} : namecheap
config{scottbouch.com}{server} : freedns1.registrar-servers.com
config{scottbouch.com}{status} :
config{scottbouch.com}{use} : if
config{scottbouch.com}{warned-min-error-interval} : 0
config{scottbouch.com}{warned-min-interval} : 0
config{scottbouch.com}{web} : checkip.dyndns.com/
config{scottbouch.com}{web-skip} : IP Address
config{scottbouch.com}{wtime} : 30
=== cache ====
cache{scottbouch.com}{atime} : 1420275610
cache{scottbouch.com}{backupmx} : 0
cache{scottbouch.com}{host} : scottbouch.com
cache{scottbouch.com}{mtime} : 0
cache{scottbouch.com}{mx} :
cache{scottbouch.com}{static} : 0
cache{scottbouch.com}{status} : noconnect
cache{scottbouch.com}{warned-min-error-interval} : 0
cache{scottbouch.com}{warned-min-interval} : 0
cache{scottbouch.com}{wildcard} : 0
cache{scottbouch.com}{wtime} : 30
DEBUG: get_ip: using if, eth0 reports 192.168.1.50
WARNING: skipping update of scottbouch.com from <nothing> to 192.168.1.50.
WARNING: last updated <never> but last attempt on Sat Jan 3 09:00:10 2015 failed.
WARNING: Wait at least 5 minutes between update attempts.
I note that the IP address returned above is the local LAN IP address of my server, no the public one...
I've been onto namecheap's website to see what IP addresses are recorded against my A records (www and @), and they have not updated, not even to the LAN IP address as reported by get_ip.
Can anyone spot where I've gone wrong?
Thanks, Scott
bab1
January 3rd, 2015, 10:25 AM
You supposed to be monitoring the public WAN address of your router. The WAN address is what changes when the ISP's dhcp reassigns that address. Your web servers IP address should be a statically assigned address (set by the /etec/network/interfaces file). You should be port forwarding from the public facing WAN IP to the private server IP.
Take a second look at the conf file at the Ubuntu Help page. yours is not the same at all.
scott.bouch
January 3rd, 2015, 10:47 AM
Thanks,
I've added "SSL=yes", and commented out "use=if, if=eth0"
I also changed web-skip to Current Address as was suggested in the guidance.
Debug is returning more promising results now, I'm still to see the Namecheap website update the IP address against the records, but I believe this can take a couple of minutes.
scott@6FC:/etc$ sudo ddclient -daemon=0 -debug -verbose -noquiet
WARNING: file /var/cache/ddclient/ddcliache, line 3: Invalid Value for keyword 'ip' = ''
=== opt ====
opt{cache} : <undefined>
opt{cmd} : <undefined>
opt{cmd-skip} : <undefined>
opt{daemon} : 0
opt{debug} : 1
opt{exec} : <undefined>
opt{facility} : <undefined>
opt{file} : <undefined>
opt{force} : <undefined>
opt{foreground} : <undefined>
opt{fw} : <undefined>
opt{fw-login} : <undefined>
opt{fw-password} : <undefined>
opt{fw-skip} : <undefined>
opt{geturl} : <undefined>
opt{help} : <undefined>
opt{host} : <undefined>
opt{if} : <undefined>
opt{if-skip} : <undefined>
opt{ip} : <undefined>
opt{login} : <undefined>
opt{mail} : <undefined>
opt{mail-failure} : <undefined>
opt{max-interval} : 2592000
opt{min-error-interval} : 300
opt{min-interval} : 30
opt{options} : <undefined>
opt{password} : <undefined>
opt{pid} : <undefined>
opt{postscript} : <undefined>
opt{priority} : <undefined>
opt{protocol} : <undefined>
opt{proxy} : <undefined>
opt{query} : <undefined>
opt{quiet} : 0
opt{retry} : <undefined>
opt{server} : <undefined>
opt{ssl} : <undefined>
opt{syslog} : <undefined>
opt{test} : <undefined>
opt{timeout} : <undefined>
opt{use} : <undefined>
opt{verbose} : 1
opt{web} : <undefined>
opt{web-skip} : <undefined>
=== globals ====
globals{daemon} : 60
globals{debug} : 1
globals{login} : scottbouch
globals{password} : a long password
globals{protocol} : namecheap
globals{quiet} : 0
globals{server} : freedns1.registrar-servers.com
globals{ssl} : 1
globals{use} : web
globals{verbose} : 1
globals{web} : checkip.dyndns.com/
globals{web-skip} : Current Address
=== config ====
config{scottbouch.com}{atime} : 0
config{scottbouch.com}{cacheable} : ARRAY(0xe97b88)
config{scottbouch.com}{cmd} : <undefined>
config{scottbouch.com}{cmd-skip} :
config{scottbouch.com}{fw} :
config{scottbouch.com}{fw-login} : <undefined>
config{scottbouch.com}{fw-password} :
config{scottbouch.com}{fw-skip} :
config{scottbouch.com}{host} : scottbouch.com
config{scottbouch.com}{if} : ppp0
config{scottbouch.com}{if-skip} :
config{scottbouch.com}{ip} : <undefined>
config{scottbouch.com}{login} : scottbouch
config{scottbouch.com}{max-interval} : 2592000
config{scottbouch.com}{min-error-interval} : 300
config{scottbouch.com}{min-interval} : 300
config{scottbouch.com}{mtime} : 0
config{scottbouch.com}{password} : a long password
config{scottbouch.com}{protocol} : namecheap
config{scottbouch.com}{server} : freedns1.registrar-servers.com
config{scottbouch.com}{status} :
config{scottbouch.com}{use} : web
config{scottbouch.com}{warned-min-error-interval} : 0
config{scottbouch.com}{warned-min-interval} : 0
config{scottbouch.com}{web} : checkip.dyndns.com/
config{scottbouch.com}{web-skip} : Current Address
config{scottbouch.com}{wtime} : 30
=== cache ====
cache{scottbouch.com}{atime} : 1420277727
cache{scottbouch.com}{backupmx} : 0
cache{scottbouch.com}{host} : scottbouch.com
cache{scottbouch.com}{mtime} : 0
cache{scottbouch.com}{mx} :
cache{scottbouch.com}{static} : 0
cache{scottbouch.com}{status} : noconnect
cache{scottbouch.com}{warned-min-error-interval} : 0
cache{scottbouch.com}{warned-min-interval} : 0
cache{scottbouch.com}{wildcard} : 0
cache{scottbouch.com}{wtime} : 30
DEBUG: proxy =
DEBUG: url = checkip.dyndns.com/
DEBUG: server = checkip.dyndns.com
CONNECT: checkip.dyndns.com
CONNECTED: using HTTP
SENDING: GET / HTTP/1.0
SENDING: Host: checkip.dyndns.com
SENDING: User-Agent: ddclient/3.8.1
SENDING: Connection: close
SENDING:
RECEIVE: HTTP/1.1 200 OK
RECEIVE: Content-Type: text/html
RECEIVE: Server: DynDNS-CheckIP/1.0
RECEIVE: Connection: close
RECEIVE: Cache-Control: no-cache
RECEIVE: Pragma: no-cache
RECEIVE: Content-Length: 105
RECEIVE:
RECEIVE: <html><head><title>Current IP Check</title></head><body>Current IP Address: 78.144.218.75</body></html>
DEBUG: get_ip: using web, checkip.dyndns.com/ reports 78.144.218.75
WARNING: skipping update of scottbouch.com from <nothing> to 78.144.218.75.
WARNING: last updated <never> but last attempt on Sat Jan 3 09:35:27 2015 failed.
WARNING: Wait at least 5 minutes between update attempts.
It's sending the correct current public IP address now.
Internally, my router and the server are both on static IP addresses, and I've set my router for forward public port 80 to internal port 80 on my servers IP address.
Thanks again, Scott.
scott.bouch
January 3rd, 2015, 11:14 AM
I've just made one more change to the config file... I've added a .com at the end of the login name, and it appears on the face of things to have helped somewhat too:
Debug resuts:
scott@6FC:/etc$ sudo ddclient -daemon=0 -debug -verbose -noquiet
=== opt ====
opt{cache} : <undefined>
opt{cmd} : <undefined>
opt{cmd-skip} : <undefined>
opt{daemon} : 0
opt{debug} : 1
opt{exec} : <undefined>
opt{facility} : <undefined>
opt{file} : <undefined>
opt{force} : <undefined>
opt{foreground} : <undefined>
opt{fw} : <undefined>
opt{fw-login} : <undefined>
opt{fw-password} : <undefined>
opt{fw-skip} : <undefined>
opt{geturl} : <undefined>
opt{help} : <undefined>
opt{host} : <undefined>
opt{if} : <undefined>
opt{if-skip} : <undefined>
opt{ip} : <undefined>
opt{login} : <undefined>
opt{mail} : <undefined>
opt{mail-failure} : <undefined>
opt{max-interval} : 2592000
opt{min-error-interval} : 300
opt{min-interval} : 30
opt{options} : <undefined>
opt{password} : <undefined>
opt{pid} : <undefined>
opt{postscript} : <undefined>
opt{priority} : <undefined>
opt{protocol} : <undefined>
opt{proxy} : <undefined>
opt{query} : <undefined>
opt{quiet} : 0
opt{retry} : <undefined>
opt{server} : <undefined>
opt{ssl} : <undefined>
opt{syslog} : <undefined>
opt{test} : <undefined>
opt{timeout} : <undefined>
opt{use} : <undefined>
opt{verbose} : 1
opt{web} : <undefined>
opt{web-skip} : <undefined>
=== globals ====
globals{daemon} : 60
globals{debug} : 1
globals{login} : scottbouch.com
globals{password} : a long password
globals{protocol} : namecheap
globals{quiet} : 0
globals{server} : freedns1.registrar-servers.com
globals{ssl} : 1
globals{use} : web
globals{verbose} : 1
globals{web} : checkip.dyndns.com/
globals{web-skip} : Current Address
=== config ====
config{scottbouch.com}{atime} : 0
config{scottbouch.com}{cacheable} : ARRAY(0x10dd728)
config{scottbouch.com}{cmd} : <undefined>
config{scottbouch.com}{cmd-skip} :
config{scottbouch.com}{fw} :
config{scottbouch.com}{fw-login} : <undefined>
config{scottbouch.com}{fw-password} :
config{scottbouch.com}{fw-skip} :
config{scottbouch.com}{host} : scottbouch.com
config{scottbouch.com}{if} : ppp0
config{scottbouch.com}{if-skip} :
config{scottbouch.com}{ip} : <undefined>
config{scottbouch.com}{login} : scottbouch.com
config{scottbouch.com}{max-interval} : 2592000
config{scottbouch.com}{min-error-interval} : 300
config{scottbouch.com}{min-interval} : 300
config{scottbouch.com}{mtime} : 0
config{scottbouch.com}{password} : a long password
config{scottbouch.com}{protocol} : namecheap
config{scottbouch.com}{server} : freedns1.registrar-servers.com
config{scottbouch.com}{status} :
config{scottbouch.com}{use} : web
config{scottbouch.com}{warned-min-error-interval} : 0
config{scottbouch.com}{warned-min-interval} : 0
config{scottbouch.com}{web} : checkip.dyndns.com/
config{scottbouch.com}{web-skip} : Current Address
config{scottbouch.com}{wtime} : 30
=== cache ====
cache{scottbouch.com}{atime} : 0
cache{scottbouch.com}{backupmx} : 0
cache{scottbouch.com}{host} : scottbouch.com
cache{scottbouch.com}{mtime} : 0
cache{scottbouch.com}{mx} :
cache{scottbouch.com}{static} : 0
cache{scottbouch.com}{status} : noconnect
cache{scottbouch.com}{warned-min-error-interval} : 1420277860
cache{scottbouch.com}{warned-min-interval} : 0
cache{scottbouch.com}{wildcard} : 0
cache{scottbouch.com}{wtime} : 30
DEBUG: proxy =
DEBUG: url = checkip.dyndns.com/
DEBUG: server = checkip.dyndns.com
CONNECT: checkip.dyndns.com
CONNECTED: using HTTP
SENDING: GET / HTTP/1.0
SENDING: Host: checkip.dyndns.com
SENDING: User-Agent: ddclient/3.8.1
SENDING: Connection: close
SENDING:
RECEIVE: HTTP/1.1 200 OK
RECEIVE: Content-Type: text/html
RECEIVE: Server: DynDNS-CheckIP/1.0
RECEIVE: Connection: close
RECEIVE: Cache-Control: no-cache
RECEIVE: Pragma: no-cache
RECEIVE: Content-Length: 106
RECEIVE:
RECEIVE: <html><head><title>Current IP Check</title></head><body>Current IP Address: 89.243.105.120</body></html>
DEBUG: get_ip: using web, checkip.dyndns.com/ reports 89.243.105.120
DEBUG:
DEBUG: nic_namecheap1_update -------------------
INFO: setting IP address to 89.243.105.120 for scottbouch.com
UPDATE: updating scottbouch.com
DEBUG: proxy =
DEBUG: url = http://freedns1.registrar-servers.com/update?host=scottbouch.com&domain=scottbouch.com&password=a long password&ip=89.243.105.120
DEBUG: server = freedns1.registrar-servers.com
CONNECT: freedns1.registrar-servers.com
CONNECTED: using SSL
SENDING: GET /update?host=scottbouch.com&domain=scottbouch.com&password=a long password&ip=89.243.105.120 HTTP/1.0
SENDING: Host: freedns1.registrar-servers.com
SENDING: User-Agent: ddclient/3.8.1
SENDING: Connection: close
SENDING:
scott@6FC:/etc$
Looking a lot better, however, Still no update on Namecheap's website...
(You may note that my public IP address has changed durig this thread, due to the router being turned off and on again )
my config file now looks like this:
Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf
use=web, web=checkip.dyndns.com/, web-skip='Current Address'
protocol=namecheap
#use=if, if=eth0
server=freedns1.registrar-servers.com
login=scottbouch.com
password='a long password'
ssl=yes
scottbouch.com
daemon=3600
Thanks, Scott.
scott.bouch
January 3rd, 2015, 02:46 PM
This is the contents of var/cache/ddclient.cache, don't know if it helps or not..?
## ddclient-3.8.1
## last updated at Sat Jan 3 09:37:40 2015 (1420277860)
atime=0,backupmx=0,host=scottbouch.com,mtime=0,mx= ,static=0,status=noconnect,wa$
Cheers, Scott
bab1
January 3rd, 2015, 11:16 PM
At this point I think you need more specific help than I can give you. I'd also try the the official namecheap forum.
A simple google of namecheap and ddclient gets me this (https://www.google.com/search?q=nocharge+ddns+wiht+ddclient&btnG=Go!&gws_rd=ssl#q=namecheap+ddns+with+ddclient&spell=1).
scott.bouch
January 6th, 2015, 09:38 PM
Thanks for the pointer bab1, I think I can see what my mistake may be...
In my config file, 'host' is "scottbouch.com", however I think it should be "@" instead... see: https://www.namecheap.com/support/knowledgebase/article.aspx/583/11/how-do-i-configure-ddclient
If you need to dynamically update a subdomain then you need to subsititute host as subdomain. To dynamically update the domain itself (yourdomain.com), you need to replace host with @.
Hope this works when I get to try it..
Thank you again for your help, Scott
scott.bouch
January 11th, 2015, 06:23 PM
Hi,
I've had chance to revisit this again, and still no joy, but think I may have unearthed the issue... I think ddclient is not running as a service..
In trying to stop the service I get this:
scott@6FC:/$ sudo service ddclient stop
start-stop-daemon: warning: failed to kill 1960: No such process
I visit top, and indeed can't see 1960 listed.
So, I repeated the same command, but instead of "stop", I used "start"... no error message, so one assumes it's running, but I can't find it listed in "top".
I tried restarting it, and got pretty much the same result:
scott@6FC:/$ sudo /etc/init.d/ddclient restart
* Restarting Dynamic DNS service update utility ddclient
start-stop-daemon: warning: failed to kill 1960: No such process
[ OK ]
Do you think I'm barking up the wrong tree here, or am I possibly onto something?
When I run the debug command, it appears to find the public IP correctly, and put a URL together containing the correct public IP, the domain name and password, but nothing gets updated on Namecheap's end...
scott@6FC:/$ sudo ddclient -daemon=0 -debug verbose noquiet
DEBUG: proxy =
DEBUG: url = checkip.dyndns.com/
DEBUG: server = checkip.dyndns.com
DEBUG: get_ip: using web, checkip.dyndns.com/ reports 2.97.200.164
DEBUG:
DEBUG: nic_namecheap1_update -------------------
DEBUG: proxy =
DEBUG: url = http://freedns1.registrar-servers.com/update?host=@&domain=scottbouch.com&password=PASSWORD&ip=2.97.200.164
DEBUG: server = freedns1.registrar-servers.com
Should running this debug send the info to Namecheap? Does ddclient need to be running as a service in order to achieve this?
Again, Services is something I know little about being a Linux-learner...
Is there anything I can check to see if the service is running (aside from "top")?
How do I check the software is installed correctly and is up to date? Should I reboot the server to kick start the service?
Also, the contents of my ddclient.cache file if it helps:
GNU nano 2.2.6 File: ddclient.cache
## ddclient-3.8.1
## last updated at Sat Jan 3 09:37:40 2015 (1420277860)
atime=0,backupmx=0,host=scottbouch.com,mtime=0,mx= ,static=0,status=noconnect,wa$
Cheers, Scott
scott.bouch
January 17th, 2015, 01:54 AM
SOME SUCCESS!!
The kind Tech Support people at Namecheap advised me that I've been using the wrong Server details, I've corrected this, and now it partially works!
scott@6FC:~$ sudo ddclient -daemon=0 -debug verbose noquiet
[sudo] password for scott:
no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory
DEBUG: proxy =
DEBUG: url = checkip.dyndns.com/
DEBUG: server = checkip.dyndns.com
DEBUG: get_ip: using web, checkip.dyndns.com/ reports 92.25.63.52
DEBUG:
DEBUG: nic_namecheap1_update -------------------
DEBUG: proxy =
DEBUG: url = http://dynamicdns.park-your-domain.com/update?host=@&domain=scottbouch.com&password=PASSWORD&ip=92.25.63.52
DEBUG: server = dynamicdns.park-your-domain.com
SUCCESS: updating @: good: IP address set to 92.25.63.52
DEBUG: proxy =
DEBUG: url = http://dynamicdns.park-your-domain.com/update?host=www&domain=scottbouch.com&password=PASSWORD&ip=92.25.63.52
DEBUG: server = dynamicdns.park-your-domain.com
SUCCESS: updating www: good: IP address set to 92.25.63.52
After the above lines, I checked the Namecheap hosts control panel, and yep, it's correctly updated the public IP for the first time! Great!
HOWEVER, I say "partially" works, as ddclient only sends Namecheap my IP address when I manually perform this DEBUG command... It doesn't seem to be doing it automatically... Any ideas on Ubuntu services etc..?
Cheers, Scott.
scott.bouch
January 18th, 2015, 09:17 PM
Well, a mix of getting the Namecheap server name correct, and giving my server an update / upgrade / dist-upgrade and reeboot seemed to fix it!
www.scottbouch.com is now live from my garage!
Thanks for the guidance ,it not only helped solve my issue, but also built my Linux confidence !
Thanks, Scott
Powered by vBulletin® Version 4.2.2 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.