如何针对特定目标 IP 使用特定接口?

如何针对特定目标 IP 使用特定接口?

我有两个接口,其中一个是来自我的 Android 手机的共享互联网 USB 连接。

  • enp0s31f6:以太网互联网连接(默认)
  • enp0s20f0u1:共享连接android

我想使用enp0s20f0u1接口通过 ssh 只访问一个 IP。我的意思是,所有连接到A.B.C.D(外部/互联网 IP)的东西都必须通过这个接口。没有其他的。

我使用的是 Centos 7。

  • 如何将每个具有A.B.C.D目标 IP 的数据包路由到使用enp0s20f0u1接口?

  • 我需要使用ip route还是iptables足够了?为什么 ?

我对“ip 路由”很陌生,请给我解释一下你的答案。

细节:

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

我删除了第二行dirktdefault 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 网络。

我犯了一个错误,我使用接口的 ip 而不是via网关。

现在一切都运转良好。更清楚了。

附属问题只是为了理解,如果现在我只想重定向端口 22 并阻止其他所有端口。我想我需要 iptables/firewallD,拒绝以 ABCD 作为目标 IP 的所有内容,并仅允许端口 22。

答案1

路由通过选择最具体的目的地来工作。这意味着你需要

  • 每个接口后面的网段有一条路由
  • 一条默认路由(而不是多条)
  • 一条前往您的 ABCD 目的地的特殊路线ssh

所以输出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一个答案中建议的网络掩码而不是/32for 的网络掩码A.B.C.D将路由多个目标地址(实际上是 256 个),因此也不要这样做。

答案2

我想使用enp0s20f0u1接口通过 ssh 只访问一个 IP。我的意思是,所有连接到 ABCD(外部/互联网 IP)的东西都必须通过这个接口。没有其他的。

这看起来很简单...您希望将流量路由到enp0s20f0u1特定的下一个 hip 接口,这正是路由表的工作。

ip route A.B.C.D/32 192.168.42.xx

其中xx是您要使用的下一跃点 IP 地址的最后一个八位字节。

相关内容