我有一台在我的本地网络上运行的服务器,它充当我网络中计算机的路由器.我现在想要实现对某些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
显然,Linux内核将来自非127.0.0.0 / 8地址的数据包视为“Martian数据包”并将其丢弃为127.0.0.0/8地址.然而,有效的方法是让redsocks监听eth0而不是lo,然后让iptables将数据包转换为eth0地址(或使用REDIRECT规则).这个问题是我的网络上的每台计算机都可以使用redsocks实例连接到互联网上的每个主机,但我想将其使用限制在一组特定的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
解决方法
您无法使用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
注意,您可能需要设置net.ipv4.conf.eth0.arp_ignore = 3以便您的server won’t answer to ARP requests for 10.0.0.1 incoming via eth0:
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