这是我的设置:
- 连接到我的 ISP 的 Internet 路由器
- 一个 Linux 机器用一个网卡连接到路由器,并用另一个连接到交换机。
- 一个连接到交换机的 Windows 盒子。
我正在尝试编写一个 Python 脚本,以基本上允许 Windows 7 机器与 Internet 通信,就好像 Linux 机器不存在一样;如果您愿意,可以使用透明代理。
我已将 Windows 机器的默认网关设置为 Linux 机器,因此无论何时它尝试访问 Internet,数据包都会被路由到 Linux 机器。
Linux 机器正在侦听内部网卡。它从原始套接字中取出数据包,然后重写 dst MAC 地址以将数据包转发到路由器,并将 src IP 地址替换为面向外部的网卡。然后,此数据包从外部 NIC 发送出去。src MAC 地址设置为外部网卡。
因此,就路由器而言,它正在从 Linux 机器接收这些数据。因此,路由器将其路由到 Internet,然后将响应发送回 Linux 机器。
外部网卡也在监听网络流量,任何传入的具有匹配 MAC 地址的原始数据包,它都会脱离网络,将 dst MAC 地址更改为 Windows 机器,将 dst IP 地址更改为 Windows 机器,以及 src MAC 地址作为内部网络接口。然后它通过内部卡发送它。
就 Windows 机器而言,它向 Linux 机器(默认网关)发送了一个数据包,然后收到了响应。
当我尝试 ping Internet 服务器(如8.8.8.8
)时,这可以正常工作。查看 Linux 机器上的输出,我看到数据包进入内部卡,然后在外部卡上退出,并带有修改后的标头。
然后,不久之后,我看到响应从外部卡返回,经过修改,然后通过内部卡发送出去。
我已经编写了类来计算 IP 校验和等,所以这不是问题。
然后我看到 Windows 机器接收到 ping 响应。
因此,通过此设置,Ping 工作正常。我可以ping通8.8.8.8
。我已经将 Windows 机器配置为使用8.8.8.8
我们知道它可以访问的 DNS 服务器。
然而,当我尝试使用 IE 或 Firefox 浏览 Internet 时,却不能。
我可以看到 DNS 请求通过内部网卡,被修改,然后在外部网卡上发送出去。然而,这一次,不是像 ping 那样使用协议 1,而是使用 UDP 协议 17。
不管我等待多长时间,外部卡上都不会出现响应,因为没有任何东西从8.8.8.8
Linux 机器返回。
在使用 ping 时会这样做,但在进行 DNS 查找时不会。
正如我所说,DNS 已手动配置为8.8.8.8
and 4.4.4.4
,我看到 DNS 请求发送到 Internet 路由器。
什么都不会回来。任何想法在这里可能有什么不同,以及我应该将哪些事情视为潜在问题?
请不要推荐我使用其他一些软件包来解决这个问题,因为我已经研究过了,它们不符合我的要求。