我有两个接口,其中一个是来自我的 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
。
我删除了第二行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 网络。
我犯了一个错误,我使用接口的 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
一个答案中建议的网络掩码而不是/32
for 的网络掩码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 地址的最后一个八位字节。