Я хотел бы получить вашу помощь, чтобы выяснить, как использовать 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()