Skip to content

Latest commit

History

History
749 lines (510 loc) · 25.7 KB

File metadata and controls

749 lines (510 loc) · 25.7 KB

Python Networking Libraries

Socket Library

The socket library provides low-level networking capabilities. It allows you to create sockets for communication between processes. Here's a basic example of a Python server-client communication using the socket library. The server will listen for incoming connections, and the client will connect to the server and send a message.

Server Script:

importsocket# Create a socket objectserver_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Define the host and porthost='127.0.0.1'# localhostport=12345# Bind the socket to the addressserver_socket.bind((host, port))
# Start listening for incoming connectionsserver_socket.listen(5)
print(f'Server listening on {host}:{port}...')
# Accept a connection and get the client socketclient_socket, client_address=server_socket.accept()
print(f'Connection established with {client_address}')
# Receive data from the clientdata=client_socket.recv(1024).decode('utf-8')
print(f'Received: {data}')
# Echo the received data back to the clientclient_socket.send(data.encode('utf-8'))
# Close the socketsclient_socket.close()
server_socket.close()

Client Script:

importsocket# Create a socket objectclient_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Define the host and port to connect tohost='127.0.0.1'# localhostport=12345# Connect to the serverclient_socket.connect((host, port))
# Send a message to the servermessage="Hello, server!"client_socket.send(message.encode('utf-8'))
# Receive data from the serverdata=client_socket.recv(1024).decode('utf-8')
print(f'Received from server: {data}')
# Close the socketclient_socket.close()

How to run:

  1. Save the server script in a file, e.g., server.py.
  2. Save the client script in another file, e.g., client.py.
  3. Open two terminal windows.
  4. In the first terminal, run python server.py to start the server.
  5. In the second terminal, run python client.py to start the client.

You should see output indicating that the client sends a message, the server receives it, and then echoes it back to the client.

Requests Library

The requests library in Python is a widely-used library for making HTTP requests. It simplifies the process of sending HTTP requests and handling responses. Below is an example that demonstrates how to use the requests library to make a simple HTTP GET request:

importrequests# Make a GET request to a URLresponse=requests.get('https://jsonplaceholder.typicode.com/posts/1')
# Check if the request was successful (status code 200)ifresponse.status_code==200:
# Print the response content (JSON in this case)print(response.json())
else:
# Print an error message if the request was not successfulprint(f'Error: {response.status_code}')

In this example:

  1. We import the requests module.
  2. We use requests.get() to send a GET request to the specified URL (https://jsonplaceholder.typicode.com/posts/1).
  3. We check if the response status code is 200, which indicates a successful request.
  4. If the request was successful, we print the response content, assuming it's in JSON format. If not, we print an error message along with the status code.

Keep in mind that you'll need an active internet connection to run this code since it makes a request to an external URL.

To run this code, you need to have the requests library installed. You can install it using pip:

pip install requests

The requests library is incredibly versatile and can be used for a wide range of HTTP operations, including making POST, PUT, DELETE requests, handling authentication, sessions, and much more.

Netmiko Library

Netmiko is a multi-vendor library that simplifies SSH connections to network devices and provides an easy-to-use interface for sending commands and receiving responses. It supports a wide range of network devices, including routers and switches from various vendors.

Here's an example of how to use the Netmiko library to connect to a network device and execute a command:

fromnetmikoimportConnectHandler# Define the device informationdevice= {
'device_type': 'cisco_ios',
'ip': '192.168.0.1',
'username': 'your_username',
'password': 'your_password',
'secret': 'enable_password', # Enable password if required
}
# Connect to the deviceconnection=ConnectHandler(**device)
# Enter enable mode if requiredconnection.enable()
# Send a command and get the outputcommand='show interfaces'output=connection.send_command(command)
# Print the outputprint(output)
# Disconnect from the deviceconnection.disconnect()

