Sockets 是否可以设置套接字的原始值?
我正在尝试将tcp连接重定向到没有iptables的透明代理。iptables绝对不是一个选项。是否可以在套接字上设置原始目标?以下是我在go中编写的代码:Sockets 是否可以设置套接字的原始值?,sockets,go,networking,iptables,Sockets,Go,Networking,Iptables,我正在尝试将tcp连接重定向到没有iptables的透明代理。iptables绝对不是一个选项。是否可以在套接字上设置原始目标?以下是我在go中编写的代码: package main import ( "fmt" "syscall" ) const ( SO_ORIGINAL_DST = 80 ) func main() { proto := ((syscall.IPPROTO_IP << 8) & 0xff00) | ((syscall
package main
import (
"fmt"
"syscall"
)
const (
SO_ORIGINAL_DST = 80
)
func main() {
proto := ((syscall.IPPROTO_IP << 8) & 0xff00) | ((syscall.IPPROTO_IP >> 8) & 0xff)
sock, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, proto)
if err != nil {
fmt.Printf("Error while creating socket: %s\n", err.Error())
return
}
mreq := syscall.IPv6Mreq{
Multiaddr: [16]byte{2, 0, 1, 187, 104, 28, 28, 88, 0, 0, 0, 0, 0, 0, 0, 0},
Interface: 0,
}
err = syscall.SetsockoptIPv6Mreq(sock, syscall.SOL_IP, SO_ORIGINAL_DST, &mreq)
if err != nil {
fmt.Printf("Error while setting original destination: %s\n", err.Error())
return
}
sa := syscall.SockaddrInet4{
Port: 8080,
Addr: [4]byte{127, 0, 0, 1},
}
err = syscall.Connect(sock, &sa)
if err != nil {
fmt.Printf("Error while connecting to target: %s\n", err.Error())
return
}
defer syscall.Close(sock)
}
是只允许iptables设置原始目的地还是我做错了什么
编辑:我正在使用debian。因此,“原始”DST仅用于获取重定向套接字的原始目标IP地址。重定向本身必须使用iptables完成。因此,“原始”DST仅用于获取重定向套接字的原始目标IP地址。重定向本身必须使用iptables完成。不,它仅用于获取原始地址。e、 g
f, err := conn.(*net.TCPConn).File()
if err != nil {
return "", err
}
defer f.Close()
addr, err := syscall.GetsockoptIPv6Mreq(int(f.Fd()), syscall.IPPROTO_IP, SO_ORIGINAL_DST)
if err != nil {
return "", err
}
不,它只用于获取原始地址。e、 g
f, err := conn.(*net.TCPConn).File()
if err != nil {
return "", err
}
defer f.Close()
addr, err := syscall.GetsockoptIPv6Mreq(int(f.Fd()), syscall.IPPROTO_IP, SO_ORIGINAL_DST)
if err != nil {
return "", err
}
而且它只支持get,不支持set。难道不可能编写我自己的iptables吗?什么使iPTPATH特殊?@ PdultSista:不清楚为什么你不能首先使用IPTABLE,所以不清楚你认为什么“特殊”。iptables是开源的,因此无需编写自己的(但您可以,只是它远不是琐碎的)。“特殊”要求是,它只能与Linux内核一起工作(使用中编译的netfilter支持,这是相当标准的)您必须是root用户才能添加iptables规则。我不能使用iptables,因为我正在尝试桥接两个以太网接口,其中vlan和pppoe数据包通过,并且ebtables不调用iptables的iptables预路由表,即使启用了br_netfilter模块和过滤器pppoe/vlan标记。所以我想自己模拟iptables,将特定的数据包重定向到我的透明代理,但不管怎样,我现在正在使用socks5代理。但我很好奇,我是否能够通过编写内核模块来设置如此原始的测试?据我所知,iptables被允许设置为SO_originaldst,因为它在内核空间中工作。@pattersteamer:也许你可以编写一个内核模块来实现这一点,但我怀疑它是否微不足道。但也许你太专注于用一种非常具体的方式来解决你的问题,而忽略了解决实际问题的其他选择。我建议你提出一个新问题,描述你想要解决的真正问题,你试图用桥来解决问题,以及你遇到的无法创建透明代理的问题。也许在这类设置方面拥有更多专业知识的人会给你一个解决问题的更好方法的想法。而且它只支持get,不支持set。难道我不可能编写自己的iptables吗?什么使iPTPATH特殊?@ PdultSista:不清楚为什么你不能首先使用IPTABLE,所以不清楚你认为什么“特殊”。iptables是开源的,因此无需编写自己的(但您可以,只是它远不是琐碎的)。“特殊”要求是,它只能与Linux内核一起工作(使用中编译的netfilter支持,这是相当标准的)您必须是root用户才能添加iptables规则。我不能使用iptables,因为我正在尝试桥接两个以太网接口,其中vlan和pppoe数据包通过,并且ebtables不调用iptables的iptables预路由表,即使启用了br_netfilter模块和过滤器pppoe/vlan标记。所以我想自己模拟iptables,将特定的数据包重定向到我的透明代理,但不管怎样,我现在正在使用socks5代理。但我很好奇,我是否能够通过编写内核模块来设置如此原始的测试?据我所知,iptables被允许设置为SO_originaldst,因为它在内核空间中工作。@pattersteamer:也许你可以编写一个内核模块来实现这一点,但我怀疑它是否微不足道。但也许你太专注于用一种非常具体的方式来解决你的问题,而忽略了解决实际问题的其他选择。我建议你提出一个新问题,描述你想要解决的真正问题,你试图用桥来解决问题,以及你遇到的无法创建透明代理的问题。也许在这类设置方面有更多专业知识的人会给你一个解决问题的更好方法的想法。