首先,我的设置:
- 有线调制解调器和 Fritz!Box 将我连接到互联网
- 通过网线连接到 Fritz Box 的 PC
- 多个 Wi-Fi 设备也连接到 Fritz Box
我想要实现的目标如下:我想在一台单独的机器上设置类似网络代理服务器的东西,它可以拦截并(可能)中继我网络中任何设备与互联网之间的所有流量。我不关心网络中设备之间的流量。我不想局限于某个协议/端口/ IP 地址上的消息。我的主要目标是了解网络/协议等,并在该代理服务器上实现多个应用程序/试用。示例可以是:
- 收集所有正在进行通信的 IP / 端口的统计信息(因此,基本上转发所有流量并进行一些计数)
- 阻止某些流量(例如,根据 IP 地址阻止孩子访问他们不应该看到的内容。阻止软件发送有关我的隐私相关数据。)
- 警告我家庭网络中的新设备(例如,有人滥用我的 Wi-Fi)
- 在转发邮件之前进行更改(例如,在收到的网页内容中添加文本)
- 将自己的消息发送到互联网上的服务器或连接的设备之一(例如,收集使用情况统计信息以显示在 Web 界面上)
- 还有很多 ...
假设我有一台可用的 Unix (/ Linux) 机器:
- 网络设置:需要什么样的网络拓扑?我需要将代理机器放置在网络的哪个位置?
- 设置:我需要在代理上配置什么才能接收和转发所有传入和传出流量?我不想更改主机设备上的设置。将它们连接到网络就足够了。
- 可编程性:为了使用 Python 读取/修改/写入/发送/阻止消息/数据包,我还需要进行哪些设置?
- 限制:这样的设置是否会对我的网络速度造成严重影响?
--- 编辑 --- 我取得了一些进展,并创建了一个接受传入连接的 Python 脚本。此外,我设置了另一台机器的 wifi 连接,以使用第一台机器作为网关。我现在成功接收了消息,但问题是,我不知道它们实际上应该发送到哪里。我假设我必须更改套接字配置并使用透明代理,但我没有找到太多关于如何在 Python 中实际执行此操作的信息。此外,我的脚本目前在 Mac 上运行,因此可能不是所有套接字选项都可用。
以下是我当前的代码片段:
import socket
def received_from(sock, timeout):
dt = ""
sock.settimeout(timeout)
try:
while True:
dt = sock.recv(4096)
if not dt:
break
dt = + dt
except:
pass
return dt
def hexdump(data, length=16):
filter = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)])
lines = []
digits = 4 if isinstance(data, str) else 2
for c in range(0, len(data), length):
chars = data[c:c+length]
hex = ' '.join(["%0*x" % (digits, (x)) for x in chars])
printable = ''.join(["%s" % (((x) <= 127 and filter[(x)]) or '.') for x in chars])
lines.append("%04x %-*s %s\n" % (c, length*3, hex, printable))
print(''.join(lines))
s = socket.socket()
print("Socket successfully created")
try:
port = 12222
s.bind(('', port))
print("socket bound to port {}".format(port))
s.listen(5)
print("socket listening")
print("proxy sock: {}".format(s.getsockname()))
while True:
try:
c, addr = s.accept()
print("got connection from {}".format(addr))
print("client peer: {}".format(c.getpeername()))
print("client sock: {}".format(c.getsockname()))
data = received_from(c, 3)
hexdump(data)
print()
c.send("Connection received. Thanks and bye!".encode('utf-8'))
c.close()
except Exception as e:
c.close()
raise e
except Exception as e:
s.close()
raise e
答案1
以下是一些建议:
1) 首先,访问家庭网关 (FritzBox) 的管理页面。通常是通过浏览器以用户名/密码连接到 192.168.1.1。查看 WAN、LAN、Wifi 的设置并阅读相关信息。
2)安装 Linux 和命令行工具:tcpdump、netstat、nc、telnet
3)准备另一台带有用户界面的 Windows / Linux 机器,在那里安装 Wireshark
4)尝试开发一些简单的python 套接字级程序(python 套接字库非常适合 C 套接字 API)
5)使用 tcpdump 记录不同计算机上程序之间的流量,并使用 Wireshark 检查数据包
6) 尝试向您的家庭 LAN 网络添加代理服务器(专用机器)。
7)安装 Apache 网络服务器、CuteFTP、SMPT Relay、MiniDLNA 等程序...
你可以使用我的奇茨希特用于 Linux 实验网络相关的东西
8) 尝试创建您自己的 SSL 证书,以保护您网络中计算机之间的连接。
对您问题的回答:
网络设置:代理像其他任何机器一样放置在网络上。但所有机器都引用它(将其用作“网关”)。
设置:所有机器都需要通过配置参数获知代理(端口、地址)。
可编程性:无。它可以开箱即用。
限制:这样的设置是否会对我的网络速度造成严重影响?不会。