Домой / Операционные системы / Windows / Доступ к Windows RDP по E-mail

Доступ к Windows RDP по E-mail

Сразу оговоримся: с программированием не знаком и не считаю себя скриптером или кодером. То, что будет описано в данной заметке успешно работает на моем сервере 1С уже в течении 2х месяцев. Проблем в работе не наблюдалось.

Из-за самоизоляции большей части бухгалтеров пришлось работать удаленно. Самым быстрым решением был проброс RDP наружу. Что бы в тот же час сервер не начали ломать, был изменен внешний порт, установлены правила на маршрутизаторе от подбора портов и зафильтрован порт RDP на самом сервере. После нескольких часов работы стало понятно, что вручную вносить IP адреса в брандмауэр не выход. Самым подходящим способом оказалась корпоративная почта. Логика должна заключаться в том, что бы пользователь отправлял свой внешний IP адрес (который предварительно посмотрит на 2ip.ru) в теме письма на определенный адрес, после чего скрипт будет его смотреть и обрабатывать.

Корпоративная почта располагается на сервисе ЯндексКоннект. Для начала создал ящик 1с@example.com и в нем папку access. Правилами обработки входящей почты указал, что бы письма от сотрудников которым разрешен доступ перемещались в папку access. Не лишним будет сделать автоответ: «Ваш IP адрес добавлен в белый список. Подождите 5 минут до применения правил». Для всех остальных письма будут приходить в папку входящие, которую скрипт обрабатывать не будет.

Теперь создаем папку scripts, и в нее кладем файл mail.py с данным содержанием (используется Pyhon 3.7×64):

import imaplib
import email
from email.header import Header, decode_header, make_header
from email.message import EmailMessage
from email.utils import parsedate
import re
import ipaddress
import os

#подключение к серверу
imap = imaplib.IMAP4_SSL('imap.yandex.ru')
imap.login('1с@example.com', 'PASSWORD')

#выбор каталога
imap.select('access')

#просмотр непрочитанных (u-unread)
r, d = imap.search(None, '(UNSEEN)')
c = str(d)
carray = []
regex = r"\d{1,4}|10000$"
matches = re.finditer(regex, c, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
carray.extend ("{match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
i = len(carray)
ii=0

def check_ip(ip):
try:
ipaddress.ip_address(ip)
except ValueError:
return 0
else:
return 1

while ii < i:
result, data = imap.search(None, '(UNSEEN)')
ids = data[0] # Получаем сроку номеров писем
id_list = ids.split() # Разделяем ID писем
latest_email_id = id_list[-1] # Берем последний ID
result, data = imap.fetch(latest_email_id, "(RFC822)") # Получаем тело письма (RFC822) для данного ID
raw_email = data[0][1] # Тело письма в необработанном виде
email_message = email.message_from_bytes(raw_email)
efrom = make_header(decode_header(email_message['From']))
esubject = make_header(decode_header(email_message['Subject']))
sesubject = str(esubject)
edate = email_message['Date']
ipv = check_ip(str(esubject))
f = open('log.txt', 'a')
f.write(edate)
f.write(' ')
f.write(str(efrom))
f.write(' IP:')
f.write(str(esubject))
f.write(' ')
f.close()
print('Log1 updated')
if ipv == 1:
f = open('access.txt', 'a')
f.write(sesubject)
f.write(',')
f.close()
print('Access list updated')
else:
f = open('log.txt', 'a')
f.write('WARNONG INVALID IP:')
f.write(sesubject)
f.close()
print('Log2 updated')
f = open('log.txt', 'a')
f.write('\n')
f.close()

ii = ii+1
if ii == i:
break

f = open('access.txt', 'r')
ipslist = f.read().split(",")
f.close()
ips = (','.join(ipslist))
ips = str(ips)
os.system('netsh advfirewall firewall set rule name="Дистанционное управление рабочим столом (TCP - входящий)" new remoteip='+str(ips))

Для корректного работы скрипта требуется:

  1. Заменить имя почтового ящика (1с@example.com) и пароль (PASSWORD) на ваши.
  2. Заменить имя RDP доступа на ваше. У меня указано для Windows 7 ( Дистанционное управление рабочим столом (TCP — входящий) )
  3. Создать файл access.txt и log.txt
  4. В access.txt заранее через запятую внести IP адреса с которых должен быть доступ (как правило это внутренние подсети и ip администратора)
  5. Наконец создать файл start.cmd с содержанием:
cd C:\scripts\
mail.py

После чего дергайте скрипт через планировщик каждые 5 минут.

Проверьте также

Установка Xpenology DSM 6.x на ПК

В день рождения подарили мне 2 диска WD Red 4TB. Пролежав несколько месяцев без дела …

2 комментария

  1. Андрей

    голь на выдумки хитра.
    А просто vpn сервер сделать? там 10 кликов.

    • У нас очень ограничен интернет-канал. Если «по быстрому» развернуть VPN, то весь трафик пойдет через наш маршрутизатор. К каждому заходить на ПК и прописывать маршрут не вариант. Использовать RIP, тоже требует некоторых действий на клиентской стороне. OpenVPN и push rote готовить не умею, т.к. не признаю OpenVPN адекватным решением. Да и для него клиенты все равно должны поставить на ПК софтину, а права администратора есть не у всех.

      В данный момент все работают на L2TP+IPsec+RIP и горя не знают.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *