总结
我希望我的系统的所有传出流量都被路由到 tun0 设备,用 DNS 数据包包装然后发送到互联网,但 DNS 数据包也会被路由回 tun0 设备。
背景
作为我正在进行的项目的一部分,我必须在没有 TCP 流量(所有 TCP 流量都被丢弃)的系统上实现 DNS 隧道。
我决定用 python 来实现这一点,但遇到了如何路由流量的问题。
该设置将包括客户端计算机上不能使用 TCP 的代理和没有网络限制的服务器。
我目前仅处理从客户端到服务器的传出流量。
我目前想与客户采取的方法是:
tun0
在客户端系统上创建接口- 通过该接口路由所有传出流量。
- 让一个 python 程序监听该接口 - 传出的数据包将被包装在一个 DNS 查询中,该查询通过连接到互联网的接口发送到互联网(在我的情况下
ens33
)。
为了创建 tun 设备,我使用了:
from pytun import TunTapDevice
tun = TunTapDevice(name=”tun0”)
tun.addr = '10.8.0.1'
tun.dstaddr = '10.8.0.2'
tun.netmask = '255.255.255.0'
tun.mtu = 1500
tun.up()
为了将流量路由到 tun0 接口,我使用了
sudo ip route add default via 10.8.0.1 dev tun0
问题
我确实将流量路由到我的 python 程序,并且我可以从设备读取数据包,但是在构建新的 DNS 数据包(该数据包包含原始数据)之后,我尝试通过我的ens33
接口将数据包发送到互联网,但我看到tcpdump
请求wireshark
试图从 tun0 接口发送。
我如何才能将不是来自我的程序的数据包路由到 tun0?这个概念对我来说似乎类似于 vpn,vpn 程序是如何做到的?
感谢您的帮助,如果需要任何澄清/编辑,请评论