Задать вопрос
Color
@Color
Golang SWE, Cloud & DevOps

Ошибка «Operation not permitted» — почему?

Принимаю от клиента пакет с SYN-запросом на установление TCP сессии. Отвечаю пакетом SYN-ACK. При отправке через socket.sendto(string, address), где string - это IP и TCP заголовки. Реализовано через raw sockets на Python. Соединение происходит так:
host = "127.0.0.1"
port = 8000
act_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
act_socket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
act_socket.bind((host, port))


Вот что мне приходит:
IP header
  |-Version 		: 4
  |-IP Header Length 	: 5
  |-Type of Service 	: 0
  |-Identification 	: 9161
  |-TTL 		: 64
  |-Offset 		: 16384
  |-Protocol		: 6
  |-IP Chechsum		: 6385
  |-Source Address	: 127.0.0.1
  |-Dest. Address	: 127.0.0.1

TCP header
  |-Source Port		: 35509
  |-Dest Port		: 8000
  |-Sequence Number	: 4150096415
  |-Acknowledgement	: 0
  |-TCP header length	: 10
  |-TCP flag 		: 2
  |-Window 		: 43690
  |-Checksum 		: 65072
  |-Urgent Pointer 	: 0


Вот что я отправляю:
IP header
  |-Version 		: 4
  |-IP Header Length 	: 5
  |-Type of Service 	: 0
  |-Identification 	: 9161
  |-TTL			: 64
  |-Offset 		: 16384
  |-Protocol 		: 6
  |-IP Chechsum 	: 0
  |-Source Address 	: 127.0.0.1
  |-Dest. Address 	: 127.0.0.1

TCP header
  |-Source Port		: 8000
  |-Dest Port 		: 35509
  |-Sequence Number	: 4150096416
  |-Acknowledgement	: 0
  |-TCP header length	: 10
  |-TCP flag 		: 12
  |-Window 		: 43690
  |-Checksum 		: 0
  |-Urgent Pointer 	: 0


Насколько я читал (здесь, например), ядро Linux автоматически считает чексуммы для IP и TCP заголовков.

В итоге получаю ошибку:
sock.sendto(new_packet, addr)
socket.error: [Errno 1] Operation not permitted


В чем я ошибаюсь?
  • Вопрос задан
  • 9361 просмотр
Подписаться 5 Оценить Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Принимаю от клиента пакет с SYN-запросом на установление TCP сессии. Отвечаю пакетом SYN-ACK

|-Source Port : 35509
|-Dest Port : 8000
|-Sequence Number : 4150096415
|-Acknowledgement : 0

|-Source Port : 8000
|-Dest Port : 35509
|-Sequence Number : 4150096416
|-Acknowledgement : 0

Это не ответ на предыдущий запрос, в ответе Acknowledgement должен подтверждать Sequence Number от запроса + SYN, а Sequence Number должен бы быть случайным.

Вот что я отправляю:

IP header
|-Identification : 9161

Я бы на вашем месте это поле заполнять не стал, и уж точно не стал бы его копировать из пришедшего IP-пакета.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Возьмите wireshark или tcpdump, сделайте dump пакетов при установлении соединения и сравните с вашими пакетами (их бинарный вид получить вы тоже сможете). А вообще ошибка "Operation not permitted", как я понимаю соответствует коду EPERM, может вам фаервол мешает?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы