Monday, January 9, 2017

DDNS

Google is offering domain & DNS (https://domains.google.com/registrar) services for $12/yr and includes some cool features.

You can generate custom domain email & just have it forward to your gmail account. You can also set up to reply back from that address (https://support.google.com/domains/answer/3251241?hl=en)

The service also includes DDNS for your subdomain. You can set this up quickly if you have DDclient (https://support.google.com/domains/answer/6147083?hl=en) but I used this as an excuse to sit down and really dig into learning Python.

This still needs lots of work but it is functional for now. Just run it manually & check your error prints in console before setting this loose as a cron job/scheduled task. You don't want to be blocked because you kept sending invalid requests.

# Dynamic DNS Python script
# Author: Chris Stokes-Pham
# v1.0 7/28/15

# The legal stuff:
# The MIT License (MIT)

# Copyright (c) [2015] [Christopher Andrew Stokes-Pham]

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.


# libraries we need
import urllib.request
import urllib.parse
import http.client
import base64
import socket

#------------------------------
# all the user specific var
# define google username & password for DDNS service
myUname = 'Google Dynamic DNS generated username here'
myPasswd = 'Google Dynamic DNS generated password here'

# define your subdomain to update
myDomain = 'yourSubDomain.YourDomain.YourTLD'

#------------------------------
# Determine our current external IPs
# use https://domains.google.com/checkip http server to obtain public IP, Google will return IPv6 so
# other good server is http://ip.42.pl/raw which returns IPv4
url4 = 'http://ip.42.pl/raw'
req4 = urllib.request.Request(url4)
resp4 = urllib.request.urlopen(req4)
respData4 = resp4.read()
extIP4 = respData4.decode('utf-8')

url6 = 'https://domains.google.com/checkip'
req6 = urllib.request.Request(url6)
resp6 = urllib.request.urlopen(req6)
respData6 = resp6.read()
extIP6 = respData6.decode('utf-8')

#print IPs to console for troubleshooting
print (extIP4)
print (extIP6)

#------------------------------

# Check current subdomain IP, if matches don't overwork Google's DNS server
currentIP = socket.gethostbyname(myDomain)

if currentIP != extIP4:
    # connect to Google DDNS to update IP
    # Google example syntax per https://support.google.com/domains/answer/6147083
    # https://username:password@domains.google.com/nic/update?hostname=subdomain.yourdomain.com&myip=1.2.3.4

    # base64 encode username & password
    myUsrPass = myUname + ":" + myPasswd
    myUsrPass = base64.b64encode(bytes(myUsrPass, 'utf-8')).decode("ascii")
    print (myUsrPass)

    # encode data & user agent
    # Google DDNS only supports IPv4 for now so we will us it
    myData = urllib.parse.urlencode({'hostname' : myDomain, 'myip' : extIP4 }).encode("UTF-8")
    upUrl= '/nic/update?'
    upHost = 'domains.google.com'

    # URL query example & Headers
    # POST /nic/update?hostname=subdomain.yourdomain.com&myip=1.2.3.4 HTTP/1.1
    # Host: domains.google.com
    # Authorization: Basic base64-encoded-auth-string User-Agent: Chrome/41.0 your_email@yourdomain.com

    headers = {
        'Content-Type'  : "application/x-www-form-urlencoded",
        'User-Agent'    : 'Chrome/41.0',
        'Authorization' : 'Basic %s' % myUsrPass
        }

    # connect & update (need to include some catch for errors later)
    conn = http.client.HTTPSConnection(upHost)
    conn.request("POST", upUrl, myData, headers)
    upResp = conn.getresponse()
    print(upResp.status, upResp.reason)
    print(upResp.read().decode('utf-8'))

else:
    print("Current DNS shows your IP " + extIP4 + " no need to bother Google DNS")

Friday, March 22, 2013

Two factor authentication

Two factor authentication: something you know + something you have.
Apple is now offering this for your Apple ID here!

This is a must IMO for everyone who wants to protect their devices and data.

Google & Facebook also offer these services:

Google         Facebook

Also check your banks & credit unions. They have been doing this for a whiles on the back end for employees with RSA tokens. Most now have some form of two factor authentication with an app or email of a one time code.

Tuesday, November 22, 2011

Stanford is offering free online classes

Knowledge is the most valuable commodity and when classes are offered for free their value approaches infinity.
Free Crypto class
Free Engineering Classes