我在本地networking上运行一台服务器,作为networking中计算机的路由器。 我现在要实现的是,对某些IP地址的传出TCP请求通过SSH连接进行隧道传输,而不会让networking中的人员使用该SSH隧道连接到任意主机。
我到现在为止的想法是在本地主机上监听一个redsocks实例,并将所有传出的请求redirect到我想转移到该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地址转换为127.0.0.0/8地址为“Martian数据包”并丢弃它们。 然而,有效的做法是让redsocks监听eth0而不是lo,然后将iptables DNAT转发给eth0地址(或使用REDIRECT规则)。 这个问题是,那么我的networking上的每台计算机都可以使用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/8networking来做这个技巧,因为它是在linux内核中专门研究的。 但是您可以创build虚拟networking接口,为其分配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以便您的服务器不会回答10.0.0.1通过eth0收到的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
我发现解决scheme我的dnat到127.0.0.1(环回)失败,得到了netfilter irc通道上的答案。
有一个sysctl设置允许dnat回环。 允许它
sysctl -w net.ipv4.conf.eth0.route_localnet=1
并检查设置
cat /proc/sys/net/ipv4/conf/eth0/route_localnet
你可以尝试禁用反向path过滤 (AFAICT是术语“martian”的意思)。 你可以用echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter作为root。 (你可能只能在lo界面上禁用它,但是我会尝试在第一时间完全禁用它。)