我希望得到您的帮助,弄清楚如何使用 NetCat 监听特定端口,仅接受来自特定网络中主机的连接。我有一台服务器,我想仅使用 NetCat(或任何其他工具)与一组客户端共享文件。
谢谢。
答案1
我弄清楚了如何使用 RedHat 的 netcat 版本,使用下面的命令行:
nc -l --allow "IPs" -p "端口号"
例子:
nc -l --allow 192.168.0.10,192.168.0.15 -p 8080
任何其他尝试连接的不同 IP 都将被拒绝。
答案2
如果你安装了 netcat-openbsd 而不是 netcat-traditional(这些特定名称来自 Debian),那么你可以监听特定的地址:
nc -l 192.168.5.6 9999
但是这不会验证源地址以防止其他网络访问它。它只是限制哪个本地地址,这对限制接口有用,但对源地址没有限制。
要限制源地址,您需要使用更多工具,例如 iptables。或者在 Web 服务器配置中设置规则(例如 apache、nginx、lighttpd)。
或者一个 Python 程序。这是我之前为某人写的一个简单的 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()