Explanation:

  1. Import the ConnectHandler class from netmiko.
  2. Define the device information, including the device type (e.g., cisco_ios), IP address, username, password, and enable password (if required).
  3. Use ConnectHandler(**device) to establish an SSH connection to the device.
  4. If required, use connection.enable() to enter enable mode.
  5. Use connection.send_command(command) to send a command to the device and receive the output.
  6. Print the output.
  7. Use connection.disconnect() to close the SSH connection.

Before running this code, make sure you have the Netmiko library installed. You can install it using pip:

pip install netmiko

Note that you'll need to replace 'your_username', 'your_password', and 'enable_password' with your actual login credentials. Also, ensure that you have SSH access enabled on the network device you're trying to connect to.

Keep in mind that Netmiko supports various device types, so you may need to adjust the device_type parameter depending on the type of network device you're connecting to (e.g., cisco_ios, cisco_xr, juniper_junos, etc.).

Scapy Library

Scapy is a powerful packet manipulation tool in Python that allows you to create, send, and analyze network packets. It is widely used for network testing, analysis, and penetration testing. Below are some examples demonstrating the basic usage of Scapy:

Example 1: Sending ICMP (Ping) Packet

fromscapy.allimport*# Create an ICMP packetpacket=IP(dst="www.google.com") /ICMP()
# Send the packet and receive a responseresponse=sr1(packet, timeout=2, verbose=False)
# Check if a response was receivedifresponse:
print(f"Received response from {response.src}")
else:
print("No response received")

Example 2: Sending TCP Packet

fromscapy.allimport*# Create a TCP packetpacket=IP(dst="www.example.com") /TCP(dport=80, flags="S")
# Send the packet and receive a responseresponse=sr1(packet, timeout=2, verbose=False)
# Check if a response was receivedifresponse:
print(f"Received response from {response.src}")
else:
print("No response received")

Example 3: Sniffing Packets

fromscapy.allimport*# Define a packet sniffing functiondefpacket_sniffer(packet):
print(packet.summary())
# Start sniffing packets on the networksniff(filter="icmp", prn=packet_sniffer, count=5)

Example 4: Crafting a Custom Packet

fromscapy.allimport*# Create a custom packetpacket=Ether(src="00:11:22:33:44:55", dst="66:77:88:99:00:11") / \
IP(src="192.168.1.100", dst="192.168.1.1") / \
TCP(sport=1234, dport=80)
# Send the packetsendp(packet, iface="eth0")

Example 5: Creating and Sending ARP Request

fromscapy.allimport*# Create an ARP request packetpacket=Ether(dst="ff:ff:ff:ff:ff:ff") /ARP(pdst="192.168.1.1")
# Send the ARP requestresponse=srp1(packet, timeout=2, verbose=False)
# Check if a response was receivedifresponse:
print(f"Received response from {response.psrc}")
else:
print("No response received")

Before running these examples, ensure that you have Scapy installed. You can install it using pip:

pip install scapy

Please note that some of these examples involve sending packets, which might not be appropriate or allowed in all environments. Always use caution and ensure you have appropriate permissions and legal rights to perform any network-related activities.

Twisted Library

The Twisted library is an event-driven networking framework for Python. It provides support for various protocols, including TCP, UDP, SSH, and more. Below are examples of using Twisted for a simple TCP server and client:

Example 1: Twisted TCP Server

fromtwisted.internetimportprotocol, reactorclassEchoProtocol(protocol.Protocol):
defdataReceived(self, data):
self.transport.write(data)
classEchoFactory(protocol.Factory):
defbuildProtocol(self, addr):
returnEchoProtocol()
reactor.listenTCP(12345, EchoFactory())
reactor.run()

In this example, we create a simple Echo server. It listens on port 12345 and echoes back any data it receives.

Example 2: Twisted TCP Client

fromtwisted.internetimportreactor, protocolclassEchoClient(protocol.Protocol):
defconnectionMade(self):
self.transport.write(b'Hello, server!')
defdataReceived(self, data):
print(f'Received from server: {data.decode()}')
self.transport.loseConnection()
classEchoClientFactory(protocol.ClientFactory):
defbuildProtocol(self, addr):
returnEchoClient()# Day-6 | Basic Networking Concepts### 1. **What is Networking?**Networkinginvolvesthepracticeofconnectingmultiplecomputingdevicestogetherforthepurposeofsharingresources, information, andservices. Itenablescommunicationbetweendeviceslikecomputers, servers, smartphones, andmore.
### 2. **IP Address and Subnetting**-**IPAddress**: AnIP (InternetProtocol) addressisauniqueidentifierassignedtoeachdeviceonanetwork. ItcanbeeitherIPv4 (e.g., 192.168.1.1) orIPv6 (e.g., 2001:0db8:85a3:0000:0000:8a2e:0370:7334).-**Subnetting**: SubnettinginvolvesdividinganIPnetworkintomultiplesub-networkstoimproveperformanceandsecurity. IthelpsinefficientlyutilizingIPaddresses.SubnettingistheprocessofdividinganIPnetworkintosub-networkstoimproveperformanceandsecurity. Itinvolvescreatingsmaller, moremanageablenetworksegments. Let'sgothroughanexampleofsubnettinganIPv4address.
**Example:**SupposewehavetheIPaddress`192.168.0.0`withasubnetmaskof`255.255.255.0` (or`/24`inCIDRnotation).
1.**UnderstandingtheSubnetMask:**-Thesubnetmask`255.255.255.0`meansthatthefirst24bitsarefixedfornetworkidentification, andtheremaining8bitsareavailableforhostaddresses.
-Thisprovidesuswith2^8 (256) possiblehostaddresseswithinthissubnet.
2.**DividingtheSubnet:**-Let'ssaywewanttodividethissubnetintofoursmallersubnets.
3.**DeterminingtheNewSubnetMask:**-Sincewe'redividingthesubnetinto4equalparts, weneedtoborrow2bitsfromthehostpartforthenetworkpart. Thisgivesusanewsubnetmaskof`255.255.255.192` (or`/26`inCIDRnotation).
4.**CalculatingSubnetRanges:**-Withthenewsubnetmask, eachsubnetwillhave64addresses (2^6).
-We'llhave4subnets: `192.168.0.0/26`, `192.168.0.64/26`, `192.168.0.128/26`, and`192.168.0.192/26`.
-**Subnet1 (192.168.0.0/26):**-NetworkAddress: `192.168.0.0`-UsableHostRange: `192.168.0.1 - 192.168.0.62`-BroadcastAddress: `192.168.0.63`-**Subnet2 (192.168.0.64/26):**-NetworkAddress: `192.168.0.64`-UsableHostRange: `192.168.0.65 - 192.168.0.126`-BroadcastAddress: `192.168.0.127`-**Subnet3 (192.168.0.128/26):**-NetworkAddress: `192.168.0.128`-UsableHostRange: `192.168.0.129 - 192.168.0.190`-BroadcastAddress: `192.168.0.191`-**Subnet4 (192.168.0.192/26):**-NetworkAddress: `192.168.0.192`-UsableHostRange: `192.168.0.193 - 192.168.0.254`-BroadcastAddress: `192.168.0.255`-**Note:**Thefirstaddressineachsubnetisreservedforthenetworkaddress, andthelastaddressisreservedforthebroadcastaddress.
Thisisabasicexampleofsubnetting. Inpractice, subnettingbecomesmorecomplexwhendealingwithdifferentsubnetmasks, VLSM (VariableLengthSubnetMasking), androutingbetweensubnets. Understandingsubnettingisessentialfornetworkadministratorsandengineers.
### 3. **MAC Address**-AMAC (MediaAccessControl) addressisahardwareaddressassignedtoanetworkinterfacecard. It'suniquetoeachdeviceandisusedforcommunicationwithinalocalnetwork.
### 4. **Protocols**-**TCP/IP**: TransmissionControlProtocol/InternetProtocolisthesuiteofcommunicationprotocolsusedforconnectinghostsontheinternet. ItincludesprotocolslikeTCP (TransmissionControlProtocol) andIP (InternetProtocol).
-**HTTP/HTTPS**: HyperTextTransferProtocol (HTTP) andSecureHTTP (HTTPS) areprotocolsusedfortransferringdataovertheinternet. HTTPSissecuredusingSSL/TLSencryption.
-**FTP/SFTP**: FileTransferProtocol (FTP) andSecureFileTransferProtocol (SFTP) areusedfortransferringfilesoveranetwork.
-**SMTP/POP3/IMAP**: SimpleMailTransferProtocol (SMTP) isusedforsendingemails, whilePOP3 (PostOfficeProtocolversion3) andIMAP (InternetMessageAccessProtocol) areusedforreceivingemails.
### 5. **Ports**-Portsarevirtualendpointsusedforcommunicationbetweendifferentprocessesonanetwork. Theyallowasingledevicetohostmultipleservices.
-**Well-knownPorts**: Portsrangingfrom0to1023arereservedforwell-knownserviceslikeHTTP (80), HTTPS (443), FTP (21), etc.
### 6. **Firewalls and Routers**-**Firewall**: Afirewallisasecuritydevicethatfiltersincomingandoutgoingnetworktrafficbasedonadefinedsetofsecurityrules. Ithelpsprotectanetworkfromunauthorizedaccess.
-**Router**: Arouterisanetworkingdevicethatforwardsdatapacketsbetweencomputernetworks. Itactsasacentralhubfordatatrafficinanetwork.
### 7. **DNS (Domain Name System)**-DNStranslateshuman-readabledomainnames (e.g., www.example.com) intoIPaddressesthatareusedbynetworkdevicestolocateeachotherontheinternet.
### 8. **OSI Model**-TheOSI (OpenSystemsInterconnection) modelisaconceptualframeworkusedtounderstandnetworkinteractions. It'sdividedintosevenlayers, eachresponsiblefordifferentfunctionsinthecommunicationprocess.
1.PhysicalLayer2.DataLinkLayer3.NetworkLayer4.TransportLayer5.SessionLayer6.PresentationLayer7.ApplicationLayerThesearesomefundamentalnetworkingconceptsandprotocolsthatformthebasisofunderstandinghowdataistransmittedandreceivedovernetworks. It'sessentialforanyoneworkingwithnetworkedsystemsorservices.
## Python Networking Libraries### Socket LibraryThesocketlibraryprovideslow-levelnetworkingcapabilities. Itallowsyoutocreatesocketsforcommunicationbetweenprocesses. Here'sabasicexampleofaPythonserver-clientcommunicationusingthe`socket`library. Theserverwilllistenforincomingconnections, andtheclientwillconnecttotheserverandsendamessage.
**ServerScript:**```pythonimportsocket# Create a socket objectserver_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Define the host and porthost='127.0.0.1'# localhostport=12345# Bind the socket to the addressserver_socket.bind((host, port))
# Start listening for incoming connectionsserver_socket.listen(5)
print(f'Server listening on {host}:{port}...')
# Accept a connection and get the client socketclient_socket, client_address=server_socket.accept()
print(f'Connection established with {client_address}')
# Receive data from the clientdata=client_socket.recv(1024).decode('utf-8')
print(f'Received: {data}')
# Echo the received data back to the clientclient_socket.send(data.encode('utf-8'))
# Close the socketsclient_socket.close()
server_socket.close()

Client Script:

importsocket# Create a socket objectclient_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Define the host and port to connect tohost='127.0.0.1'# localhostport=12345# Connect to the serverclient_socket.connect((host, port))
# Send a message to the servermessage="Hello, server!"client_socket.send(message.encode('utf-8'))
# Receive data from the serverdata=client_socket.recv(1024).decode('utf-8')
print(f'Received from server: {data}')
# Close the socketclient_socket.close()

How to run:

  1. Save the server script in a file, e.g., server.py.
  2. Save the client script in another file, e.g., client.py.
  3. Open two terminal windows.
  4. In the first terminal, run python server.py to start the server.
  5. In the second terminal, run python client.py to start the client.

You should see output indicating that the client sends a message, the server receives it, and then echoes it back to the client.

Requests Library

The requests library in Python is a widely-used library for making HTTP requests. It simplifies the process of sending HTTP requests and handling responses. Below is an example that demonstrates how to use the requests library to make a simple HTTP GET request:

importrequests# Make a GET request to a URLresponse=requests.get('https://jsonplaceholder.typicode.com/posts/1')
# Check if the request was successful (status code 200)ifresponse.status_code==200:
# Print the response content (JSON in this case)print(response.json())
else:
# Print an error message if the request was not successfulprint(f'Error: {response.status_code}')

In this example:

  1. We import the requests module.
  2. We use requests.get() to send a GET request to the specified URL (https://jsonplaceholder.typicode.com/posts/1).
  3. We check if the response status code is 200, which indicates a successful request.
  4. If the request was successful, we print the response content, assuming it's in JSON format. If not, we print an error message along with the status code.

Keep in mind that you'll need an active internet connection to run this code since it makes a request to an external URL.

To run this code, you need to have the requests library installed. You can install it using pip:

pip install requests

The requests library is incredibly versatile and can be used for a wide range of HTTP operations, including making POST, PUT, DELETE requests, handling authentication, sessions, and much more.

Netmiko Library

Netmiko is a multi-vendor library that simplifies SSH connections to network devices and provides an easy-to-use interface for sending commands and receiving responses. It supports a wide range of network devices, including routers and switches from various vendors.

Here's an example of how to use the Netmiko library to connect to a network device and execute a command:

fromnetmikoimportConnectHandler# Define the device informationdevice= {
'device_type': 'cisco_ios',
'ip': '192.168.0.1',
'username': 'your_username',
'password': 'your_password',
'secret': 'enable_password', # Enable password if required
}
# Connect to the deviceconnection=ConnectHandler(**device)
# Enter enable mode if requiredconnection.enable()
# Send a command and get the outputcommand='show interfaces'output=connection.send_command(command)
# Print the outputprint(output)
# Disconnect from the deviceconnection.disconnect()

Explanation:

  1. Import the ConnectHandler class from netmiko.
  2. Define the device information, including the device type (e.g., cisco_ios), IP address, username, password, and enable password (if required).
  3. Use ConnectHandler(**device) to establish an SSH connection to the device.
  4. If required, use connection.enable() to enter enable mode.
  5. Use connection.send_command(command) to send a command to the device and receive the output.
  6. Print the output.
  7. Use connection.disconnect() to close the SSH connection.

Before running this code, make sure you have the Netmiko library installed. You can install it using pip:

pip install netmiko

Note that you'll need to replace 'your_username', 'your_password', and 'enable_password' with your actual login credentials. Also, ensure that you have SSH access enabled on the network device you're trying to connect to.

Keep in mind that Netmiko supports various device types, so you may need to adjust the device_type parameter depending on the type of network device you're connecting to (e.g., cisco_ios, cisco_xr, juniper_junos, etc.).

Scapy Library

Scapy is a powerful packet manipulation tool in Python that allows you to create, send, and analyze network packets. It is widely used for network testing, analysis, and penetration testing. Below are some examples demonstrating the basic usage of Scapy:

Example 1: Sending ICMP (Ping) Packet

fromscapy.allimport*# Create an ICMP packetpacket=IP(dst="www.google.com") /ICMP()
# Send the packet and receive a responseresponse=sr1(packet, timeout=2, verbose=False)
# Check if a response was receivedifresponse:
print(f"Received response from {response.src}")
else:
print("No response received")

Example 2: Sending TCP Packet

fromscapy.allimport*# Create a TCP packetpacket=IP(dst="www.example.com") /TCP(dport=80, flags="S")
# Send the packet and receive a responseresponse=sr1(packet, timeout=2, verbose=False)
# Check if a response was receivedifresponse:
print(f"Received response from {response.src}")
else:
print("No response received")

Example 3: Sniffing Packets

fromscapy.allimport*# Define a packet sniffing functiondefpacket_sniffer(packet):
print(packet.summary())
# Start sniffing packets on the networksniff(filter="icmp", prn=packet_sniffer, count=5)

Example 4: Crafting a Custom Packet

fromscapy.allimport*# Create a custom packetpacket=Ether(src="00:11:22:33:44:55", dst="66:77:88:99:00:11") / \
IP(src="192.168.1.100", dst="192.168.1.1") / \
TCP(sport=1234, dport=80)
# Send the packetsendp(packet, iface="eth0")

Example 5: Creating and Sending ARP Request

fromscapy.allimport*# Create an ARP request packetpacket=Ether(dst="ff:ff:ff:ff:ff:ff") /ARP(pdst="192.168.1.1")
# Send the ARP requestresponse=srp1(packet, timeout=2, verbose=False)
# Check if a response was receivedifresponse:
print(f"Received response from {response.psrc}")
else:
print("No response received")

Before running these examples, ensure that you have Scapy installed. You can install it using pip:

pip install scapy

Please note that some of these examples involve sending packets, which might not be appropriate or allowed in all environments. Always use caution and ensure you have appropriate permissions and legal rights to perform any network-related activities.

Twisted Library

The Twisted library is an event-driven networking framework for Python. It provides support for various protocols, including TCP, UDP, SSH, and more. Below are examples of using Twisted for a simple TCP server and client:

Example 1: Twisted TCP Server

fromtwisted.internetimportprotocol, reactorclassEchoProtocol(protocol.Protocol):
defdataReceived(self, data):
self.transport.write(data)
classEchoFactory(protocol.Factory):
defbuildProtocol(self, addr):
returnEchoProtocol()
reactor.listenTCP(12345, EchoFactory())
reactor.run()

In this example, we create a simple Echo server. It listens on port 12345 and echoes back any data it receives.

Example 2: Twisted TCP Client

fromtwisted.internetimportreactor, protocolclassEchoClient(protocol.Protocol):
defconnectionMade(self):
self.transport.write(b'Hello, server!')
defdataReceived(self, data):
print(f'Received from server: {data.decode()}')
self.transport.loseConnection()
classEchoClientFactory(protocol.ClientFactory):
defbuildProtocol(self, addr):
returnEchoClient()
defclientConnectionFailed(self, connector, reason):
print(f'Connection failed: {reason.getErrorMessage()}')
reactor.stop()
defclientConnectionLost(self, connector, reason):
print(f'Connection lost: {reason.getErrorMessage()}')
reactor.stop()
connector=reactor.connectTCP('127.0.0.1', 12345, EchoClientFactory())
reactor.run()

In this example, we create a client that connects to a TCP server running on 127.0.0.1:12345. It sends a message to the server and waits for a response.

Before running these examples, ensure that you have Twisted installed. You can install it using pip:

pip install twisted

These examples showcase a simple echo server and client. Twisted is capable of handling much more complex networking tasks, including protocols like HTTP, SMTP, IMAP, and more. It's a versatile library for building networked applications in Python.

def clientConnectionFailed(self, connector, reason):
print(f'Connection failed: {reason.getErrorMessage()}')
reactor.stop()
def clientConnectionLost(self, connector, reason):
print(f'Connection lost: {reason.getErrorMessage()}')
reactor.stop()

connector = reactor.connectTCP('127.0.0.1', 12345, EchoClientFactory()) reactor.run()


In this example, we create a client that connects to a TCP server running on `127.0.0.1:12345`. It sends a message to the server and waits for a response.
Before running these examples, ensure that you have Twisted installed. You can install it using `pip`:
```bash
pip install twisted

These examples showcase a simple echo server and client. Twisted is capable of handling much more complex networking tasks, including protocols like HTTP, SMTP, IMAP, and more. It's a versatile library for building networked applications in Python.