Skip to content

Commit 4c8dca2

Browse files
committed
Spoof client source IP
1 parent 7493481 commit 4c8dca2

File tree

1 file changed

+29
-4
lines changed
  • server/common/oursrc/scripts-proxy

1 file changed

+29
-4
lines changed

server/common/oursrc/scripts-proxy/main.go

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@ var (
1818
ldapServer = flag.String("ldap_server", "scripts-ldap.mit.edu:389", "LDAP server to query")
1919
defaultHost = flag.String("default_host", "scripts.mit.edu", "default host to route traffic to if SNI/Host header cannot be parsed or cannot be found in LDAP")
2020
baseDn = flag.String("base_dn", "ou=VirtualHosts,dc=scripts,dc=mit,dc=edu", "base DN to query for hosts")
21+
localRange = flag.String("local_range", "18.4.86.0/24", "IP block for client IP spoofing")
2122
)
2223

2324
func always(context.Context, string) bool {
2425
return true
2526
}
2627

2728
type ldapTarget struct {
28-
ldap *ldap.Conn
29+
localPoolRange *net.IPNet
30+
ldap *ldap.Conn
2931
}
3032

3133
func (l *ldapTarget) HandleConn(netConn net.Conn) {
@@ -48,9 +50,24 @@ func (l *ldapTarget) HandleConn(netConn net.Conn) {
4850
return
4951
}
5052
laddr := netConn.LocalAddr().(*net.TCPAddr)
53+
destAddrStr := net.JoinHostPort(pool, fmt.Sprintf("%d", laddr.Port))
54+
destAddr, err := net.ResolveTCPAddr("tcp", destAddrStr)
55+
if err != nil {
56+
netConn.Close()
57+
log.Printf("parsing pool address %q: %v", pool, err)
58+
return
59+
}
5160
dp := &tcpproxy.DialProxy{
52-
Addr: fmt.Sprintf("%s:%d", pool, laddr.Port),
53-
// TODO: Set DialContext to override the source address
61+
Addr: destAddrStr,
62+
}
63+
raddr := netConn.RemoteAddr().(*net.TCPAddr)
64+
if l.localPoolRange.Contains(destAddr.IP) {
65+
sourceAddr := &net.TCPAddr{
66+
IP: raddr.IP,
67+
}
68+
dp.DialContext = func(ctx context.Context, network, address string) (net.Conn, error) {
69+
return net.DialTCP(network, sourceAddr, destAddr)
70+
}
5471
}
5572
dp.HandleConn(netConn)
5673
}
@@ -84,8 +101,16 @@ func main() {
84101
}
85102
defer l.Close()
86103

104+
_, ipnet, err := net.ParseCIDR(*localRange)
105+
if err != nil {
106+
log.Fatal(err)
107+
}
108+
87109
var p tcpproxy.Proxy
88-
t := &ldapTarget{ldap: l}
110+
t := &ldapTarget{
111+
localPoolRange: ipnet,
112+
ldap: l,
113+
}
89114
for _, addr := range strings.Split(*httpAddrs, ",") {
90115
p.AddHTTPHostMatchRoute(addr, always, t)
91116
}

0 commit comments

Comments
 (0)