A comprehensive guide to using the IPv6-only toolkit.
- Getting Started
- Address Basics
- Network Operations
- Subnet Planning
- Address Generation
- Command-Line Tools
- Advanced Topics
pip install ipv6-onlyfrom ipv6tools import IPv6Address, IPv6Network
# Create an address
addr = IPv6Address("2001:db8::1")
print(addr.compressed) # 2001:db8::1from ipv6tools import IPv6Address
# Various formats work
addr1 = IPv6Address("2001:db8::1")
addr2 = IPv6Address("2001:0db8:0000:0000:0000:0000:0000:0001")
addr3 = IPv6Address("fe80::1%eth0") # With zone ID
print(addr1 == addr2) # True - same addressaddr = IPv6Address("fe80::1")
# Check address type
print(addr.is_link_local) # True
print(addr.is_global) # False
print(addr.is_multicast) # False
# Get readable type
print(addr.get_address_type()) # "Link-Local"from ipv6tools.utils import compress_address, expand_address
# Compress
long = "2001:0db8:0000:0000:0000:0000:0000:0001"
short = compress_address(long) # "2001:db8::1"
# Expand
expanded = expand_address("2001:db8::1")
# "2001:0db8:0000:0000:0000:0000:0000:0001"from ipv6tools import IPv6Network
# Create network
net = IPv6Network("2001:db8::/32")
# Get properties
print(net.network_address) # 2001:db8::
print(net.prefix_length) # 32
print(net.num_addresses) # 2^96net = IPv6Network("2001:db8::/32")
# Test if address is in network
print(net.contains("2001:db8::1")) # True
print(net.contains("2001:db8:1234::1")) # True
print(net.contains("2001:db9::1")) # False
# Use 'in' operator
from ipv6tools import IPv6Address
addr = IPv6Address("2001:db8::1")
print(addr in net) # Truenet = IPv6Network("2001:db8::/32")
# Create 4 subnets
subnets = net.subnets(prefixlen_diff=2) # /34 subnets
for subnet in subnets:
print(subnet)from ipv6tools import IPv6SubnetCalculator
calc = IPv6SubnetCalculator("2001:db8::/32")
# Get network information
info = calc.get_info()
print(f"Network: {info.network}")
print(f"Addresses: {info.num_addresses}")calc = IPv6SubnetCalculator("2001:db8::/32")
# Method 1: Specify number of subnets
subnets = calc.divide_into_subnets(16)
for subnet in subnets:
print(subnet.network)
# Method 2: Specify new prefix length
subnets = calc.divide_by_prefix(36) # Create /36 subnetscalc = IPv6SubnetCalculator("2001:db8::/32")
# Get larger network
supernet = calc.get_supernet(24) # Get /24
print(supernet.network)calc = IPv6SubnetCalculator
# Allocate to departments
allocation = calc.recommend_allocation(
"2001:db8::/32",
{
"Engineering": 10,
"Sales": 5,
"IT": 3,
}
)
for dept, subnets in allocation.items():
print(f"{dept}:")
for subnet in subnets:
print(f" {subnet.network}")from ipv6tools.utils import generate_link_local
# Random link-local
addr = generate_link_local()
print(addr) # fe80::xxxx:xxxx:xxxx:xxxx
# With specific interface ID
addr = generate_link_local("0000000000000001")
print(addr) # fe80::1from ipv6tools.utils import generate_unique_local
# Random ULA
addr = generate_unique_local()
print(addr) # fd...:...
# With specific parameters
addr = generate_unique_local(
global_id="0123456789",
subnet_id="0001",
interface_id="0000000000000001"
)from ipv6tools.utils import generate_random_ipv6
# Generate in default prefix (2001:db8::/64)
addr = generate_random_ipv6()
# Generate in custom prefix
addr = generate_random_ipv6("2001:db8:1234::/48")from ipv6tools.utils import mac_to_ipv6_link_local
# Convert MAC to link-local IPv6
mac = "00:11:22:33:44:55"
addr = mac_to_ipv6_link_local(mac)
print(addr) # fe80::211:22ff:fe33:4455# Get network info
ipv6-calc 2001:db8::/32 --info
# Divide into subnets
ipv6-calc 2001:db8::/32 --divide 16
# Divide by prefix
ipv6-calc 2001:db8::/32 --prefix 36
# Get supernet
ipv6-calc 2001:db8::/32 --supernet 24
# Check if address is in network
ipv6-calc 2001:db8::/32 --contains 2001:db8::1# Validate addresses
ipv6-validate 2001:db8::1 fe80::1%eth0
# Validate networks
ipv6-validate -n 2001:db8::/32 fe80::/10
# Quiet mode (exit code only)
ipv6-validate -q 2001:db8::1 && echo "Valid"# Generate link-local
ipv6-gen link-local
# Generate ULA
ipv6-gen ula
# Generate random
ipv6-gen random -p 2001:db8::/64
# From MAC
ipv6-gen from-mac 00:11:22:33:44:55
# Generate multiple
ipv6-gen link-local -n 10# Run diagnostics
sudo ./src/scripts/ipv6-diag.sh
# Quick connectivity check
./src/scripts/ipv6-diag.sh --quick
# Enable IPv6
sudo ./src/scripts/ipv6-config.sh enable
# Configure static address
sudo ./src/scripts/ipv6-config.sh static eth0 2001:db8::10 64
# Enable privacy extensions
sudo ./src/scripts/ipv6-config.sh enable-privacyfrom ipv6tools.utils import reverse_pointer
addr = "2001:db8::1"
ptr = reverse_pointer(addr)
print(ptr)
# 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpaaddr = IPv6Address("2001:db8::1")
# Binary (128 bits)
binary = addr.to_binary()
print(binary)
# Hexadecimal (32 hex digits)
hex_str = addr.to_hex()
print(hex_str)calc = IPv6SubnetCalculator("2001:db8::/32")
# Check overlap
overlaps = calc.overlaps_with("2001:db8:1::/48")
print(overlaps) # True - /48 is within /32calc = IPv6SubnetCalculator("2001:db8::/48")
# Summarize multiple networks
summary = calc.get_summary_address([
"2001:db8:1::/48",
"2001:db8:2::/48",
"2001:db8:3::/48",
])
print(summary) # Smallest network containing allfrom ipv6tools.validator import validate_ipv6
addr_input = input("Enter IPv6 address: ")
valid, error = validate_ipv6(addr_input)
if valid:
addr = IPv6Address(addr_input)
# Process address
else:
print(f"Invalid: {error}")/64- Standard subnet (SLAAC)/48- Typical site allocation/32- ISP allocation/128- Single host
# Zone IDs are important for link-local
addr = IPv6Address("fe80::1%eth0")
print(addr.zone_id) # "eth0"def is_usable_for_public(addr_str):
"""Check if address is suitable for public use."""
addr = IPv6Address(addr_str)
if addr.is_link_local:
return False # Only local
if addr.is_loopback:
return False # Only localhost
if addr.is_private:
return False # ULA - not globally routable
return addr.is_globalnetworks = [
"2001:db8::/32",
"2001:db8:1000::/36",
"2001:db8:2000::/36",
]
for net_str in networks:
net = IPv6Network(net_str)
calc = IPv6SubnetCalculator(net_str)
info = calc.get_info()
print(f"{info.network}")
print(f" Addresses: {info.num_addresses}")
print(f" Type: {info.addressType}")from ipv6tools.validator import is_valid_ipv6
addresses = [
"2001:db8::1",
"invalid",
"fe80::1",
"::1",
]
valid_addresses = [addr for addr in addresses if is_valid_ipv6(addr)]
print(f"Valid: {len(valid_addresses)}/{len(addresses)}")- Explore the API Documentation
- Check out Examples
- Read about IPv6 Best Practices
- Try the Web Interface
Import Error
# Make sure package is installed
pip install -e .Invalid Address
# Check address format
from ipv6tools.validator import validate_ipv6
valid, error = validate_ipv6("your-address")
print(error) # See specific errorNetwork Too Large
# Don't try to enumerate hosts in large networks
net = IPv6Network("2001:db8::/32")
# net.hosts() # Don't do this! Too many addresses
# Instead, calculate specific addresses or use smaller subnets