我有 2 个 NIC,只想从一个特定接口进行 SSH。如您所见,ssh 中的 -b 选项似乎无法使用我的地址。不知道为什么?
$ ip a show enp8s0 | grep "default\|inet "
2: enp8s0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master INT-VRF1 state UP group default qlen 1000
inet 172.31.16.22/24 brd 172.31.16.255 scope global dynamic noprefixroute enp8s0
$ ping -I enp8s0 172.31.16.10
PING 172.31.16.10 (172.31.16.10) from 172.31.16.22 enp8s0: 56(84) bytes of data.
64 bytes from 172.31.16.10: icmp_seq=1 ttl=255 time=0.627 ms
64 bytes from 172.31.16.10: icmp_seq=2 ttl=255 time=2.49 ms
$ ssh -b 172.31.16.22 172.31.16.10
bind 172.31.16.22: Cannot assign requested address
ssh: connect to host 172.31.16.10 port 22: failure
SSH 好像不知道 VRF。我认为这可能是命名空间问题,因此也尝试使用下面的内核设置,但无济于事。
$ sudo sysctl -a | grep l3mdev
net.ipv4.raw_l3mdev_accept = 1
net.ipv4.tcp_l3mdev_accept = 1
net.ipv4.udp_l3mdev_accept = 1
根据评论要求添加如下:
$ ip -4 addr list | grep 172.31.16.22
inet 172.31.16.22/24 brd 172.31.16.255 scope global dynamic noprefixroute enp8s0
更新
我确实设法通过以下方法实现了这个功能:
$ sudo ip vrf exec INT-VRF1 ssh 172.31.16.10
但是,我只能使用 sudo 才能使其工作。否则,我得到:
$ ip vrf exec INT-VRF1 ssh 172.31.16.10
Failed to load BPF prog: 'Operation not permitted'
真的不知道为什么。但我只需要能够通过此接口使用像 SSH 这样的客户端应用程序。如何/有什么方法可以做到这一点?
我似乎在网上能找到的唯一东西是将应用程序的 SO_BINDTODEVICE 绑定到某个接口,以强制在特定 NIC 上创建套接字。但我真的不确定如何为 SSH 客户端连接进行设置。