我有一台运行在本地网络上的服务器,它充当网络中计算机的路由器。我现在想要实现的是,对某些 IP 地址的传出 TCP 请求通过 SSH 连接进行隧道传输,而不会让我的网络中的人使用该 SSH 隧道连接到任意主机。
到目前为止,我想到的方法是让一个redsocks实例在 localhost 上侦听,并将所有传出请求重定向到我想转移到该 redsocks 实例的 IP 地址。我添加了以下 iptables 规则:
iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:12345
Run Code Online (Sandbox Code Playgroud)
显然,Linux 内核将来自非 127.0.0.0/8 地址到 127.0.0.0/8 地址的数据包视为“火星数据包”并丢弃它们。但是,有效的是让 redsocks 监听 eth0 而不是 lo,然后让 iptables DNAT 将数据包发送到 eth0 地址(或使用 REDIRECT 规则)。问题在于,我网络上的每台计算机都可以使用 redsocks 实例连接到 Internet 上的每台主机,但我想将其使用限制为仅一组特定的 IP 地址。
有什么办法可以让 iptables DNAT 数据包发送到 127.0.0.1?否则,有没有人知道如何在不向所有人开放隧道的情况下实现我的目标?
更新:我也尝试过更改数据包的来源,但没有成功:
iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.0/24 -d 1.2.3.4 -j SNAT --to-source 127.0.0.1
iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.0/24 -d 127.0.0.1 -j SNAT --to-source 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
我找到了 dnat 到 127.0.0.1(loopback) 失败的解决方案,在 netfilter irc 频道上得到了答案。
有一个 sysctl 设置允许 dnat 环回。为了允许它
sysctl -w net.ipv4.conf.eth0.route_localnet=1
Run Code Online (Sandbox Code Playgroud)
并检查设置
cat /proc/sys/net/ipv4/conf/eth0/route_localnet
Run Code Online (Sandbox Code Playgroud)
小智 5
你不能用 127/8 网络来做这个技巧,因为它是在 linux 内核中专门使用的。但是您可以创建虚拟网络接口,为其分配 ip 地址,将您的服务绑定到该地址并进行 NAT。
root@vm8583:~# ip link add bogus type dummy
root@vm8583:~# sysctl net.ipv4.conf.eth0.arp_ignore=3
root@vm8583:~# ip addr add 10.0.0.1/32 bogus scope host
root@vm8583:~# ip link set bogus up
root@vm8583:~# ip link show bogus
4: bogus: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT
link/ether 5e:8b:38:f3:46:ce brd ff:ff:ff:ff:ff:ff
Run Code Online (Sandbox Code Playgroud)
请注意,您可能需要进行设置,net.ipv4.conf.eth0.arp_ignore=3以便您的服务器不会响应通过 eth0 传入的 10.0.0.1 的 ARP 请求:
arp_ignore - INTEGER
Define different modes for sending replies in response to
received ARP requests that resolve local target IP addresses:
. . .
3 - do not reply for local addresses configured with scope host,
only resolutions for global and link addresses are replied
4-7 - reserved
Run Code Online (Sandbox Code Playgroud)