"text-align: center; margin-bottom: 2rem;" ■img src="/logo/gns3-logo.png" alt="GNS3 Logo" estilo="max-width: 200px; altura: auto;" / ■/div titulada
GNS3 Cheatsheet
"Display": flex; diferencia: 1rem; margen: 2rem 0; flex-wrap: wrap;"
Button
onClick={() = Conf {} const content = document.querySelector('.markdown').inner Texto; navigator.clipboard.writeText(content); alert('Content copied to clipboard!'); } estilo fondoColor: '#10b981', color: 'blanco', frontera: 'ninguno', '0.5rem 1rem', frontera Radius: '0.375rem', cursor: 'punto', fuente Tamaño: '0.875rem', fontWeight: '500 ' }
📋 Copiar para el tablero ■/buttonilo
Button
onClick={() = Conf {} ventana.print(); } estilo fondoColor: '#3b82f6', color: 'blanco', frontera: 'ninguno', '0.5rem 1rem', frontera Radius: '0.375rem', cursor: 'punto', fuente Tamaño: '0.875rem', fontWeight: '500 ' }
🖨 Print/PDF ■/buttonilo ■/div titulada
Sinopsis
GNS3 (Graphical Network Simulator 3) es una poderosa plataforma de simulación de red que permite a los ingenieros de red diseñar, construir y probar topologías complejas de red utilizando dispositivos reales y virtuales. Proporciona un entorno integral para la capacitación en red, preparación de certificación y pruebas de red de producción sin necesidad de hardware físico.
Instalación
Instalación de Windows
# Download GNS3 all-in-one installer
# Visit https://gns3.com/software/download and download the Windows installer
# Install with PowerShell (if using Chocolatey)
choco install gns3
# Verify installation
gns3 --version
# Install additional components
# - VMware Workstation/Player (recommended)
# - VirtualBox (alternative)
# - QEMU (included with GNS3)
Instalación de Linux (Ubuntu/Debian)
# Add GNS3 repository
sudo add-apt-repository ppa:gns3/ppa
sudo apt update
# Install GNS3 GUI and server
sudo apt install gns3-gui gns3-server
# Install additional dependencies
sudo apt install qemu-kvm qemu-utils libvirt-daemon-system libvirt-clients bridge-utils
# Add user to required groups
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
sudo usermod -aG ubridge $USER
# Install Docker (optional but recommended)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# Logout and login again for group changes to take effect
macOS Instalación
# Install using Homebrew
brew install --cask gns3
# Or download from official website
# Visit https://gns3.com/software/download
# Install additional components
# - VMware Fusion (recommended)
# - VirtualBox (alternative)
# - Docker Desktop
# Verify installation
gns3 --version
Docker Instalación
# Pull GNS3 server image
docker pull gns3/gns3server
# Run GNS3 server in container
docker run -d \
--name gns3-server \
--privileged \
-p 3080:3080 \
-v /var/lib/gns3:/opt/gns3/projects \
-v /etc/gns3:/etc/gns3 \
gns3/gns3server
# Access GNS3 web interface
# http://localhost:3080
Configuración básica
Configuración inicial
# First-time setup wizard
gns3 --setup
# Configure server settings
# File > Preferences > Server
# - Local server: 127.0.0.1:3080
# - Remote server: Configure if using remote GNS3 server
# Configure virtualization
# Edit > Preferences > VirtualBox/VMware/QEMU
# - Set paths to virtualization software
# - Configure resource allocation
Project Management
# Create new project
# File > New Project
# - Project name: MyNetworkLab
# - Location: /home/user/GNS3/projects/
# - Type: Blank project
# Open existing project
# File > Open Project
# Browse to .gns3 project file
# Save project
# File > Save Project (Ctrl+S)
# Export project
# File > Export Project
# Creates portable .gns3project file
# Import project
# File > Import Project
# Select .gns3project file
Gestión de dispositivos
Añadiendo imágenes Cisco IOS
# Add IOS router image
# Edit > Preferences > Dynamips > IOS routers
# Click "New" and browse to IOS image file
# Configure router template
# - Platform: c7200 (for Cisco 7200 series)
# - Image: Browse to IOS file
# - RAM: 512 MB (recommended)
# - Idle-PC: Calculate for CPU optimization
# Calculate Idle-PC value
# Right-click router in topology
# Select "Idle-PC" > "Calculate"
# Wait for calculation to complete
Añadiendo electrodomésticos virtuales
# Download appliances from GNS3 marketplace
# File > Import Appliance
# Browse to .gns3a appliance file
# Popular appliances:
# - Cisco IOSv (virtual IOS)
# - Cisco IOSvL2 (virtual switch)
# - Cisco ASAv (virtual firewall)
# - Arista vEOS
# - Juniper vSRX
# - pfSense
# - Ubuntu Server
# - Windows Server
# Configure appliance settings
# Edit > Preferences > QEMU VMs
# Select appliance and configure:
# - RAM allocation
# - CPU cores
# - Network adapters
Docker Containers
# Add Docker container
# Edit > Preferences > Docker containers
# Click "New" to add container
# Popular network containers:
# - Alpine Linux: alpine:latest
# - Ubuntu: ubuntu:latest
# - Network tools: nicolaka/netshoot
# - Web server: nginx:alpine
# Configure container
# - Image name: alpine:latest
# - Start command: /bin/sh
# - Console type: telnet
# - Environment variables: as needed
Topología Diseño
Topología de Red Básica
# Create simple router topology
# 1. Drag routers from device panel
# 2. Connect with cables
# 3. Configure interfaces
# Example: Three-router topology
# R1 --- R2 --- R3
| # | | |
# PC1 PC2
# Add devices:
# - 3x Cisco 7200 routers
# - 2x VPCS (Virtual PC Simulator)
# - Ethernet switches as needed
# Connect devices:
# - Click cable tool
# - Select source device/interface
# - Select destination device/interface
Características de la topología avanzada
# Add text annotations
# Insert > Text
# Add descriptive labels for network segments
# Add shapes and drawings
# Insert > Rectangle/Ellipse
# Create network diagrams and documentation
# Group devices
# Select multiple devices
# Right-click > Group
# Useful for organizing complex topologies
# Create network segments
# Use Ethernet switches to create broadcast domains
# Configure VLANs for network segmentation
Plantillas de Topología
# Save topology as template
# File > Export Project
# Save in templates directory
# Common topology templates:
# - CCNA lab setup
# - OSPF network
# - BGP routing lab
# - Security lab with firewalls
# - Data center topology
# Load template
# File > New Project
# Select "From template"
# Choose saved template
Configuración de dispositivos
Configuración de router
# Access router console
# Right-click router > Console
# Or double-click router
# Basic router configuration
Router> enable
Router# configure terminal
Router(config)# hostname R1
R1(config)# interface fastethernet0/0
R1(config-if)# ip address 192.168.1.1 255.255.255.0
R1(config-if)# no shutdown
R1(config-if)# exit
# Configure routing
R1(config)# router ospf 1
R1(config-router)# network 192.168.1.0 0.0.0.255 area 0
R1(config-router)# exit
# Save configuration
R1# copy running-config startup-config
Configuración de conmutación
# Access switch console
# Right-click switch > Console
# Basic switch configuration
Switch> enable
Switch# configure terminal
Switch(config)# hostname SW1
SW1(config)# vlan 10
SW1(config-vlan)# name SALES
SW1(config-vlan)# exit
# Configure access port
SW1(config)# interface fastethernet0/1
SW1(config-if)# switchport mode access
SW1(config-if)# switchport access vlan 10
SW1(config-if)# exit
# Configure trunk port
SW1(config)# interface fastethernet0/24
SW1(config-if)# switchport mode trunk
SW1(config-if)# switchport trunk allowed vlan all
SW1(config-if)# exit
Configuración de PC virtual
# Access VPCS console
# Right-click VPCS > Console
# Configure IP address
VPCS> ip 192.168.1.10 255.255.255.0 192.168.1.1
# Test connectivity
VPCS> ping 192.168.1.1
VPCS> trace 8.8.8.8
# Show configuration
VPCS> show ip
VPCS> show
# Save configuration
VPCS> save
Protocolos y servicios de red
OSPF Configuración
# Configure OSPF on multiple routers
# Router R1
R1(config)# router ospf 1
R1(config-router)# router-id 1.1.1.1
R1(config-router)# network 192.168.1.0 0.0.0.255 area 0
R1(config-router)# network 10.1.1.0 0.0.0.255 area 0
# Router R2
R2(config)# router ospf 1
R2(config-router)# router-id 2.2.2.2
R2(config-router)# network 10.1.1.0 0.0.0.255 area 0
R2(config-router)# network 10.2.2.0 0.0.0.255 area 0
# Verify OSPF
R1# show ip ospf neighbor
R1# show ip ospf database
R1# show ip route ospf
BGP Configuración
# Configure eBGP between autonomous systems
# Router R1 (AS 100)
R1(config)# router bgp 100
R1(config-router)# bgp router-id 1.1.1.1
R1(config-router)# neighbor 10.1.1.2 remote-as 200
R1(config-router)# network 192.168.1.0 mask 255.255.255.0
# Router R2 (AS 200)
R2(config)# router bgp 200
R2(config-router)# bgp router-id 2.2.2.2
R2(config-router)# neighbor 10.1.1.1 remote-as 100
R2(config-router)# network 192.168.2.0 mask 255.255.255.0
# Verify BGP
R1# show ip bgp summary
R1# show ip bgp
R1# show ip route bgp
VLAN y Trunking
# Configure VLANs on switch
SW1(config)# vlan 10
SW1(config-vlan)# name SALES
SW1(config-vlan)# vlan 20
SW1(config-vlan)# name ENGINEERING
SW1(config-vlan)# exit
# Configure access ports
SW1(config)# interface range fastethernet0/1-10
SW1(config-if-range)# switchport mode access
SW1(config-if-range)# switchport access vlan 10
SW1(config)# interface range fastethernet0/11-20
SW1(config-if-range)# switchport mode access
SW1(config-if-range)# switchport access vlan 20
# Configure trunk port
SW1(config)# interface fastethernet0/24
SW1(config-if)# switchport mode trunk
SW1(config-if)# switchport trunk allowed vlan 10,20
# Verify VLAN configuration
SW1# show vlan brief
SW1# show interfaces trunk
Características avanzadas
Packet Capture
# Start packet capture on link
# Right-click on network link
# Select "Start capture"
# Choose capture file location
# View captured packets
# Right-click on link with active capture
# Select "Stop capture"
# Wireshark opens automatically
# Capture filters
# Before starting capture, set filters:
# - Protocol: tcp, udp, icmp
# - Host: host 192.168.1.1
# - Port: port 80 or port 443
Automatización de redes
# Python script for device configuration
#!/usr/bin/env python3
import telnetlib
import time
def configure_router(host, commands):
"""Configure router via telnet"""
try:
tn = telnetlib.Telnet(host, 23, timeout=10)
# Wait for prompt and enter enable mode
tn.read_until(b">")
tn.write(b"enable\n")
tn.read_until(b"#")
# Enter configuration mode
tn.write(b"configure terminal\n")
tn.read_until(b"(config)#")
# Execute commands
for command in commands:
tn.write(command.encode() + b"\n")
time.sleep(1)
# Exit configuration mode
tn.write(b"exit\n")
tn.write(b"copy running-config startup-config\n")
tn.write(b"\n") # Confirm save
tn.close()
print(f"Configuration completed for {host}")
except Exception as e:
print(f"Error configuring {host}: {e}")
# Configuration commands
router_commands = [
"hostname R1",
"interface fastethernet0/0",
"ip address 192.168.1.1 255.255.255.0",
"no shutdown",
"exit",
"router ospf 1",
"network 192.168.1.0 0.0.0.255 area 0"
]
# Configure router
configure_router("192.168.1.1", router_commands)
Script de configuración a granel
#!/usr/bin/env python3
import concurrent.futures
import telnetlib
import time
import json
class GNS3Configurator:
def __init__(self, config_file):
"""Initialize with configuration file"""
with open(config_file, 'r') as f:
self.config = json.load(f)
def configure_device(self, device):
"""Configure individual device"""
host = device['host']
commands = device['commands']
device_type = device.get('type', 'router')
try:
tn = telnetlib.Telnet(host, 23, timeout=10)
if device_type == 'router':
self._configure_router(tn, commands)
elif device_type == 'switch':
self._configure_switch(tn, commands)
tn.close()
return f"✓ {host} configured successfully"
except Exception as e:
return f"✗ {host} failed: {e}"
def _configure_router(self, tn, commands):
"""Configure router device"""
tn.read_until(b">")
tn.write(b"enable\n")
tn.read_until(b"#")
tn.write(b"configure terminal\n")
tn.read_until(b"(config)#")
for command in commands:
tn.write(command.encode() + b"\n")
time.sleep(0.5)
tn.write(b"exit\n")
tn.write(b"copy running-config startup-config\n")
tn.write(b"\n")
def _configure_switch(self, tn, commands):
"""Configure switch device"""
tn.read_until(b">")
tn.write(b"enable\n")
tn.read_until(b"#")
tn.write(b"configure terminal\n")
tn.read_until(b"(config)#")
for command in commands:
tn.write(command.encode() + b"\n")
time.sleep(0.5)
tn.write(b"exit\n")
tn.write(b"copy running-config startup-config\n")
tn.write(b"\n")
def configure_all(self, max_workers=5):
"""Configure all devices concurrently"""
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = [executor.submit(self.configure_device, device)
for device in self.config['devices']]
for future in concurrent.futures.as_completed(futures):
print(future.result())
# Example configuration file (config.json)
config_example = {
"devices": [
{
"host": "192.168.1.1",
"type": "router",
"commands": [
"hostname R1",
"interface fastethernet0/0",
"ip address 192.168.1.1 255.255.255.0",
"no shutdown"
]
},
{
"host": "192.168.1.2",
"type": "switch",
"commands": [
"hostname SW1",
"vlan 10",
"name SALES",
"exit"
]
}
]
}
# Usage
if __name__ == "__main__":
configurator = GNS3Configurator("config.json")
configurator.configure_all()
Pruebas y validación
Pruebas de conectividad
# Basic connectivity tests
# From VPCS or router
ping 192.168.1.1
ping 8.8.8.8
# Traceroute testing
trace 192.168.1.1
trace 8.8.8.8
# Extended ping from router
R1# ping
Protocol [ip]:
Target IP address: 192.168.1.2
Repeat count [5]: 100
Datagram size [100]: 1500
Timeout in seconds [2]: 5
Extended commands [n]: y
Source address or interface: 192.168.1.1
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]:
Sweep range of sizes [n]:
Red Validation Script
#!/usr/bin/env python3
import subprocess
import json
import time
from datetime import datetime
class NetworkValidator:
def __init__(self, test_config):
"""Initialize with test configuration"""
self.tests = test_config
self.results = []
def ping_test(self, source, target, count=5):
"""Perform ping test"""
try:
# Use system ping command
result = subprocess.run(
['ping', '-c', str(count), target],
capture_output=True,
text=True,
timeout=30
)
success = result.returncode == 0
output = result.stdout if success else result.stderr
return {
'test': 'ping',
'source': source,
'target': target,
'success': success,
'output': output,
'timestamp': datetime.now().isoformat()
}
except Exception as e:
return {
'test': 'ping',
'source': source,
'target': target,
'success': False,
'error': str(e),
'timestamp': datetime.now().isoformat()
}
def traceroute_test(self, source, target):
"""Perform traceroute test"""
try:
result = subprocess.run(
['traceroute', target],
capture_output=True,
text=True,
timeout=60
)
success = result.returncode == 0
output = result.stdout if success else result.stderr
return {
'test': 'traceroute',
'source': source,
'target': target,
'success': success,
'output': output,
'timestamp': datetime.now().isoformat()
}
except Exception as e:
return {
'test': 'traceroute',
'source': source,
'target': target,
'success': False,
'error': str(e),
'timestamp': datetime.now().isoformat()
}
def run_all_tests(self):
"""Run all configured tests"""
print("Starting network validation tests...")
for test in self.tests:
test_type = test['type']
source = test['source']
target = test['target']
print(f"Running {test_type} from {source} to {target}")
if test_type == 'ping':
result = self.ping_test(source, target, test.get('count', 5))
elif test_type == 'traceroute':
result = self.traceroute_test(source, target)
self.results.append(result)
# Wait between tests
time.sleep(test.get('delay', 1))
def generate_report(self, output_file='network_test_report.json'):
"""Generate test report"""
report = {
'test_run': datetime.now().isoformat(),
'total_tests': len(self.results),
'passed': sum(1 for r in self.results if r['success']),
'failed': sum(1 for r in self.results if not r['success']),
'results': self.results
}
with open(output_file, 'w') as f:
json.dump(report, f, indent=2)
print(f"Test report saved to {output_file}")
return report
# Example test configuration
test_config = [
{
'type': 'ping',
'source': 'local',
'target': '192.168.1.1',
'count': 10,
'delay': 2
},
{
'type': 'ping',
'source': 'local',
'target': '192.168.1.2',
'count': 5,
'delay': 1
},
{
'type': 'traceroute',
'source': 'local',
'target': '8.8.8.8',
'delay': 3
}
]
# Usage
if __name__ == "__main__":
validator = NetworkValidator(test_config)
validator.run_all_tests()
report = validator.generate_report()
print(f"\nTest Summary:")
print(f"Total tests: {report['total_tests']}")
print(f"Passed: {report['passed']}")
print(f"Failed: {report['failed']}")
Optimización del rendimiento
Gestión de los recursos
# Optimize GNS3 performance
# Edit > Preferences > General
# - Check "Use local server"
# - Adjust "Console delay" to 500ms
# - Enable "Auto start console applications"
# Memory optimization
# Edit > Preferences > QEMU
# - Reduce RAM allocation for devices
# - Use linked clones when possible
# - Enable KVM acceleration (Linux)
# CPU optimization
# Edit > Preferences > General
# - Limit CPU usage per device
# - Use multi-core allocation wisely
# - Calculate Idle-PC for Cisco routers
Performance Monitoring Script
#!/usr/bin/env python3
import psutil
import time
import json
from datetime import datetime
class GNS3Monitor:
def __init__(self, interval=5):
"""Initialize performance monitor"""
self.interval = interval
self.data = []
def get_system_stats(self):
"""Get current system statistics"""
return {
'timestamp': datetime.now().isoformat(),
'cpu_percent': psutil.cpu_percent(interval=1),
'memory_percent': psutil.virtual_memory().percent,
'memory_used_gb': psutil.virtual_memory().used / (1024**3),
'memory_total_gb': psutil.virtual_memory().total / (1024**3),
'disk_usage_percent': psutil.disk_usage('/').percent,
'network_io': dict(psutil.net_io_counters()._asdict())
}
def get_gns3_processes(self):
"""Get GNS3-related process information"""
gns3_processes = []
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
try:
if 'gns3' in proc.info['name'].lower() or 'qemu' in proc.info['name'].lower():
gns3_processes.append(proc.info)
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
return gns3_processes
def monitor(self, duration_minutes=10):
"""Monitor system for specified duration"""
end_time = time.time() + (duration_minutes * 60)
print(f"Starting {duration_minutes}-minute monitoring session...")
while time.time() < end_time:
stats = self.get_system_stats()
stats['gns3_processes'] = self.get_gns3_processes()
self.data.append(stats)
print(f"CPU: {stats['cpu_percent']:.1f}% | "
f"Memory: {stats['memory_percent']:.1f}% | "
f"GNS3 Processes: {len(stats['gns3_processes'])}")
time.sleep(self.interval)
def save_report(self, filename='gns3_performance_report.json'):
"""Save monitoring data to file"""
with open(filename, 'w') as f:
json.dump(self.data, f, indent=2)
print(f"Performance report saved to {filename}")
def analyze_performance(self):
"""Analyze performance data"""
if not self.data:
print("No data to analyze")
return
cpu_values = [d['cpu_percent'] for d in self.data]
memory_values = [d['memory_percent'] for d in self.data]
analysis = {
'duration_minutes': len(self.data) * self.interval / 60,
'cpu_stats': {
'average': sum(cpu_values) / len(cpu_values),
'max': max(cpu_values),
'min': min(cpu_values)
},
'memory_stats': {
'average': sum(memory_values) / len(memory_values),
'max': max(memory_values),
'min': min(memory_values)
},
'recommendations': []
}
# Generate recommendations
if analysis['cpu_stats']['average'] > 80:
analysis['recommendations'].append("High CPU usage detected. Consider reducing device count or optimizing configurations.")
if analysis['memory_stats']['average'] > 80:
analysis['recommendations'].append("High memory usage detected. Consider reducing RAM allocation for devices.")
return analysis
# Usage
if __name__ == "__main__":
monitor = GNS3Monitor(interval=5)
monitor.monitor(duration_minutes=10)
monitor.save_report()
analysis = monitor.analyze_performance()
print("\nPerformance Analysis:")
print(f"Average CPU: {analysis['cpu_stats']['average']:.1f}%")
print(f"Average Memory: {analysis['memory_stats']['average']:.1f}%")
if analysis['recommendations']:
print("\nRecommendations:")
for rec in analysis['recommendations']:
print(f"- {rec}")
Solución de problemas
Problemas y soluciones comunes
# Issue: Devices won't start
# Solution: Check virtualization settings
# 1. Verify VMware/VirtualBox installation
# 2. Check hardware virtualization in BIOS
# 3. Ensure sufficient system resources
# Issue: Console connection fails
# Solution: Check console settings
# Edit > Preferences > General > Console applications
# - Telnet: Use built-in terminal
# - SSH: Configure SSH client path
# Issue: High CPU usage
# Solution: Calculate Idle-PC for Cisco routers
# Right-click router > Idle-PC > Calculate
# Apply calculated value to reduce CPU usage
# Issue: Network connectivity problems
# Solution: Check interface status
show ip interface brief
show interfaces
show ip route
# Issue: GNS3 server connection problems
# Solution: Restart GNS3 server
sudo systemctl restart gns3-server
# Or manually:
gns3server --host 0.0.0.0 --port 3080
Guión diagnóstico
#!/usr/bin/env python3
import subprocess
import platform
import psutil
import socket
import json
from datetime import datetime
class GNS3Diagnostics:
def __init__(self):
"""Initialize diagnostics"""
self.results = {}
def check_system_requirements(self):
"""Check system requirements"""
system_info = {
'platform': platform.platform(),
'processor': platform.processor(),
'architecture': platform.architecture(),
'cpu_count': psutil.cpu_count(),
'memory_gb': psutil.virtual_memory().total / (1024**3),
'disk_space_gb': psutil.disk_usage('/').free / (1024**3)
}
# Check minimum requirements
requirements_met = {
'cpu_cores': system_info['cpu_count'] >= 2,
'memory': system_info['memory_gb'] >= 4,
'disk_space': system_info['disk_space_gb'] >= 10
}
self.results['system_requirements'] = {
'info': system_info,
'requirements_met': requirements_met,
'all_requirements_met': all(requirements_met.values())
}
def check_virtualization(self):
"""Check virtualization support"""
virt_support = {}
try:
# Check for hardware virtualization
if platform.system() == "Linux":
result = subprocess.run(['grep', '-E', '(vmx|svm)', '/proc/cpuinfo'],
capture_output=True, text=True)
virt_support['hardware_virt'] = result.returncode == 0
# Check KVM
result = subprocess.run(['lsmod'], capture_output=True, text=True)
virt_support['kvm_loaded'] = 'kvm' in result.stdout
elif platform.system() == "Windows":
# Check Hyper-V capability
result = subprocess.run(['systeminfo'], capture_output=True, text=True)
virt_support['hyper_v'] = 'Hyper-V' in result.stdout
except Exception as e:
virt_support['error'] = str(e)
self.results['virtualization'] = virt_support
def check_network_connectivity(self):
"""Check network connectivity"""
connectivity = {}
# Test internet connectivity
try:
socket.create_connection(("8.8.8.8", 53), timeout=5)
connectivity['internet'] = True
except:
connectivity['internet'] = False
# Test GNS3 server port
try:
socket.create_connection(("127.0.0.1", 3080), timeout=5)
connectivity['gns3_server'] = True
except:
connectivity['gns3_server'] = False
self.results['network'] = connectivity
def check_gns3_installation(self):
"""Check GNS3 installation"""
installation = {}
try:
# Check GNS3 version
result = subprocess.run(['gns3', '--version'],
capture_output=True, text=True)
installation['gns3_installed'] = result.returncode == 0
installation['gns3_version'] = result.stdout.strip() if result.returncode == 0 else None
except FileNotFoundError:
installation['gns3_installed'] = False
try:
# Check GNS3 server
result = subprocess.run(['gns3server', '--version'],
capture_output=True, text=True)
installation['gns3server_installed'] = result.returncode == 0
installation['gns3server_version'] = result.stdout.strip() if result.returncode == 0 else None
except FileNotFoundError:
installation['gns3server_installed'] = False
self.results['installation'] = installation
def check_processes(self):
"""Check running GNS3 processes"""
processes = []
for proc in psutil.process_iter(['pid', 'name', 'status', 'cpu_percent', 'memory_percent']):
try:
if any(keyword in proc.info['name'].lower() for keyword in ['gns3', 'qemu', 'vmware', 'virtualbox']):
processes.append(proc.info)
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
self.results['processes'] = processes
def run_all_checks(self):
"""Run all diagnostic checks"""
print("Running GNS3 diagnostics...")
self.check_system_requirements()
print("✓ System requirements checked")
self.check_virtualization()
print("✓ Virtualization support checked")
self.check_network_connectivity()
print("✓ Network connectivity checked")
self.check_gns3_installation()
print("✓ GNS3 installation checked")
self.check_processes()
print("✓ Running processes checked")
self.results['timestamp'] = datetime.now().isoformat()
def generate_report(self, filename='gns3_diagnostics.json'):
"""Generate diagnostic report"""
with open(filename, 'w') as f:
json.dump(self.results, f, indent=2)
print(f"\nDiagnostic report saved to {filename}")
# Print summary
print("\n=== DIAGNOSTIC SUMMARY ===")
# System requirements
req = self.results['system_requirements']
print(f"System Requirements: {'✓ PASS' if req['all_requirements_met'] else '✗ FAIL'}")
# Network
net = self.results['network']
print(f"Internet Connectivity: {'✓ PASS' if net['internet'] else '✗ FAIL'}")
print(f"GNS3 Server: {'✓ RUNNING' if net['gns3_server'] else '✗ NOT RUNNING'}")
# Installation
inst = self.results['installation']
print(f"GNS3 GUI: {'✓ INSTALLED' if inst['gns3_installed'] else '✗ NOT FOUND'}")
print(f"GNS3 Server: {'✓ INSTALLED' if inst['gns3server_installed'] else '✗ NOT FOUND'}")
# Processes
proc_count = len(self.results['processes'])
print(f"Related Processes: {proc_count} found")
# Usage
if __name__ == "__main__":
diagnostics = GNS3Diagnostics()
diagnostics.run_all_checks()
diagnostics.generate_report()
Integración y automatización
CI/CD Integration
# GitHub Actions workflow for GNS3 testing
name: Network Testing with GNS3
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
network-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install GNS3
run: |
sudo add-apt-repository ppa:gns3/ppa
sudo apt update
sudo apt install -y gns3-server gns3-gui
sudo apt install -y qemu-kvm qemu-utils libvirt-daemon-system
- name: Start GNS3 Server
run: |
gns3server --host 0.0.0.0 --port 3080 &
sleep 10
- name: Import Test Project
run: |
# Import GNS3 project from repository
gns3 --import test-topology.gns3project
- name: Run Network Tests
run: |
python3 network_tests.py
- name: Generate Test Report
run: |
python3 generate_report.py
- name: Upload Test Results
uses: actions/upload-artifact@v2
with:
name: test-results
path: test-results/
Jenkins Pipeline
pipeline {
agent any
stages {
stage('Setup GNS3') {
steps {
script {
// Start GNS3 server
sh 'docker run -d --name gns3-server --privileged -p 3080:3080 gns3/gns3server'
// Wait for server to start
sh 'sleep 30'
}
}
}
stage('Deploy Network') {
steps {
script {
// Import and start network topology
sh 'python3 deploy_network.py'
}
}
}
stage('Run Tests') {
steps {
script {
// Execute network tests
sh 'python3 run_network_tests.py'
}
}
}
stage('Generate Report') {
steps {
script {
// Generate test report
sh 'python3 generate_test_report.py'
}
// Archive test results
archiveArtifacts artifacts: 'test-results/**/*', fingerprint: true
// Publish test results
publishTestResults testResultsPattern: 'test-results/*.xml'
}
}
}
post {
always {
// Cleanup
| sh 'docker stop gns3-server | | true' |
| sh 'docker rm gns3-server | | true' |
}
failure {
// Send notification on failure
emailext (
subject: "Network Test Failed: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "Network testing failed. Check console output for details.",
to: "${env.CHANGE_AUTHOR_EMAIL}"
)
}
}
}
REST API Integration
#!/usr/bin/env python3
import requests
import json
import time
class GNS3API:
def __init__(self, server_url="http://localhost:3080"):
"""Initialize GNS3 API client"""
self.base_url = server_url
self.session = requests.Session()
def get_projects(self):
"""Get list of projects"""
response = self.session.get(f"{self.base_url}/v2/projects")
return response.json()
def create_project(self, name, path=None):
"""Create new project"""
data = {"name": name}
if path:
data["path"] = path
response = self.session.post(f"{self.base_url}/v2/projects", json=data)
return response.json()
def get_project_nodes(self, project_id):
"""Get nodes in project"""
response = self.session.get(f"{self.base_url}/v2/projects/{project_id}/nodes")
return response.json()
def start_node(self, project_id, node_id):
"""Start a node"""
response = self.session.post(f"{self.base_url}/v2/projects/{project_id}/nodes/{node_id}/start")
return response.status_code == 200
def stop_node(self, project_id, node_id):
"""Stop a node"""
response = self.session.post(f"{self.base_url}/v2/projects/{project_id}/nodes/{node_id}/stop")
return response.status_code == 200
def get_node_status(self, project_id, node_id):
"""Get node status"""
response = self.session.get(f"{self.base_url}/v2/projects/{project_id}/nodes/{node_id}")
return response.json().get('status')
def start_all_nodes(self, project_id):
"""Start all nodes in project"""
nodes = self.get_project_nodes(project_id)
for node in nodes:
node_id = node['node_id']
print(f"Starting node: {node['name']}")
self.start_node(project_id, node_id)
time.sleep(2) # Wait between starts
def stop_all_nodes(self, project_id):
"""Stop all nodes in project"""
nodes = self.get_project_nodes(project_id)
for node in nodes:
node_id = node['node_id']
print(f"Stopping node: {node['name']}")
self.stop_node(project_id, node_id)
def wait_for_nodes_ready(self, project_id, timeout=300):
"""Wait for all nodes to be ready"""
start_time = time.time()
while time.time() - start_time < timeout:
nodes = self.get_project_nodes(project_id)
all_started = True
for node in nodes:
status = self.get_node_status(project_id, node['node_id'])
if status != 'started':
all_started = False
break
if all_started:
print("All nodes are ready")
return True
print("Waiting for nodes to start...")
time.sleep(10)
print("Timeout waiting for nodes to start")
return False
# Example usage
def automated_network_test():
"""Automated network testing workflow"""
api = GNS3API()
# Get projects
projects = api.get_projects()
print(f"Found {len(projects)} projects")
# Use first project or create new one
if projects:
project_id = projects[0]['project_id']
project_name = projects[0]['name']
else:
project = api.create_project("Automated Test Network")
project_id = project['project_id']
project_name = project['name']
print(f"Using project: {project_name}")
# Start all nodes
print("Starting all nodes...")
api.start_all_nodes(project_id)
# Wait for nodes to be ready
if api.wait_for_nodes_ready(project_id):
print("Network is ready for testing")
# Run your network tests here
# test_network_connectivity()
# test_routing_protocols()
# etc.
else:
print("Failed to start network")
# Stop all nodes
print("Stopping all nodes...")
api.stop_all_nodes(project_id)
if __name__ == "__main__":
automated_network_test()
Buenas prácticas
Project Organization
# Organize projects by purpose
/GNS3/Projects/
├── CCNA-Labs/
│ ├── Basic-Routing/
│ ├── VLAN-Configuration/
│ └── OSPF-Lab/
├── Security-Labs/
│ ├── Firewall-Configuration/
│ └── VPN-Setup/
└── Production-Testing/
├── Network-Migration/
└── Performance-Testing/
# Use descriptive naming conventions
# Project: CCNA-OSPF-Lab-v2.1
# Devices: R1-Core, R2-Distribution, SW1-Access
# Links: R1-R2-WAN, SW1-R2-LAN
Configuration Management
# Save device configurations regularly
# Router configuration backup
R1# copy running-config tftp://192.168.1.100/R1-config-backup.txt
# Automated backup script
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/gns3-configs/$DATE"
mkdir -p $BACKUP_DIR
# List of device IPs
DEVICES=("192.168.1.1" "192.168.1.2" "192.168.1.3")
for device in "${DEVICES[@]}"; do
echo "Backing up $device..."
# Use expect or similar tool for automated backup
expect backup_device.exp $device $BACKUP_DIR
done
Consideraciones de seguridad
# Secure GNS3 server access
# Bind to specific interface
gns3server --host 192.168.1.100 --port 3080
# Use authentication (if available)
# Configure in ~/.config/GNS3/2.2/gns3_server.conf
[Server]
auth = true
user = admin
password = secure_password
# Network isolation
# Use separate network segments for lab traffic
# Avoid bridging lab networks to production
Optimización del rendimiento
# Optimize device settings
# Reduce unnecessary services on routers
R1(config)# no ip http server
R1(config)# no ip http secure-server
R1(config)# no cdp run
R1(config)# no service pad
# Use efficient topologies
# Minimize unnecessary connections
# Use switches instead of hubs
# Implement proper network segmentation
# Resource allocation
# Allocate RAM based on actual needs
# Use linked clones for similar devices
# Enable hardware acceleration when available
Escritura y automatización avanzadas
Network Discovery Script
#!/usr/bin/env python3
import subprocess
import ipaddress
import concurrent.futures
import json
from datetime import datetime
class NetworkDiscovery:
def __init__(self, network_range):
"""Initialize network discovery"""
self.network = ipaddress.IPv4Network(network_range)
self.discovered_hosts = []
def ping_host(self, ip):
"""Ping individual host"""
try:
result = subprocess.run(
['ping', '-c', '1', '-W', '1', str(ip)],
capture_output=True,
text=True
)
if result.returncode == 0:
return {
'ip': str(ip),
'status': 'up',
'response_time': self._extract_ping_time(result.stdout)
}
except Exception:
pass
return None
def _extract_ping_time(self, ping_output):
"""Extract ping response time from output"""
try:
for line in ping_output.split('\n'):
if 'time=' in line:
time_part = line.split('time=')[1].split()[0]
return float(time_part)
except:
pass
return None
def discover_network(self, max_workers=50):
"""Discover all hosts in network"""
print(f"Discovering hosts in {self.network}...")
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = [executor.submit(self.ping_host, ip) for ip in self.network.hosts()]
for future in concurrent.futures.as_completed(futures):
result = future.result()
if result:
self.discovered_hosts.append(result)
print(f"Found host: {result['ip']} ({result['response_time']}ms)")
def port_scan(self, ip, ports=[22, 23, 80, 443, 3080]):
"""Scan common ports on discovered host"""
open_ports = []
for port in ports:
try:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
result = sock.connect_ex((ip, port))
sock.close()
if result == 0:
open_ports.append(port)
except:
pass
return open_ports
def detailed_scan(self):
"""Perform detailed scan on discovered hosts"""
print("Performing detailed scan...")
for host in self.discovered_hosts:
ip = host['ip']
print(f"Scanning {ip}...")
# Port scan
open_ports = self.port_scan(ip)
host['open_ports'] = open_ports
# Try to identify device type
if 23 in open_ports: # Telnet
host['device_type'] = 'network_device'
elif 3080 in open_ports: # GNS3 server
host['device_type'] = 'gns3_server'
elif 80 in open_ports or 443 in open_ports:
host['device_type'] = 'web_server'
else:
host['device_type'] = 'unknown'
def generate_report(self, filename='network_discovery.json'):
"""Generate discovery report"""
report = {
'scan_time': datetime.now().isoformat(),
'network_range': str(self.network),
'total_hosts': len(self.discovered_hosts),
'hosts': self.discovered_hosts
}
with open(filename, 'w') as f:
json.dump(report, f, indent=2)
print(f"Discovery report saved to {filename}")
return report
# Usage
if __name__ == "__main__":
# Discover GNS3 lab network
discovery = NetworkDiscovery("192.168.1.0/24")
discovery.discover_network()
discovery.detailed_scan()
report = discovery.generate_report()
print(f"\nDiscovery Summary:")
print(f"Network: {report['network_range']}")
print(f"Hosts found: {report['total_hosts']}")
for host in report['hosts']:
print(f" {host['ip']} - {host['device_type']} - Ports: {host['open_ports']}")
Controlador de Cumplimiento de Configuración
#!/usr/bin/env python3
import telnetlib
import re
import json
from datetime import datetime
class ComplianceChecker:
def __init__(self, compliance_rules):
"""Initialize with compliance rules"""
self.rules = compliance_rules
self.results = []
def connect_device(self, host, username="", password=""):
"""Connect to network device"""
try:
tn = telnetlib.Telnet(host, 23, timeout=10)
if username:
tn.read_until(b"Username:")
tn.write(username.encode() + b"\n")
tn.read_until(b"Password:")
tn.write(password.encode() + b"\n")
tn.read_until(b">")
tn.write(b"enable\n")
tn.read_until(b"#")
return tn
except Exception as e:
print(f"Failed to connect to {host}: {e}")
return None
def get_running_config(self, tn):
"""Get running configuration"""
tn.write(b"show running-config\n")
tn.write(b" ") # Space to continue
config = ""
while True:
output = tn.read_until(b"#", timeout=5).decode()
config += output
if "#" in output and "More" not in output:
break
tn.write(b" ") # Continue reading
return config
def check_rule(self, config, rule):
"""Check individual compliance rule"""
rule_type = rule['type']
pattern = rule['pattern']
description = rule['description']
severity = rule.get('severity', 'medium')
if rule_type == 'required':
# Pattern must be present
match = re.search(pattern, config, re.MULTILINE | re.IGNORECASE)
compliant = match is not None
elif rule_type == 'forbidden':
# Pattern must not be present
match = re.search(pattern, config, re.MULTILINE | re.IGNORECASE)
compliant = match is None
else:
compliant = False
return {
'rule': description,
'type': rule_type,
'pattern': pattern,
'severity': severity,
'compliant': compliant,
'match': match.group() if match else None
}
def check_device_compliance(self, host, username="", password=""):
"""Check compliance for single device"""
print(f"Checking compliance for {host}...")
tn = self.connect_device(host, username, password)
if not tn:
return None
try:
config = self.get_running_config(tn)
tn.close()
device_results = {
'host': host,
'timestamp': datetime.now().isoformat(),
'rules_checked': len(self.rules),
'compliant_rules': 0,
'non_compliant_rules': 0,
'rule_results': []
}
for rule in self.rules:
result = self.check_rule(config, rule)
device_results['rule_results'].append(result)
if result['compliant']:
device_results['compliant_rules'] += 1
else:
device_results['non_compliant_rules'] += 1
device_results['compliance_percentage'] = (
device_results['compliant_rules'] / device_results['rules_checked'] * 100
)
self.results.append(device_results)
return device_results
except Exception as e:
print(f"Error checking {host}: {e}")
tn.close()
return None
def generate_compliance_report(self, filename='compliance_report.json'):
"""Generate compliance report"""
if not self.results:
print("No compliance data to report")
return
# Calculate overall statistics
total_devices = len(self.results)
total_rules = sum(r['rules_checked'] for r in self.results)
total_compliant = sum(r['compliant_rules'] for r in self.results)
report = {
'report_time': datetime.now().isoformat(),
'summary': {
'total_devices': total_devices,
'total_rules_checked': total_rules,
'total_compliant_rules': total_compliant,
'overall_compliance_percentage': (total_compliant / total_rules * 100) if total_rules > 0 else 0
},
'device_results': self.results
}
with open(filename, 'w') as f:
json.dump(report, f, indent=2)
print(f"Compliance report saved to {filename}")
# Print summary
print(f"\nCompliance Summary:")
print(f"Devices checked: {total_devices}")
print(f"Overall compliance: {report['summary']['overall_compliance_percentage']:.1f}%")
# Show non-compliant devices
for device in self.results:
if device['compliance_percentage'] < 100:
print(f" {device['host']}: {device['compliance_percentage']:.1f}% compliant")
return report
# Example compliance rules
compliance_rules = [
{
'type': 'required',
'pattern': r'service password-encryption',
'description': 'Password encryption must be enabled',
'severity': 'high'
},
{
'type': 'required',
'pattern': r'no ip http server',
'description': 'HTTP server must be disabled',
'severity': 'medium'
},
{
'type': 'required',
'pattern': r'banner motd',
'description': 'Login banner must be configured',
'severity': 'low'
},
{
'type': 'forbidden',
'pattern': r'username.*password 0',
'description': 'Plain text passwords are forbidden',
'severity': 'high'
},
{
'type': 'required',
'pattern': r'logging \d+\.\d+\.\d+\.\d+',
'description': 'Syslog server must be configured',
'severity': 'medium'
}
]
# Usage
if __name__ == "__main__":
checker = ComplianceChecker(compliance_rules)
# Check multiple devices
devices = ["192.168.1.1", "192.168.1.2", "192.168.1.3"]
for device in devices:
checker.check_device_compliance(device)
# Generate report
checker.generate_compliance_report()
Esta amplia hoja de trampa GNS3 proporciona una amplia cobertura de simulación de red, configuración de dispositivos, automatización y flujos de trabajo de pruebas de red profesionales. Los scripts y ejemplos incluidos permiten tareas avanzadas de ingeniería de red e integración con prácticas modernas de DevOps.