Linux

是否可以將所有通信路由到一個埠,另一個網路介面?

  • December 14, 2019

簡短:我想知道是否可以路由(使用 iptables),因此所有與 192.168.1.10(eth0)埠 40000 之間的通信都發送到 tun0?(VPN)

更長:當我連接到我的 VPN 伺服器時,所有數據都通過 tun0 網路路由,除了這個完全拒絕理解的應用程序(不會去任何地方)(糟糕的程式)。這會導致應用程序在沒有退出的情況下與系統發生碰撞。

是否可以通過將要發送到 192.168.1.10:40000 的所有數據發送到 tun0(VPN 網路介面)來強制它,並將所有來自 tun0:40000 的傳入數據路由回 192.168.1.10

更新:這是 IP -4 路由的結果:

*0.0.0.0/1 via 10.128.0.1 dev tun0 
default via 192.168.1.1 dev enp0s3 proto dhcp metric 20100 
10.128.0.0/22 dev tun0 proto kernel scope link src 10.128.2.129 
128.0.0.0/1 via 10.128.0.1 dev tun0 
169.254.0.0/16 dev tun0 scope link metric 1000 
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.173 metric 100 
217.64.xxx.xx via 192.168.1.1 dev enp0s3* 

當我連接到我的 VPN 伺服器時,所有數據都通過 tun0 網路路由,除了這個應用程序,它完全拒絕理解(糟糕的程式)。

網路程式有一個分層模型,這意味著應用程序的作者只是告訴系統連接到某個埠上的某個 IP 地址,他不必擔心其他的,因為如何到達那個 TCP/IP 套接字是直到作業系統。

您的問題是由錯誤的路由配置引起的。讓我們採取這樣的幾行:

1.2.3.0/29 dev tun0
1.2.0.0/22 dev tun0 via 1.2.3.4 

第一種意思是:如果目的地址的最左29位與1.2.3.0(即from 1.2.3.0to 1.2.3.7)相同,則直接在上發送數據包tun0。第二行表示必須將不在該行中的來自1.2.0.0to的地址發送到。核心知道如何從第一行查找。1.2.3.255``/29``1.2.3.4``1.2.3.4

Windows 路由表幾乎相同(它們最初從 BSD 獲取 TCP/IP 堆棧)。

現在到你的情況。您有兩個路由條目:

0.0.0.0/1 via 10.128.0.1 dev tun0 
default via 192.168.1.1 dev enp0s3

wheredefault0.0.0.0/0(所有地址)的快捷方式。所以:如果目標地址以0up開頭128,則通過 發送tun0,否則通過 發送enp0s3

如果您想通過 路由幾乎所有流量tun0,請首先找到 VPN 隧道的另一個端點的地址(可能ip link會有所幫助,但您沒有說明您的隧道使用什麼)。假設它是5.5.5.5tun0是一個虛擬介面,它對通過它發送的數據包進行加密,並通過物理介面將它們發送到另一個端點。所以我們需要添加一個路由,以便5.5.5.5通過以下方式發送數據包enp0s3

ip route add 5.5.5.5 via 192.168.1.1 dev enp0s3

(編輯:再次閱讀您的路由表後,這實際上已經存在,在最後一行)

然後您可以通過以下方式路由剩餘流量tun0

ip route del default
ip route add default via 10.128.0.1 dev tun0

根據您設置介面(和隧道)的方式,您可以在介面啟動時自動執行這些操作。

TL;DR只要用 替換0.0.0.0/1default無論你放在哪裡。

引用自:https://serverfault.com/questions/995399