Назад | Перейти на главную страницу

Ограничение прослушивания NetCat определенной сети

Я хотел бы получить вашу помощь, чтобы выяснить, как использовать NetCat для прослушивания определенного порта, принимающего соединение только от хостов в определенной сети. У меня есть сервер, на котором я хотел бы поделиться файлом с группой клиентов, используя только NetCat (или любой другой инструмент).

Спасибо.

Я понял, как это сделать, используя версию netcat от RedHat, используя командную строку ниже:

nc -l --allow "IP-адреса" -p "номер порта"

Пример:

nc -l --allow 192.168.0.10,192.168.0.15 -p 8080

Любой другой IP-адрес, который пытается подключиться, будет отклонен.

Если вы установили netcat-openbsd вместо netcat-Traditional (эти конкретные имена взяты из Debian), вы можете прослушивать определенный адрес:

nc -l 192.168.5.6 9999

Но это не проверяет исходный адрес, чтобы предотвратить доступ к нему других сетей. Он просто ограничивает, какой локальный адрес подходит для ограничения интерфейса, но не адрес источника.

Чтобы ограничить адрес источника, вам нужно будет использовать что-то еще, например iptables. Или правила в конфигурации веб-сервера (например, apache, nginx, lighttpd).

Или программу на питоне. Вот простой пример Python, который я написал для кого-то некоторое время назад, модифицированный для проверки адреса клиента и отправки файла (без кеширования):

#!/usr/bin/env python3
#
# Just a skeleton tcp server that accepts infinite connections and ignores all data

import socketserver

listen_address = "localhost"
port = 9999

def log(message):
    print("%s" % (message))

class ListenerHandler(socketserver.BaseRequestHandler):
    # For handling input
    def handle(self):
        print("handling client %s" % (str(self.client_address)))

        if self.client_address[0] == "127.0.0.1":
            print("ok")

            with open("somefile", "rb") as f:
                while True:
                    data = f.read(1024)
                    if not data:
                        break
                    self.request.send(data)

        else:
            print("rejected")


class ListenerServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

def run_server():
    socketserver.ThreadingMixIn.allow_reuse_address = True
    socketserver.TCPServer.allow_reuse_address = True

    server = None
    try:
        server = ListenerServer((listen_address, port), ListenerHandler)
        log("Starting server... hit ctrl+c to exit")
        server.serve_forever()
    except KeyboardInterrupt as e:
        log("Stopping server...")
        server.shutdown()
        exit(0)

if __name__ == "__main__":
    run_server()