Сеть в Python

Содержание
Введение
Пример
Сканирование сети
Firewall
Похожие статьи

Введение

Подготовка окружения

python -m venv venv
venv\Scripts\activate
python -m pip install python-nmap

Collecting python-nmap Downloading python-nmap-0.7.1.tar.gz (44 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Building wheels for collected packages: python-nmap Building wheel for python-nmap (pyproject.toml) ... done Created wheel for python-nmap: filename=python_nmap-0.7.1-py2.py3-none-any.whl size=20727 sha256=b2b22d6f71dada49af5dffa862673be856378271dba03c2b16573ecddd095cd3 Stored in directory: c:\users\fil41089w-avo031\appdata\local\pip\cache\wheels\06\fc\d4\0957e1d9942e696188208772ea0abf909fe6eb3d9dff6e5a9e Successfully built python-nmap Installing collected packages: python-nmap Successfully installed python-nmap-0.7.1

python -m pip install telnetlib3

Collecting telnetlib3 Downloading telnetlib3-2.0.8-py2.py3-none-any.whl.metadata (12 kB) Downloading telnetlib3-2.0.8-py2.py3-none-any.whl (109 kB) Installing collected packages: telnetlib3 Successfully installed telnetlib3-2.0.8

РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе

Конец рекламы. Если там пусто считайте это рекламой моей телеги

Сканирование сети

В первом примере мы воспользуемся Python обёрткой вокруг nmap

# networktest-1.py import nmap # Замените 127.0.0.1 на нужный IP адрес target_ip = "127.0.0.1" nm = nmap.PortScanner() print("Perform default port scan") nm.scan(target_ip) print(nm.scaninfo())

python3 networktest-1.py

python3 networktest-1.py Perform default port scan {'tcp': {'method': 'connect', 'services': '1,3-4,6-7,9,13,17,19-26,30,32-33,37,42-43,49,53,70,79-85,88-90,99-100,106,109-111,113,119,125,135,139,143-144,146,161,163,179,199,211-212,222,254-256,259,264,280,301,306,311,340,366,389,406-407,416-417,425,427,443-445,458,464-465,481,497,500,512-515,524,541,543-545,548,554-555,563,587,593,616-617,625,631,636,646,648,666-668,683,687,691,700,705,711,714,720,722,726,749,765,777,783,787,800-801,808,843,873,880,888,898,900-903,911-912,981,987,990,992-993,995,999-1002,1007,1009-1011,1021-1100,1102,1104-1108,1110-1114,1117,1119,1121-1124,1126,1130-1132,1137-1138,1141,1145,1147-1149,1151-1152,1154,1163-1166,1169,1174-1175,1183,1185-1187,1192,1198-1199,1201,1213,1216-1218,1233-1234,1236,1244,1247-1248,1259,1271-1272,1277,1287,1296,1300-1301,1309-1311,1322,1328,1334,1352,1417,1433-1434,1443,1455,1461,1494,1500-1501,1503,1521,1524,1533,1556,1580,1583,1594,1600,1641,1658,1666,1687-1688,1700,1717-1721,1723,1755,1761,1782-1783,1801,1805,1812,1839-1840,1862-1864,1875,1900,1914,1935,1947,1971-1972,1974,1984,1998-2010,2013,2020-2022,2030,2033-2035,2038,2040-2043,2045-2049,2065,2068,2099-2100,2103,2105-2107,2111,2119,2121,2126,2135,2144,2160-2161,2170,2179,2190-2191,2196,2200,2222,2251,2260,2288,2301,2323,2366,2381-2383,2393-2394,2399,2401,2492,2500,2522,2525,2557,2601-2602,2604-2605,2607-2608,2638,2701-2702,2710,2717-2718,2725,2800,2809,2811,2869,2875,2909-2910,2920,2967-2968,2998,3000-3001,3003,3005-3007,3011,3013,3017,3030-3031,3052,3071,3077,3128,3168,3211,3221,3260-3261,3268-3269,3283,3300-3301,3306,3322-3325,3333,3351,3367,3369-3372,3389-3390,3404,3476,3493,3517,3527,3546,3551,3580,3659,3689-3690,3703,3737,3766,3784,3800-3801,3809,3814,3826-3828,3851,3869,3871,3878,3880,3889,3905,3914,3918,3920,3945,3971,3986,3995,3998,4000-4006,4045,4111,4125-4126,4129,4224,4242,4279,4321,4343,4443-4446,4449,4550,4567,4662,4848,4899-4900,4998,5000-5004,5009,5030,5033,5050-5051,5054,5060-5061,5080,5087,5100-5102,5120,5190,5200,5214,5221-5222,5225-5226,5269,5280,5298,5357,5405,5414,5431-5432,5440,5500,5510,5544,5550,5555,5560,5566,5631,5633,5666,5678-5679,5718,5730,5800-5802,5810-5811,5815,5822,5825,5850,5859,5862,5877,5900-5904,5906-5907,5910-5911,5915,5922,5925,5950,5952,5959-5963,5987-5989,5998-6007,6009,6025,6059,6100-6101,6106,6112,6123,6129,6156,6346,6389,6502,6510,6543,6547,6565-6567,6580,6646,6666-6669,6689,6692,6699,6779,6788-6789,6792,6839,6881,6901,6969,7000-7002,7004,7007,7019,7025,7070,7100,7103,7106,7200-7201,7402,7435,7443,7496,7512,7625,7627,7676,7741,7777-7778,7800,7911,7920-7921,7937-7938,7999-8002,8007-8011,8021-8022,8031,8042,8045,8080-8090,8093,8099-8100,8180-8181,8192-8194,8200,8222,8254,8290-8292,8300,8333,8383,8400,8402,8443,8500,8600,8649,8651-8652,8654,8701,8800,8873,8888,8899,8994,9000-9003,9009-9011,9040,9050,9071,9080-9081,9090-9091,9099-9103,9110-9111,9200,9207,9220,9290,9415,9418,9485,9500,9502-9503,9535,9575,9593-9595,9618,9666,9876-9878,9898,9900,9917,9929,9943-9944,9968,9998-10004,10009-10010,10012,10024-10025,10082,10180,10215,10243,10566,10616-10617,10621,10626,10628-10629,10778,11110-11111,11967,12000,12174,12265,12345,13456,13722,13782-13783,14000,14238,14441-14442,15000,15002-15004,15660,15742,16000-16001,16012,16016,16018,16080,16113,16992-16993,17877,17988,18040,18101,18988,19101,19283,19315,19350,19780,19801,19842,20000,20005,20031,20221-20222,20828,21571,22939,23502,24444,24800,25734-25735,26214,27000,27352-27353,27355-27356,27715,28201,30000,30718,30951,31038,31337,32768-32785,33354,33899,34571-34573,35500,38292,40193,40911,41511,42510,44176,44442-44443,44501,45100,48080,49152-49161,49163,49165,49167,49175-49176,49400,49999-50003,50006,50300,50389,50500,50636,50800,51103,51493,52673,52822,52848,52869,54045,54328,55055-55056,55555,55600,56737-56738,57294,57797,58080,60020,60443,61532,61900,62078,63331,64623,64680,65000,65129,65389'}}

Наличие такого числа открытых портов в начале диапазона наталкивает на мысль, что скан не совсем точен. Всегда полезно проводить сканирование разными способами, чтобы было с чем сравнить результат.

Во втором примере мы выполним команду nmap непосредственно - с помощью subprocess

# networktest-2.py import subprocess # Замените 127.0.0.1 на нужный IP адрес target_ip = "127.0.0.1" print('Perform custom port scan') # reference command: sudo nmap -sS -v -v -Pn 127.0.0.1 nmapprocess = subprocess.Popen(['sudo','nmap','-sS','-v','-v','-Pn', target_ip]) print(str(nmapprocess.stdout))

Здесь мы применям опцию -sS - так называемый Stealth Scan и опцию -Pn - Disable Ping

python3 networktest-2.py

Perform custom port scan None andrei@ip-172-31-24-40:~$ Starting Nmap 7.80 ( https://nmap.org ) at 2026-04-11 21:22 UTC Initiating ARP Ping Scan at 08:43 Scanning 172.31.24.10 [1 port] Completed ARP Ping Scan at 08:43, 0.01s elapsed (1 total hosts) Initiating Parallel DNS resolution of 1 host. at 08:43 Completed Parallel DNS resolution of 1 host. at 08:43, 0.00s elapsed Initiating SYN Stealth Scan at 08:43 Scanning ip-172-31-24-10.ec2.internal (172.31.24.10) [1000 ports] Discovered open port 143/tcp on 172.31.24.10 Discovered open port 25/tcp on 172.31.24.10 Discovered open port 995/tcp on 172.31.24.10 Discovered open port 3389/tcp on 172.31.24.10 Discovered open port 21/tcp on 172.31.24.10 Discovered open port 993/tcp on 172.31.24.10 Discovered open port 110/tcp on 172.31.24.10 Discovered open port 22/tcp on 172.31.24.10 Completed SYN Stealth Scan at 08:43, 0.02s elapsed (1000 total ports) Nmap scan report for ip-172-31-24-10.ec2.internal (172.31.24.10) Host is up, received arp-response (0.00034s latency). Scanned at 2025-12-22 08:43:58 UTC for 0s Not shown: 992 closed ports Reason: 992 resets PORT STATE SERVICE REASON 21/tcp open ftp syn-ack ttl 64 22/tcp open ssh syn-ack ttl 64 25/tcp open smtp syn-ack ttl 64 110/tcp open pop3 syn-ack ttl 64 143/tcp open imap syn-ack ttl 64 993/tcp open imaps syn-ack ttl 64 995/tcp open pop3s syn-ack ttl 64 3389/tcp open ms-wbt-server syn-ack ttl 64 MAC Address: 02:87:85:0C:E2:ED (Unknown) Read data files from: /usr/bin/../share/nmap Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds Raw packets sent: 1001 (44.028KB) | Rcvd: 1001 (40.060KB)

ttl 64 - время жизни (Time To Live) равное 64 это косвенный показатель того, что сканируемый хост это Linux

Следующий скипт выполнит пинг двух хостов. Каждый хост будет пропинговат три раза.

# networktest-3.py import subprocess # Замените 127.0.0.1 на нужный IP адрес target1_ip = "127.0.0.1" target2_ip = "127.0.0.1" print('Perform regular ping, 3 times') pingprocess1 = subprocess.Popen(['ping','-c','3', target1_ip]) print(str(pingprocess1.stdout)) pingprocess2 = subprocess.Popen(['ping','-c','3', target2_ip]) print(str(pingprocess2.stdout))

python3 networktest-3.py

Perform regular ping, 3 times None None

После того как был получен список открытых портов - попробуем повзаимодействовать с ним с помощью

# networktest-4.py from telnetlib import Telnet # Замените 127.0.0.1 на нужный IP адрес target_ip = "127.0.0.1" target_port = 110 # Test a service is running with Telnet(target_ip, target_port) as tn: tn.interact()

python3 networktest-4.py

+OK Dovecot (Ubuntu) ready.

Из полученного заголовка можно предположить что на хосте используется IMAP сервер Dovecot

В Python 3.12 вы получите предупреждение о том, что библеотека Telnet является устаревшей и будет удалена в Python 3.13. Из чего можно сделать вывод о том, что в Python 3.13 и выше этот код работать не будет.

DeprecationWarning: 'telnetlib' is deprecated and slated for removal in Python 3.13

В качестве альтернативы можно попробовать telnetlib3

# networktest-4.py import asyncio import telnetlib3 async def main(): target_ip = "127.0.0.1" target_port = 110 # Open a Telnet connection reader, writer = await telnetlib3.open_connection( host=target_ip, port=target_port, connect_minwait=0.1, connect_maxwait=1.0, ) # Equivalent to tn.interact(): pass stdin/stdout through await telnetlib3.interact(reader, writer) writer.close() await writer.wait_closed() asyncio.run(main())

Правила Firewall

# firewallaudit-1.py import subprocess print('Perform Linux firewall audit') fwprocess = subprocess.run(['sudo','ufw','status'], stdout=subprocess.PIPE) results = str(fwprocess.stdout) # Check port compliance with company policy bannedports = ['20','21','80','110','4444'] for item in bannedports: if item in results: print("port "+item+" found, not permitted by the company") # Check for IPv6, company does not use this protocol if "(v6)" in results: print("IPv6 rules identified, recommend remove IPv6 network") # Count rules denyrulescount = results.count('DENY') if denyrulescount == 0: print("No DENY rules found!!!") else: print(denyrulescount+" DENY rules found for review") print("{rules} Anywhere rules identified for review".format(rules=results.count("Anywhere")))

Perform Linux firewall audit port 20 found, not permitted by the company port 21 found, not permitted by the company port 80 found, not permitted by the company port 110 found, not permitted by the company IPv6 rules identified, recommend remove IPv6 network No DENY rules found!!! 20 Anywhere rules identified for review

Проверка на запрещённый трафик

# firewallaudit-2.py import subprocess print('Perform Windows firewall audit') fwprocess = subprocess.run(['powershell','Show-NetFirewallRule'], stdout=subprocess.PIPE) results = str(fwprocess.stdout) bannedapps = ['FTP'] for item in bannedapps: if item in results: print("Application " + item + " found, not permitted by the company")

python firewallaudit-2.py

Perform Windows firewall audit Application FTP found, not permitted by the company

Автор статьи: Андрей Олегович

Похожие статьи
Сокеты
Paramiko
Paramiko Ошибки
Сокеты в Си

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: