@@ -17,13 +17,13 @@ type UDPTunnel struct {
17
17
multiplexUDP bool
18
18
natTimeout time.Duration
19
19
20
- client Client
21
- conn * net.UDPConn
22
- packetParser PacketParser
20
+ client Client
21
+ conn * net.UDPConn
22
+ packetAdapter PacketAdapter
23
23
}
24
24
25
25
func (s * UDPTunnel ) Name () string {
26
- return fmt .Sprint ("UDP " , s .packetParser .Name (), " service" )
26
+ return fmt .Sprint ("UDP " , s .packetAdapter .Name (), " service" )
27
27
}
28
28
29
29
func (s * UDPTunnel ) Start () error {
@@ -61,7 +61,7 @@ func (s *UDPTunnel) listen() {
61
61
continue
62
62
}
63
63
64
- payloadStart , payloadLength , detachedSocksAddr , err := s .packetParser .ParsePacket (packetBuf , ShadowsocksPacketConnFrontReserve , n )
64
+ payloadStart , payloadLength , detachedSocksAddr , err := s .packetAdapter .ParsePacket (packetBuf , ShadowsocksPacketConnFrontReserve , n )
65
65
if err != nil {
66
66
log .Print (err )
67
67
continue
@@ -76,7 +76,7 @@ func (s *UDPTunnel) listen() {
76
76
continue
77
77
}
78
78
79
- proxyConn = nm .Add (clientAddr , s .conn , oobCache , spc )
79
+ proxyConn = nm .Add (clientAddr , s .conn , oobCache , spc , s . packetAdapter )
80
80
} else {
81
81
proxyConn .oobCache = oobCache
82
82
}
@@ -95,43 +95,54 @@ func (s *UDPTunnel) Stop() error {
95
95
return nil
96
96
}
97
97
98
- // PacketParser parses an incoming packet and returns payload start index, payload length,
99
- // a detached socks address (if applicable), or an error.
100
- //
101
- // The detached socks address is only returned when the payload does not start with a socks address.
102
- type PacketParser interface {
98
+ // PacketAdapter translates packets between a local interface and the proxy interface.
99
+ type PacketAdapter interface {
103
100
Name () string
101
+
102
+ // ParsePacket parses an incoming packet and returns payload start index, payload length,
103
+ // a detached socks address (if applicable), or an error.
104
+ //
105
+ // The detached socks address is only returned when the payload does not start with a socks address.
104
106
ParsePacket (pkt []byte , start , length int ) (payloadStart , payloadLength int , detachedSocksAddr []byte , err error )
107
+
108
+ // EncapsulatePacket encapsulates the decrypted packet from proxy
109
+ // into a new form so it's ready to be sent on the local interface.
110
+ // The encapsulation must not extend beyond the range of the full decrypted packet.
111
+ EncapsulatePacket (decryptedFullPacket []byte , socksAddrStart , payloadStart , payloadLength int ) (pkt []byte , err error )
105
112
}
106
113
107
- // SimpleTunnelPacketParser simply relays packets between clientConn and proxyConn.
108
- type SimpleTunnelPacketParser struct {
114
+ // SimpleTunnelPacketAdapter simply relays packets between clientConn and proxyConn.
115
+ type SimpleTunnelPacketAdapter struct {
109
116
remoteSocksAddr socks.Addr
110
117
}
111
118
112
- func NewSimpleTunnelPacketParser (remoteSocksAddr socks.Addr ) * SimpleTunnelPacketParser {
113
- return & SimpleTunnelPacketParser {
119
+ func NewSimpleTunnelPacketAdapter (remoteSocksAddr socks.Addr ) * SimpleTunnelPacketAdapter {
120
+ return & SimpleTunnelPacketAdapter {
114
121
remoteSocksAddr : remoteSocksAddr ,
115
122
}
116
123
}
117
124
118
- func (p * SimpleTunnelPacketParser ) Name () string {
125
+ func (p * SimpleTunnelPacketAdapter ) Name () string {
119
126
return "simple tunnel"
120
127
}
121
128
122
- func (p * SimpleTunnelPacketParser ) ParsePacket (_ []byte , start , length int ) (payloadStart , payloadLength int , detachedSocksAddr []byte , err error ) {
129
+ func (p * SimpleTunnelPacketAdapter ) ParsePacket (_ []byte , start , length int ) (payloadStart , payloadLength int , detachedSocksAddr []byte , err error ) {
123
130
return start , length , p .remoteSocksAddr , nil
124
131
}
125
132
126
- // SimpleSocks5PacketParser is a minimal implementation of SOCKS5 UDP server.
133
+ func (p * SimpleTunnelPacketAdapter ) EncapsulatePacket (decryptedFullPacket []byte , _ , payloadStart , payloadLength int ) (pkt []byte , err error ) {
134
+ return decryptedFullPacket [payloadStart : payloadStart + payloadLength ], nil
135
+ }
136
+
137
+ // SimpleSocks5PacketAdapter is a minimal implementation of SOCKS5 UDP server.
127
138
// It unconditionally accepts SOCKS5 UDP packets, no matter a corresponding UDP association exists or not.
128
- type SimpleSocks5PacketParser struct {}
139
+ type SimpleSocks5PacketAdapter struct {}
129
140
130
- func (p * SimpleSocks5PacketParser ) Name () string {
141
+ func (p * SimpleSocks5PacketAdapter ) Name () string {
131
142
return "simple SOCKS5"
132
143
}
133
144
134
- func (p * SimpleSocks5PacketParser ) ParsePacket (pkt []byte , start , length int ) (payloadStart , payloadLength int , detachedSocksAddr []byte , err error ) {
145
+ func (p * SimpleSocks5PacketAdapter ) ParsePacket (pkt []byte , start , length int ) (payloadStart , payloadLength int , detachedSocksAddr []byte , err error ) {
135
146
payloadStart = start + 3
136
147
if len (pkt ) <= payloadStart {
137
148
return 0 , 0 , nil , ss .ErrShortPacket
@@ -152,14 +163,24 @@ func (p *SimpleSocks5PacketParser) ParsePacket(pkt []byte, start, length int) (p
152
163
return
153
164
}
154
165
155
- // ShadowsocksNonePacketParser implements the 'none' mode of Shadowsocks.
156
- type ShadowsocksNonePacketParser struct {}
166
+ func (p * SimpleSocks5PacketAdapter ) EncapsulatePacket (decryptedFullPacket []byte , socksAddrStart , payloadStart , payloadLength int ) (pkt []byte , err error ) {
167
+ start := socksAddrStart - 3
168
+ // RSV
169
+ decryptedFullPacket [start ] = 0
170
+ decryptedFullPacket [start + 1 ] = 0
171
+ // FRAG
172
+ decryptedFullPacket [start + 2 ] = 0
173
+ return decryptedFullPacket [start : payloadStart + payloadLength ], nil
174
+ }
175
+
176
+ // ShadowsocksNonePacketAdapter implements the 'none' mode of Shadowsocks.
177
+ type ShadowsocksNonePacketAdapter struct {}
157
178
158
- func (p * ShadowsocksNonePacketParser ) Name () string {
179
+ func (p * ShadowsocksNonePacketAdapter ) Name () string {
159
180
return "Shadowsocks none"
160
181
}
161
182
162
- func (p * ShadowsocksNonePacketParser ) ParsePacket (pkt []byte , start , length int ) (payloadStart , payloadLength int , detachedSocksAddr []byte , err error ) {
183
+ func (p * ShadowsocksNonePacketAdapter ) ParsePacket (pkt []byte , start , length int ) (payloadStart , payloadLength int , detachedSocksAddr []byte , err error ) {
163
184
// Validate socks address.
164
185
_ , err = socks .SplitAddr (pkt [start :])
165
186
if err != nil {
@@ -171,13 +192,17 @@ func (p *ShadowsocksNonePacketParser) ParsePacket(pkt []byte, start, length int)
171
192
return
172
193
}
173
194
195
+ func (p * ShadowsocksNonePacketAdapter ) EncapsulatePacket (decryptedFullPacket []byte , socksAddrStart , payloadStart , payloadLength int ) (pkt []byte , err error ) {
196
+ return decryptedFullPacket [socksAddrStart : payloadStart + payloadLength ], nil
197
+ }
198
+
174
199
func NewUDPSimpleTunnelService (tunnelListenAddress string , tunnelRemoteSocksAddr socks.Addr , multiplexUDP bool , natTimeout time.Duration , client Client ) Service {
175
200
return & UDPTunnel {
176
201
listenAddress : tunnelListenAddress ,
177
202
multiplexUDP : multiplexUDP ,
178
203
natTimeout : natTimeout ,
179
204
client : client ,
180
- packetParser : NewSimpleTunnelPacketParser (tunnelRemoteSocksAddr ),
205
+ packetAdapter : NewSimpleTunnelPacketAdapter (tunnelRemoteSocksAddr ),
181
206
}
182
207
}
183
208
@@ -187,7 +212,7 @@ func NewUDPSimpleSocks5Service(socks5ListenAddress string, multiplexUDP bool, na
187
212
multiplexUDP : multiplexUDP ,
188
213
natTimeout : natTimeout ,
189
214
client : client ,
190
- packetParser : & SimpleSocks5PacketParser {},
215
+ packetAdapter : & SimpleSocks5PacketAdapter {},
191
216
}
192
217
}
193
218
@@ -197,6 +222,6 @@ func NewUDPShadowsocksNoneService(ssNoneListenAddress string, multiplexUDP bool,
197
222
multiplexUDP : multiplexUDP ,
198
223
natTimeout : natTimeout ,
199
224
client : client ,
200
- packetParser : & ShadowsocksNonePacketParser {},
225
+ packetAdapter : & ShadowsocksNonePacketAdapter {},
201
226
}
202
227
}
0 commit comments