跨网络命名空间设置透明代理:无法获取目标地址

跨网络命名空间设置透明代理:无法获取目标地址

我正在尝试设置跨网络命名空间的透明代理。

首先,我创建网络命名空间、虚拟以太网设备并在其中一个命名空间内启用转发:

ip netns add nsx
ip netns add nsy
ip link add vethx type veth peer name peerx netns nsx
ip link set vethx up
ip address add 10.0.0.1/24 dev vethx
ip netns exec nsx ip link set peerx up
ip netns exec nsx ip address add 10.0.0.2/24 dev peerx
ip netns exec nsx ip link add vethy type veth peer name peery netns nsy
ip netns exec nsx ip link set vethy up
ip netns exec nsx ip address add 10.0.1.1/24 dev vethy
ip netns exec nsx sysctl -w net.ipv4.conf.peerx.forwarding=1
ip netns exec nsx sysctl -w net.ipv4.conf.vethy.forwarding=1
ip netns exec nsy ip link set peery up
ip netns exec nsy ip address add 10.0.1.2/24 dev peery
ip netns exec nsy ip route add default via 10.0.1.1 dev peery

我设置了一些 iptables 规则来转发命名空间“nsx”内的流量:

ip netns exec nsx iptables -t nat -A PREROUTING -i vethy -p tcp --syn -j DNAT --to-destination 10.0.0.1:19040
ip netns exec nsx iptables -t nat -A POSTROUTING -p tcp -s 10.0.1.2 -d 10.0.0.1 --dport 19040 -j SNAT --to-source 10.0.0.2
ip netns exec nsx iptables -I FORWARD -o peerx -i vethy -p tcp -s 10.0.1.2 -d 10.0.0.1 --dport 19040 -j ACCEPT
ip netns exec nsx iptables -I FORWARD -i peerx -o vethy -m state --state ESTABLISHED,RELATED,NEW -d 10.0.1.2 -s 10.0.0.1 -j ACCEPT

当我尝试 curl 某个 IP 时出现以下错误:

$ ip netns exec nsy curl 1.1.1.1
curl: (56) Recv failure: Connection reset by peer

我测试了不同的透明转发器,看到如下错误消息:

2022/07/18 15:27:18 redir_linux.go:89: [redir] failed to get target address: no such file or directory

2022-07-18 15:28:49 INF: [tcp_tproxy_accept_cb] source socket address: 10.0.0.2#33830
2022-07-18 15:28:49 ERR: [get_tcp_orig_dstaddr] getsockopt(5, SO_ORIGINAL_DST): No such file or directory

Tor 显示此消息:

Jul 18 15:26:17.000 [debug] connection_handle_listener_read(): Connection accepted on socket 8 (child of fd 6).
Jul 18 15:26:17.000 [info] connection_handle_listener_read(): New SOCKS connection opened from 10.0.0.2.
Jul 18 15:26:17.000 [debug] connection_add_impl(): new conn type Socks, socket 8, address 10.0.0.2, n_conns 4.
Jul 18 15:26:17.000 [debug] connection_ap_process_transparent(): entered.
Jul 18 15:26:17.000 [warn] getsockopt() failed: No such file or directory
Jul 18 15:26:17.000 [warn] Fetching original destination failed. Closing.
Jul 18 15:26:17.000 [debug] conn_close_if_marked(): Cleaning up connection (fd 8).
Jul 18 15:26:17.000 [debug] connection_remove(): removing socket 8 (type Socks), n_conns now 4
Jul 18 15:26:17.000 [debug] connection_free_minimal(): closing fd 8.

=============================

怎样才能解决这个问题?我是否应该在方案中添加一条特殊规则以使其正常工作?

=============================

更新:

我在主机端使用了这个规则:

iptables -t nat -A PREROUTING -i vethx -p tcp -j DNAT --sport 19040 -s 10.0.0.0/24 -d 10.0.1.0/24 --to-destination 10.0.1.1

连接通过透明代理到主机端的SOCK5代理,SOCKS5代理收到的地址是10.0.0.1(本地)。

我该怎么做才能使网络命名空间“nsy”内建立的连接以正确的 IP 到达 SOCKS5 服务器?

答案1

假设应用程序需要 SOCKS 代理无论出于什么原因,必须位于网络命名空间内(例如,为了从命名空间 OpenVPN 连接中受益),那么以下内容将使其工作

  1. 假设一个正常工作的网络命名空间(可能启用了 openvpn),名为“protected”

$ ip netns add protected

  1. 假设网络命名空间已启动并正在运行(sudo如有必要,请添加自己的配置)

$ ip netns exec protected <command>

  1. 执行SOCKS 代理服务器在命名空间内(这里使用微袜

$ ip netns exec protected microsocks -p 1234

  1. 在(共享)之间建立桥梁unix套接字和(命名空间)SOCKS代理

$ ip netns exec protected socat unix-listen:/tmp/foo.sock,reuseaddr,fork tcp4:127.0.0.1:1234

  1. 转发所有 TCP(包括 SOCKS 连接尝试)来自主持人(在给定端口上)unix套接字

$ socat tcp-l:9060,fork,reuseaddr /tmp/foo.sock

  1. 连接应用程序到(非命名空间但转发的)TCP 端口本地主机:9060

相关内容