DNAT 到 127.0.0.1,带有 iptables/透明 SOCKS 代理的目标访问控制

cda*_*uth 3 linux iptables

我有一台运行在本地网络上的服务器,它充当网络中计算机的路由器。我现在想要实现的是,对某些 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)

Pie*_*ter 7

我找到了 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)


mgo*_*ven 1

您可以尝试禁用反向路径过滤(AFAICT 就是术语“火星人”的含义)。您可以echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter以 root 身份执行此操作。(您可能只能在lo界面上禁用它,但我会首先尝试完全禁用它。)