Route

如何為特定的目標 ip 使用特定的介面?

  • June 12, 2017

我有兩個介面,一個是來自我的安卓手機的共享網際網路 USB 連接。

  • enp0s31f6:乙太網網際網路連接(預設)
  • enp0s20f0u1: 共享連接安卓

我想使用enp0s20f0u1介面通過 ssh 訪問只有一個 IP。我的意思是,所有將連接到A.B.C.D(外部/網際網路 ip)的東西都必須通過這個介面。沒有其他的。

我正在使用 Centos 7。

  • 如何路由具有A.B.C.D目標 IP 的每個數據包以使用enp0s20f0u1介面?
  • 我需要使用ip route還是iptables足夠了?為什麼 ?

我對“ip routing”很陌生,請用你的答案給我解釋。

細節:

enp0s20f0u1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.42.174  netmask 255.255.255.0  broadcast 192.168.42.255

enp0s31f6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 10.128.1.21  netmask 255.255.254.0  broadcast 10.128.1.255

我做了什麼:

$ip 路由:

default via 10.128.0.1 dev enp0s31f6  proto static  metric 100 
default via 192.168.42.129 dev enp0s20f0u1  proto static  metric 101 
10.128.0.0/23 dev enp0s31f6  proto kernel  scope link  src 10.128.1.21  metric 100 
10.136.80.66 via 10.128.0.1 dev enp0s31f6  proto dhcp  metric 100 
192.168.42.0/24 dev enp0s20f0u1  proto kernel  scope link  src 192.168.42.174  metric 100 
192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1

我介面的 ip 是 192.168.42.174,這個介面的網關是192.168.42.129.

我刪除了第二行,如下dirkt所示: default via 192.168.42.129 dev enp0s20f0u1 proto static metric 101

$ ip路由

default via 10.128.0.1 dev enp0s31f6  proto static  metric 100 
10.128.0.0/23 dev enp0s31f6  proto kernel  scope link  src 10.128.1.21  metric 100 
10.136.80.66 via 10.128.0.1 dev enp0s31f6  proto dhcp  metric 100 
A.B.C.D via 192.168.42.129 dev enp0s20f0u1 
192.168.42.0/24 dev enp0s20f0u1  proto kernel  scope link  src 192.168.42.174  metric 100 
192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1

我不想將此介面用於 ABCD 的任何其他內容。我應該刪除

192.168.42.0/24 dev enp0s20f0u1  proto kernel  scope link  src 192.168.42.174  metric 100

也 ?我想不,看起來它是針對我介面的 LAN 網路的。

我犯了一個錯誤,我使用介面的 ipvia而不是網關。

現在一切都執行良好。更清楚了。

只是為了理解的輔助問題,如果現在我只想重定向埠 22 並阻止其他所有內容。我想我需要 iptables/firewallD,以拒絕所有以 ABCD 作為目標 IP 的內容並只允許埠 22。

路由通過選擇最具體的目的地來工作。這意味著你需要

  • 每個介面後面的網段的一條路由
  • 一個預設路由(而不是多個)
  • ABCDssh目的地的一條特殊路線。

所以輸出ip route應該是這樣的:

default via 10.128.0.1 dev enp0s31f6  proto static  metric 100 
10.128.0.0/23 dev enp0s31f6  proto kernel  scope link  src 10.128.1.21  metric 100 
192.168.42.0/24 dev enp0s20f0u1  proto kernel  scope link  src 192.168.42.65  metric 100 
A.B.C.D/32 dev enp0s20f0u1  ...

要添加最後一個,請執行

ip route add A.B.C.D/32 dev enp0s20f0u1 via 192.168.42.129

目前網關在哪裡192.168.42.129(不必保持不變)。

採用

ip route del default via 192.168.42.129 dev enp0s20f0u1

手動刪除第二個預設路由,如果你想確保除了 ABCD 和連結本地數據包之外沒有其他東西通過這個介面。現在配置的方式,如果第一個介面由於某種原因宕掉了,所有的流量都會使用這個介面。

在您的輸出中,您有一個10.136.80.66通過 DHCP 添加的。我不知道為什麼要添加它,但很可能基礎設施出於某種原因需要它。

有多種方法可以自動執行此設置,這取決於您的系統的配置方式(網路管理器/etc/network/interfaces??)

按照評論中的建議使用iptables標記數據包是一個愚蠢的想法,路由直接工作而無需設置標記。這就是路由的用途。

使用/24一個答案中建議的網路遮罩而不是/32網路遮罩A.B.C.D將路由多個目標地址(實際上是 256 個),因此也不要這樣做。

引用自:https://unix.stackexchange.com/questions/370573