
長話短說
我希望系統中的所有傳出流量都路由到 tun0 設備,用 DNS 封包封裝,然後傳送到互聯網,但 DNS 封包也會路由回 tun0 設備。
背景
作為我正在進行的專案的一部分,我必須在沒有 TCP 流量的系統上實作 DNS 隧道(所有 TCP 流量都會被丟棄)。
我決定用 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 程式是如何做到這一點的?
感謝您的幫助,如果需要任何澄清/編輯,請發表評論