From 0ae2754c1e2ea44f3c821e00ba3f268dd2dfebdc Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Sat, 1 Aug 2026 11:47:50 +0300 Subject: [PATCH] make html formatting compatible with .md --- doc/html/devel/devref.html | 394 ++--- doc/html/faqe.html | 2 +- doc/html/faqr.html | 2 +- doc/html/highload.html | 32 +- doc/html/howtoe.html | 886 +++++----- doc/html/howtor.html | 2208 ++++++++++++------------ doc/html/plugins/TrafficPlugin.html | 2 +- doc/html/plugins/TrafficPlugin.ru.html | 12 +- 8 files changed, 1769 insertions(+), 1769 deletions(-) diff --git a/doc/html/devel/devref.html b/doc/html/devel/devref.html index ccd1cfe..58d51aa 100644 --- a/doc/html/devel/devref.html +++ b/doc/html/devel/devref.html @@ -1,134 +1,134 @@
- - -3proxy is implemented as multithread application. Server model is implemented as "one connection – one thread". It means, for every client connection new thread is created. This model is effective enough under Windows, because it allows it avoid thread creation on asynchronous operations, yet under most POSIX systems this model can not be considered as most efficient. It's planned for (very far in future) release to implement more efficient model, where single thread can serve few clients.
-3proxy begins with main thread. This thread parses configuration file and starts main loop. During configuration file parsing struct extaparam conf; structure is filled and service threads are started.
Main loop cycle takes approximately 1 second and does these tasks:
-It's guaranteed every configuration and schedule command is executed from the same thread.
-Main thread is implemented in 3proxy.c
-Service threads are started immediately, than service command (e.g. 'proxy' or 'socks') are found during configuration file parsing. Each command creates new thread. Thread does these tasks:
-struct srvparam srv structure with service configuration and struct clientparam defparam structure with default client configurationservice loop:
-struct clientparam newparam structure with client configurationstruct clientparam newparamservice threads are implemented in proxymain.c
-Please note: struct clientparam is freed and filter_clear is executed from different (client) thread.
-Client threads are started from service thread. Client thread:
-struct clientparam datain some point client thread may loop to process few client requests from the same connection (e.g. HTTP 'established' connection in 'proxy').
-Socket mapping does:
-client threads are implemented in proxy.c, socks.c, pop3p.c etc.
-3proxy plugin is any dynamic/shared library. There is no specific requirement for plugin, actually you can load any dynamic library with 'plugin' command. No linking with any libraries are required. However, to interoperate with 3proxy dynamic library must have an export function 3proxy may call to pass the structure with required information.
+3proxy is implemented as multithread application. Server model is implemented as "one connection – one thread". It means, for every client connection new thread is created. This model is effective enough under Windows, because it allows it avoid thread creation on asynchronous operations, yet under most POSIX systems this model can not be considered as most efficient. It's planned for (very far in future) release to implement more efficient model, where single thread can serve few clients.
+3proxy begins with main thread. This thread parses configuration file and starts main loop. During configuration file parsing struct extaparam conf; structure is filled and service threads are started.
Main loop cycle takes approximately 1 second and does these tasks:
+It's guaranteed every configuration and schedule command is executed from the same thread.
+Main thread is implemented in 3proxy.c
+Service threads are started immediately, than service command (e.g. 'proxy' or 'socks') are found during configuration file parsing. Each command creates new thread. Thread does these tasks:
+struct srvparam srv structure with service configuration and struct clientparam defparam structure with default client configurationservice loop:
+struct clientparam newparam structure with client configurationstruct clientparam newparamservice threads are implemented in proxymain.c
+Please note: struct clientparam is freed and filter_clear is executed from different (client) thread.
+Client threads are started from service thread. Client thread:
+struct clientparam datain some point client thread may loop to process few client requests from the same connection (e.g. HTTP 'established' connection in 'proxy').
+Socket mapping does:
+client threads are implemented in proxy.c, socks.c, pop3p.c etc.
+3proxy plugin is any dynamic/shared library. There is no specific requirement for plugin, actually you can load any dynamic library with 'plugin' command. No linking with any libraries are required. However, to interoperate with 3proxy dynamic library must have an export function 3proxy may call to pass the structure with required information.
typedef int (*PLUGINFUNC) (struct pluginlink *pluginlink, int argc, char** argv);
- struct pluginlink is a structure with export information, explained later, argc and argv are argument counter and array of arguments of "plugin" command. Plugin should report it's status with integer return value. 0 is success, positive value indicates non-recoverable error, 3proxy do not parse rest of configuration and enters into termination state, negative value indicates recoverable value, 3proxy logs warning (if possible). In case of C++, all 3proxy functions/structures must be extern "C".
All 3proxy structures/functions descriptions are located in structures.h
-Because there is no linking between 3proxy and plugin, all 3proxy functions and structures are passed with pluginlink structure. Pluginlink is actually a collection of pointers to 3proxy internal structures and functions. Because pluginlink is constantly extending, you should see it's definitions in structures.h.
-most important are:
+struct pluginlink is a structure with export information, explained later, argc and argv are argument counter and array of arguments of "plugin" command. Plugin should report it's status with integer return value. 0 is success, positive value indicates non-recoverable error, 3proxy do not parse rest of configuration and enters into termination state, negative value indicates recoverable value, 3proxy logs warning (if possible). In case of C++, all 3proxy functions/structures must be extern "C".
All 3proxy structures/functions descriptions are located in structures.h
+Because there is no linking between 3proxy and plugin, all 3proxy functions and structures are passed with pluginlink structure. Pluginlink is actually a collection of pointers to 3proxy internal structures and functions. Because pluginlink is constantly extending, you should see it's definitions in structures.h.
+most important are:
struct symbol symbols;
- "symbols" is a kind of name/value export table, made as a list. It can be used by plugins to exchange information and functions between plugins, e.g. to export functions from one plugin to another, where pluginlink is useless, because it's static. It's quite simple:
+"symbols" is a kind of name/value export table, made as a list. It can be used by plugins to exchange information and functions between plugins, e.g. to export functions from one plugin to another, where pluginlink is useless, because it's static. It's quite simple:
struct symbol {
- struct symbol *next;
- char * name;
- void * value;
+ struct symbol *next;
+ char * name;
+ void * value;
};
- name – is a name of function or structure
value – is it's value.
use pluginlink->findbyname function to lookup, e.g.
name – is a name of function or structure
value – is it's value.
use pluginlink->findbyname function to lookup, e.g.
anotherplugindata = pluginlink->findbyname("anotherplugindata");
- To export something from your plugin, add your structure to this list.
+To export something from your plugin, add your structure to this list.
struct extparam *conf;
- pointer to conf structure, it holds all current 3proxy configuration
-There are few points you can get control for your plugin, after it's loaded with 'plugin' command.
-A list of configuration file command, available from 3proxy.cfg is extendable. Each command is defined by struct commands:
pointer to conf structure, it holds all current 3proxy configuration
+There are few points you can get control for your plugin, after it's loaded with 'plugin' command.
+A list of configuration file command, available from 3proxy.cfg is extendable. Each command is defined by struct commands:
struct commands {
- struct commands *next;
- char * command;
- int (* handler)(int argc, unsigned char ** argv);
- int minargs;
- int maxargs;
+ struct commands *next;
+ char * command;
+ int (* handler)(int argc, unsigned char ** argv);
+ int minargs;
+ int maxargs;
};
- struct commands *next - next element in list
char * command – command name
int (* handler)(int argc, unsigned char ** argv) – command handler. It's called than 'command' is found in configuration files, argc is a number of arguments, counting command itself, argv is array of arguments.
minargs – minimum number of arguments command support (>= 1)
maxargs – maximum number of arguments command support, 0 means infinity.
Handler return value of 0 indicates command is successfully processed. Positive return value indicates non-recoverable error, 3proxy enters termination state. Negative value indicates 3proxy to continue to process command list, it makes it possible to set few handlers for the same command.
-A list of the command is pointed by pluginlink->commandhandlers; you must insert you command after first one (do not replace pluginlink->commandhandlers). It's guaranteed at least 1 dummy command is always present.
Example:
+struct commands *next - next element in list
char * command – command name
int (* handler)(int argc, unsigned char ** argv) – command handler. It's called than 'command' is found in configuration files, argc is a number of arguments, counting command itself, argv is array of arguments.
minargs – minimum number of arguments command support (>= 1)
maxargs – maximum number of arguments command support, 0 means infinity.
Handler return value of 0 indicates command is successfully processed. Positive return value indicates non-recoverable error, 3proxy enters termination state. Negative value indicates 3proxy to continue to process command list, it makes it possible to set few handlers for the same command.
+A list of the command is pointed by pluginlink->commandhandlers; you must insert you command after first one (do not replace pluginlink->commandhandlers). It's guaranteed at least 1 dummy command is always present.
Example:
int mycommandhandler(int argc, unsigned char **argv);
struct commands mycommand;
@@ -138,27 +138,27 @@ mycommand.intargs = 1;
mycommand.intargs = 2;
mycommand.next = pluginslinks->commandhandlers->next;
pluginslink->commandhandlers->next = &mycommand;
- Adds processor for "mycommand" command with zero on one arguments.
-Adding configuration command is useful, if your plugin expects configuration data.
-3proxy supports authentication and authorization. Authentication process determines user account (for example by username and password), authorization checks, if user account has a right to access given resource and optionally establishes a connection, if required.
-'auth' command combines both authentication and authorization method. It's extandable with struct auth list:
+Adds processor for "mycommand" command with zero on one arguments.
+Adding configuration command is useful, if your plugin expects configuration data.
+3proxy supports authentication and authorization. Authentication process determines user account (for example by username and password), authorization checks, if user account has a right to access given resource and optionally establishes a connection, if required.
+'auth' command combines both authentication and authorization method. It's extandable with struct auth list:
struct auth {
- struct auth *next;
- AUTHFUNC authenticate;
- AUTHFUNC authorize;
- char * desc;
+ struct auth *next;
+ AUTHFUNC authenticate;
+ AUTHFUNC authorize;
+ char * desc;
};
- char * desc – name of authentication/authorization method
authenticate – name of authentication function
authorize – name of authorization function
pluginlink->authfuncs points to list of authenticataction structures. Like above, new structure must be inserted after fiest one (or to the end of the list).
First, authentication is called, if authentication indicates OK status (return value 0), authorization is called. Normally, 'checkACL' (pluginlink->checkACL) is called as authorization function to check user's request matches to standard allow/deny rules. If for some reason you need to avoid this check, you should call pluginlink->alwaysauth to do some dirty job, like establishing outgoing connection.
char * desc – name of authentication/authorization method
authenticate – name of authentication function
authorize – name of authorization function
pluginlink->authfuncs points to list of authenticataction structures. Like above, new structure must be inserted after fiest one (or to the end of the list).
First, authentication is called, if authentication indicates OK status (return value 0), authorization is called. Normally, 'checkACL' (pluginlink->checkACL) is called as authorization function to check user's request matches to standard allow/deny rules. If for some reason you need to avoid this check, you should call pluginlink->alwaysauth to do some dirty job, like establishing outgoing connection.
typedef int (*AUTHFUNC)(struct clientparam * param);
- is both authentication and authorization function. struct clientparam holds all information about client connection, including username (param->username) and password (param->password).
Return value of 0 indicates successful authentication/authorization, 1 and 3 – authorization failed (access denied), use 3 in case you want to indicate access is explicitly denied and 3 in case there is no matching rule. 4,5,6,7,8 – authentication failed (e.g. username/password do not match). 4 indicates username does not present in request and must be requested, if possible. 5 indicates username found in request can not be found in user's database/list, 6,7,8 – username does not match password for different authentication types. 10 – user exceeded some limits, e.g. traffic. You may use some different code to indicate internal problems.
-Example:
+is both authentication and authorization function. struct clientparam holds all information about client connection, including username (param->username) and password (param->password).
Return value of 0 indicates successful authentication/authorization, 1 and 3 – authorization failed (access denied), use 3 in case you want to indicate access is explicitly denied and 3 in case there is no matching rule. 4,5,6,7,8 – authentication failed (e.g. username/password do not match). 4 indicates username does not present in request and must be requested, if possible. 5 indicates username found in request can not be found in user's database/list, 6,7,8 – username does not match password for different authentication types. 10 – user exceeded some limits, e.g. traffic. You may use some different code to indicate internal problems.
+Example:
int myauthfunc(struct clientparam *param);
struct auth myauth;
@@ -167,27 +167,27 @@ myauth.authenticate = myauthfunc;
myauth.authorize = pluginlink->checkACL;
myauth->next = pluginlink->authfuncs->next;
pluginlink->authfuncs->next = &myauth;
- Installs "myauthfunc" as authentication function. There is no need to add 'auth' command processor for new authentication type, it's processed by standard 'auth' command processor.
-Scheduled functions are described by this structure:
+Installs "myauthfunc" as authentication function. There is no need to add 'auth' command processor for new authentication type, it's processed by standard 'auth' command processor.
+Scheduled functions are described by this structure:
typedef enum {NONE, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, ANNUALLY, NEVER} ROTATION;
struct schedule {
- struct schedule *next;
- ROTATION type;
- void *data;
- int (*function)(void *);
- time_t start_time;
+ struct schedule *next;
+ ROTATION type;
+ void *data;
+ int (*function)(void *);
+ time_t start_time;
};
- int (*function)(void *) – scheduled function
void *data – this pointer will be passed as an argument to scheduled functions
ROTATION type – defines how often function is called (once in a minute, hour, etc).
start_time – time to begin using of scheduled function
Scheduled functions are called every 'type' interval after start_time and also on reloading configuration and going to termination state.
-Schedule function return value of 1 means function must be removed from the schedule. 3proxy doesn't free struct schedule.
-Schedule list can be empty. Pointer to schedule is pointed by struct schedule ** schedule; in pluginlink.
Example:
+int (*function)(void *) – scheduled function
void *data – this pointer will be passed as an argument to scheduled functions
ROTATION type – defines how often function is called (once in a minute, hour, etc).
start_time – time to begin using of scheduled function
Scheduled functions are called every 'type' interval after start_time and also on reloading configuration and going to termination state.
+Schedule function return value of 1 means function must be removed from the schedule. 3proxy doesn't free struct schedule.
+Schedule list can be empty. Pointer to schedule is pointed by struct schedule ** schedule; in pluginlink.
Example:
int myschedfunc(void * data);
struct schedule myschedule;
@@ -197,62 +197,62 @@ myschedule.type = MINUTELY;
myschedule.starttime = 0;
myschedule.next = *pluginlink->schedule;
*pluginlink->schedule = myschedule;
- NOTE: time_t is different for different compilers. Make sure to compile plugin and 3proxy with same compiler.
-3proxy has filters API, you can use, to process client request and data flowing through proxy. It should be noted, that currently 3proxy doesn't provide filters with any useful data conversion, so, it's filter's task to find data in data flow. In case filter modifies some data, it's filter's task again to assure that everything's fine. If you know some filtering API like MILTER, you will find 3proxy filters very same.
+NOTE: time_t is different for different compilers. Make sure to compile plugin and 3proxy with same compiler.
+3proxy has filters API, you can use, to process client request and data flowing through proxy. It should be noted, that currently 3proxy doesn't provide filters with any useful data conversion, so, it's filter's task to find data in data flow. In case filter modifies some data, it's filter's task again to assure that everything's fine. If you know some filtering API like MILTER, you will find 3proxy filters very same.
typedef enum {
- PASS,
- CONTINUE,
- HANDLED,
- REJECT,
- REMOVE
+ PASS,
+ CONTINUE,
+ HANDLED,
+ REJECT,
+ REMOVE
} FILTER_ACTION;
-typedef void* FILTER_OPEN(void * idata, struct srvparam * param);
-typedef FILTER_ACTION FILTER_CLIENT(void *fo, struct clientparam * param, void** fc);
-typedef FILTER_ACTION FILTER_BUFFER(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
-typedef void FILTER_CLOSE(void *fo);
+typedef void* FILTER_OPEN(void * idata, struct srvparam * param);
+typedef FILTER_ACTION FILTER_CLIENT(void *fo, struct clientparam * param, void** fc);
+typedef FILTER_ACTION FILTER_BUFFER(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
+typedef void FILTER_CLOSE(void *fo);
struct filter {
- struct filter * next;
- char * instance;
- void * data;
- FILTER_OPEN *filter_open;
- FILTER_CLIENT *filter_client;
- FILTER_BUFFER *filter_request;
- FILTER_BUFFER *filter_header_cli;
- FILTER_BUFFER *filter_header_srv;
- FILTER_BUFFER *filter_data_cli;
- FILTER_BUFFER *filter_data_srv;
- FILTER_CLOSE *filter_clear;
- FILTER_CLOSE *filter_close;
+ struct filter * next;
+ char * instance;
+ void * data;
+ FILTER_OPEN *filter_open;
+ FILTER_CLIENT *filter_client;
+ FILTER_BUFFER *filter_request;
+ FILTER_BUFFER *filter_header_cli;
+ FILTER_BUFFER *filter_header_srv;
+ FILTER_BUFFER *filter_data_cli;
+ FILTER_BUFFER *filter_data_srv;
+ FILTER_CLOSE *filter_clear;
+ FILTER_CLOSE *filter_close;
};
- char * instance – is some instance identifier. You can use it to find required filter in the list. 3proxy itself doesn't use this field.
void * data – this parameter is passed to filter_open function. The rest are filtering functions. Section 1 explains where and then each filter is called. data should not be NULL.
filter_open must always be defined, if you want filter to be ever used. It's called then new service is created and is given "data" from struct filter and struct srvparam (parsed service configuration). If filter_open for some filter returns NULL, filter will not be used for this service. Non-NULL return value will be used as "fo" parameter for every call to filter_client.
filter_client is called upon client connect (before any data is sent/received). It's good place to filter client by IP (and is not good place to filter it by hostname, because this operation takes a long time, 3proxy will not be able to accept new connection). fo is a data pointer received from filter_open, param – newly created clientparam structure, fc is return parameter filter_open must initialize, it will be used as an argument to FILTER_BUFFER functions. PASS return value means this filter will be used for this client request. CONTINUE says to install filters. On different values client connection is closed and no client thread is created.
filter_request, filter_header_cli, filter_header_srv, filter_data_cli, filter_data_srv are used to process request and data received from client and server.
char ** buf_p is a pointer to current buffer, int * bufsize_p is a pointer to it's size. In case you change some data and it doesn't fit to current buffer, you may allocate new buffer (with pluginlink->myalloc), copy data from old buffer, free old buffer (with pluginlink->myfree) and set new values for *buf_p and *bufsize_p.
int offset offset of the new data in the buffer, int * length_p length of all data in the buffer. You should filter only (*length_p - *offset_p) characters starting from (*buf_p + *offset_p).
filter_clear is called for each successfule filter_client and should be used to free allocated resources
filter_close is called for each successful filter_open for the same reason
An example of filter API usage you can find in PCREPlugin (see plugins/PCREPlugin/pcre_plugin.c).
-Note: if param->nooverwritefilter is set for FILTER_BUFFER functions, filter may change data in the buffer, but must not change data length. This flag may be set, if data size if already known and is sent to the client.
Log, traffic and bandwidth function can be directly replaced in any over place. All functions may be replaced in conf (pluginlink->conf->logfunc, pluginlink->conf->bandlimfunc, pluginlink->conf->trafcountfunc). In this case, these functions will be used for services started after the changes are made. logfunc may also be changed for struct srvparam (e.g. within filter_open), bandlimfunc and trafcountfunc may be changed in struct clientparam for every client individually (e.g. within filter_client).
char * instance – is some instance identifier. You can use it to find required filter in the list. 3proxy itself doesn't use this field.
void * data – this parameter is passed to filter_open function. The rest are filtering functions. Section 1 explains where and then each filter is called. data should not be NULL.
filter_open must always be defined, if you want filter to be ever used. It's called then new service is created and is given "data" from struct filter and struct srvparam (parsed service configuration). If filter_open for some filter returns NULL, filter will not be used for this service. Non-NULL return value will be used as "fo" parameter for every call to filter_client.
filter_client is called upon client connect (before any data is sent/received). It's good place to filter client by IP (and is not good place to filter it by hostname, because this operation takes a long time, 3proxy will not be able to accept new connection). fo is a data pointer received from filter_open, param – newly created clientparam structure, fc is return parameter filter_open must initialize, it will be used as an argument to FILTER_BUFFER functions. PASS return value means this filter will be used for this client request. CONTINUE says to install filters. On different values client connection is closed and no client thread is created.
filter_request, filter_header_cli, filter_header_srv, filter_data_cli, filter_data_srv are used to process request and data received from client and server.
char ** buf_p is a pointer to current buffer, int * bufsize_p is a pointer to it's size. In case you change some data and it doesn't fit to current buffer, you may allocate new buffer (with pluginlink->myalloc), copy data from old buffer, free old buffer (with pluginlink->myfree) and set new values for *buf_p and *bufsize_p.
int offset offset of the new data in the buffer, int * length_p length of all data in the buffer. You should filter only (*length_p - *offset_p) characters starting from (*buf_p + *offset_p).
filter_clear is called for each successfule filter_client and should be used to free allocated resources
filter_close is called for each successful filter_open for the same reason
An example of filter API usage you can find in PCREPlugin (see plugins/PCREPlugin/pcre_plugin.c).
+Note: if param->nooverwritefilter is set for FILTER_BUFFER functions, filter may change data in the buffer, but must not change data length. This flag may be set, if data size if already known and is sent to the client.
Log, traffic and bandwidth function can be directly replaced in any over place. All functions may be replaced in conf (pluginlink->conf->logfunc, pluginlink->conf->bandlimfunc, pluginlink->conf->trafcountfunc). In this case, these functions will be used for services started after the changes are made. logfunc may also be changed for struct srvparam (e.g. within filter_open), bandlimfunc and trafcountfunc may be changed in struct clientparam for every client individually (e.g. within filter_client).
typedef void (*LOGFUNC)(struct clientparam * param, const unsigned char * test);
typedef void (*TRAFCOUNTFUNC)(struct clientparam * param);
typedef unsigned (*BANDLIMFUNC)(struct clientparam * param, unsigned nbytesin, unsigned nbytesout);
- struct clientparam * param – information about client request
char * text - text string (e.g. request)
nbytesin, nbytesout – number of bytes received from / send to server. bandlimfunc returns delay in milliseconds.
struct clientparam * param – information about client request
char * text - text string (e.g. request)
nbytesin, nbytesout – number of bytes received from / send to server. bandlimfunc returns delay in milliseconds.
File descriptors. 3proxy needs 2 descriptors per connection (4 for FTP), plus one per service, plus temporary ones for name resolution and RADIUS.
-fs.nr_open = 1048576 # (1048576) upper bound for any process' RLIMIT_NOFILE +fs.nr_open = 1048576 # (1048576) upper bound for any process' RLIMIT_NOFILEulimit -n (RLIMIT_NOFILE) is the limit that actually applies and is commonly left at 1024; it must be raised for the 3proxy process itself, see "Setting ulimits" @@ -134,9 +134,9 @@ changing. reached earlier with 3proxy than with event-driven servers. Each thread also consumes one or two mappings, so vm.max_map_count matters too.
-kernel.threads-max = 200000 # (~60000 on a 16G host, scales with RAM) -kernel.pid_max = 4194304 # (4194304) -vm.max_map_count = 1048576 # (1048576) +kernel.threads-max = 200000 # (~60000 on a 16G host, scales with RAM) +kernel.pid_max = 4194304 # (4194304) +vm.max_map_count = 1048576 # (1048576)RLIMIT_NPROC (ulimit -u) limits threads per user and must be raised as well. Check the actual thread count with grep Threads /proc/PID/status. @@ -145,28 +145,28 @@ Check the actual thread count with grep Threads /proc/PID/status. 'backlog' command is given, so a large 'maxconn' does not automatically give a large queue, and the kernel caps it at somaxconn:
-net.core.somaxconn = 4096 # (4096) -net.ipv4.tcp_max_syn_backlog = 4096 # (512) raise for bursty connection rates -net.ipv4.tcp_syncookies = 1 # (1) keep enabled +net.core.somaxconn = 4096 # (4096) +net.ipv4.tcp_max_syn_backlog = 4096 # (512) raise for bursty connection rates +net.ipv4.tcp_syncookies = 1 # (1) keep enabled
Ephemeral ports and TIME_WAIT. See "Extending the Ephemeral Port Range" above for the multi-IP case. The range gives about 28000 outgoing connections per destination address by default:
-net.ipv4.ip_local_port_range = 10240 65535 # (32768 60999) -net.ipv4.tcp_tw_reuse = 2 # (2) reuse TIME_WAIT for outgoing connections -net.ipv4.tcp_fin_timeout = 30 # (60) +net.ipv4.ip_local_port_range = 10240 65535 # (32768 60999) +net.ipv4.tcp_tw_reuse = 2 # (2) reuse TIME_WAIT for outgoing connections +net.ipv4.tcp_fin_timeout = 30 # (60)Do not enable tcp_tw_recycle; it was removed in kernel 4.12 and breaks NAT clients.
Socket buffers. Autotuning is usually right. Buffer memory is per connection, so raising the maximums with tens of thousands of connections costs a lot of RAM:
-net.core.rmem_max = 4194304 # (212992) -net.core.wmem_max = 4194304 # (212992) -net.ipv4.tcp_rmem = 4096 131072 6291456 # (same) min default max -net.ipv4.tcp_wmem = 4096 16384 4194304 # (same) +net.core.rmem_max = 4194304 # (212992) +net.core.wmem_max = 4194304 # (212992) +net.ipv4.tcp_rmem = 4096 131072 6291456 # (same) min default max +net.ipv4.tcp_wmem = 4096 16384 4194304 # (same)Raise these only for high bandwidth-delay product links, and prefer raising the third (max) value and leaving the default alone. @@ -177,8 +177,8 @@ it does, the table is exhausted long before 3proxy's own limits, with
net.netfilter.nf_conntrack_max = 1048576 net.netfilter.nf_conntrack_buckets = 262144 -net.netfilter.nf_conntrack_tcp_timeout_established = 3600 # (432000, i.e. 5 days) -net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30 # (120) +net.netfilter.nf_conntrack_tcp_timeout_established = 3600 # (432000, i.e. 5 days) +net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30 # (120)nf_conntrack_max defaults to nf_conntrack_buckets, which itself is derived from the amount of RAM, so it is often much lower than expected on small machines. Each diff --git a/doc/html/howtoe.html b/doc/html/howtoe.html index 1c25214..88cf80e 100644 --- a/doc/html/howtoe.html +++ b/doc/html/howtoe.html @@ -2,74 +2,74 @@
-
Extract source code files from 3proxy.tgz (with WinZip or another utility) or use git.
@@ -78,7 +78,7 @@ nmake /f Makefile.msvc
Binaries will be placed in the bin/ directory.
CMake provides a cross-platform build system. It works on Windows (MSVC, MinGW), Linux, macOS, and BSD.
Basic build steps:
@@ -100,7 +100,7 @@ cmake -D3PROXY_USE_OPENSSL=ON -D3PROXY_USE_PCRE2=ON ..
Available options: 3PROXY_USE_OPENSSL, 3PROXY_USE_PCRE2, 3PROXY_USE_PAM, 3PROXY_USE_ODBC.
Binaries will be placed in the build/bin/ directory.
For Linux, use:
@@ -119,16 +119,16 @@ sure to use GNU make; sometimes it's called gmake instead of make. and add the ODBC library to the linker variable.
Binaries will be placed in thebin/directory. -
-
Unpack 3proxy.zip to any directory, for example c:\Program Files\3proxy. If needed, create a directory for storing log files, -ODBC sources, etc. Create 3proxy.cfg in the 3proxy installation directory (see Server configuration). +ODBC sources, etc. Create 3proxy.cfg in the 3proxy installation directory (see Server configuration). Now, start a command prompt (cmd.exe). Change to the 3proxy installation directory and run 3proxy.exe --install:
@@ -148,10 +148,10 @@ C:\Program Files\3proxy>3proxy.exe --removeNow you can simply remove the 3proxy installation directory. -
Using Makefile:
-
Compile 3proxy (see Compilation) then run:
+
Compile 3proxy (see Compilation) then run:
sudo make install@@ -186,7 +186,7 @@ sudo systemctl enable 3proxy sudo systemctl start 3proxy -
Using CMake (recommended):
@@ -216,22 +216,22 @@ This installs binaries to/usr/local/3proxy/bin/and configuration Service management with launchd:
After installation via cmake, the service can be managed with launchctl:-# Load and start the service +# Load and start the service sudo launchctl load /Library/LaunchDaemons/org.3proxy.3proxy.plist -# Stop the service +# Stop the service sudo launchctl stop org.3proxy.3proxy -# Start the service +# Start the service sudo launchctl start org.3proxy.3proxy -# Unload and disable the service +# Unload and disable the service sudo launchctl unload /Library/LaunchDaemons/org.3proxy.3proxy.plistThe service runs as userproxy(created during installation). Configuration file:/etc/3proxy/3proxy.cfg-
Using pre-built images from GitHub Container Registry:
@@ -262,18 +262,18 @@ The configuration file must be placed at/path/to/config/3proxy.cfgBy default, 3proxy runs in chroot environment with uid/gid 65535. Usenserverin config for DNS resolution in chroot. For non-chroot execution, mount config to/etc/3proxy. -
-
A valid configuration file is required. -
The most probable reasons for non-working limitations: 'auth none' or no auth is used. For any ACL-based feature, one of 'iponly', 'nbname', or 'strong' auth is required. The sequence of commands may be invalid. Commands are executed one-by-one, and 'proxy', 'tcppm', 'socks', or another service commands must follow a valid configuration. An invalid sequence of ACLs. The first matching ACL is used (except for internal redirections, see below). If an ACL contains at least one record, the last record is assumed to be 'deny *'. -
Possible reasons for 3proxy starting manually but failing to start as a service:
How to understand internal and external +
How to understand internal and external
Both internal and external IPs are IPs of the host running 3proxy itself. This configuration option is useful in situations where 3proxy is running on a @@ -302,7 +302,7 @@ border host with 2 (or more) connections: e.g., LAN and WAN with different IPs LAN connection +-------------+ Internet connection LAN <-------------->| 3proxy host |<-------------------> INTERNET ^+-------------+^ - | | + | | Internal IP External IP If 3proxy is used on a host with a single connection, both internal and @@ -325,34 +325,34 @@ an external address is required, create a script to determine the current extern IP and save it to a file, and use external "$path_to_file" with the "monitor" command to automatically reload the configuration on address change. -
Check that you are using a system DSN. Check that the SQL request is valid. The best way to check is to use file or stdout logging, get the SQL request from the log file or console, and execute this request manually. Under Unix, you may also want to adjust the 'stacksize' parameter. -
The proxy cannot access a destination directly over IPv6 if the client requests an IPv4 address. To access an IPv6 destination, either an IPv6 address or a hostname must be used in the request. The best solution is to enable the option to resolve hostnames via the proxy on the client side. -
The default stacksize may be insufficient if some non-default plugins - are used (e.g., PAM and ODBC on Linux) or if compiled on some platforms with - invalid system-defined values (a few versions of FreeBSD on amd64). - The problem can be resolved with the 'stacksize' command or '-S' option starting with 3proxy 0.8.4. + are used (e.g., PAM and ODBC on Linux) or if compiled on some platforms with + invalid system-defined values (a few versions of FreeBSD on amd64). + The problem can be resolved with the 'stacksize' command or '-S' option starting with 3proxy 0.8.4. -
A server configuration example, 3proxy.cfg.sample, is included in every 3proxy distribution.
-3proxy can log to stdout, a file, an ODBC datasource, or syslog (Unix/Linux/Cygwin only). To use ODBC under Unix/Linux, you must -compile 3proxy with Unix ODBC libraries; see Compilation. +compile 3proxy with Unix ODBC libraries; see Compilation. You can control logging from 3proxy.cfg for all services, or you can control logging for an individual service. For example, /usr/local/sbin/socks -l/var/log/socks.log starts a SOCKS proxy with logging to a file. @@ -360,119 +360,119 @@ For the universal proxy (3proxy), log file rotation and archiving are supported. The log type is defined with the "log" configuration file command or with the -l switch on individual service invocation. log or -l with no argument is stdout logging.
- log filename + log filenameand
- -lfilename + -lfilenamespecify a filename for logging.
- log @ident + log @identand
- -l@ident + -l@identspecify an ident for syslog logging. If the filename within the "log" command contains '%' characters, it is processed as a format specifier (see "logformat"). E.g., log c:\3proxy\logs\%y%m%d.log D creates a file like c:\3proxy\logs\060729.log; the date is generated based on local time.
- log &connstring + log &connstring;specifies an ODBC connection string; connstring is in the format datasource,username,password (the last two are optional if the datasource does not require or already has authentication information). Also, you must specify logformat to build the SQL query to insert a record into -the log; see How to set up logging format +the log; see How to set up logging format
Rotation and archiving may be set up with log, rotate, and archiver commands.
- log filename LOGTYPE + log filename LOGTYPEsets the rotation type. LOGTYPE may be:
- rotate NUMBER + rotate NUMBER- specifies the number of files in rotation (i.e., how many files to keep). + specifies the number of files in rotation (i.e., how many files to keep).
- archiver EXT COMMAND PARAMETERS + archiver EXT COMMAND PARAMETERS- Sets an external archiver. EXT is the extension of archived files - (for example, zip, gz, Z, rar, etc.). COMMAND and PARAMETERS are the command - to execute and its command-line parameters. The original file is not deleted by - 3proxy; this work is left for the archiver. - You can pass the original filename to the archiver with the %F macro and the archive filename with %A. - Examples are located in - 3proxy.cfg.sample + Sets an external archiver. EXT is the extension of archived files + (for example, zip, gz, Z, rar, etc.). COMMAND and PARAMETERS are the command + to execute and its command-line parameters. The original file is not deleted by + 3proxy; this work is left for the archiver. + You can pass the original filename to the archiver with the %F macro and the archive filename with %A. + Examples are located in + 3proxy.cfg.sample -
- Since version 0.3, the log format may be set with the "logformat" command. - The first symbol of the log format specifies the format of the date and time and - should be L (LOCAL) or G (GMT - Greenwich Meridian Time). The format - string may contain some macro substitutions: -
logformat "L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"- generates something like + generates something like
1042454727.0296 SOCK4.1080 000 3APA3A 127.0.0.1:4739 195.122.226.28:4739 505 18735 1 GET http://3proxy.org/ HTTP/1.1
(no line breaks)
- If ODBC is used, logformat should specify the SQL command - to insert a record into the log, for example: + If ODBC is used, logformat should specify the SQL command + to insert a record into the log, for example:
logformat "-\'+_GINSERT INTO proxystat VALUES (%t, '%c', '%U', %I)"
Just make the format of 3proxy logs compatible with a format supported by your favorite log analyzer. Examples of compatible logformats are: @@ -488,24 +488,24 @@ or, a more compatible format without %D: ISA 2000 proxy WEBEXTD.LOG (fields are TAB-delimited):
-"- + L%C %U Unknown Y %Y-%m-%d %H:%M:%S - w3proxy 3PROXY - %n %R %r %D - %O %I http TCP %1-1T %2-2T - - - %E - - -" +"- + L%C %U Unknown Y %Y-%m-%d %H:%M:%S + w3proxy 3PROXY - %n %R %r %D + %O %I http TCP %1-1T %2-2T - - + %E - - -"ISA 2004 proxy WEB.w3c (fields are TAB-delimited):
-"- + L%C %U Unknown %Y-%m-%d %H:%M:%S - 3PROXY - %n %R %r %D %O - %I http %1-1T %2-2T - %E - - - Internal External 0x0 Allowed" +"- + L%C %U Unknown %Y-%m-%d %H:%M:%S + 3PROXY - %n %R %r %D %O + %I http %1-1T %2-2T - %E - + - Internal External 0x0 Allowed"ISA 2000/2004 firewall FWSEXTD.log (fields are TAB-delimited):
-"- + L%C %U unknown:0:0.0 N %Y-%m-%d - %H:%M:%S fwsrv 3PROXY - %n %R %r - %D %O %I %r TCP Connect - - - - %E - - - - -" +"- + L%C %U unknown:0:0.0 N %Y-%m-%d + %H:%M:%S fwsrv 3PROXY - %n %R %r + %D %O %I %r TCP Connect - - + - %E - - - - -"HTTPD standard log (Apache and others):
@@ -515,7 +515,7 @@ or a more compatible format without the error code:
"-""+_L%C - %U [%d/%o/%Y:%H:%M:%S %z] ""%T"" 200 %I"
3proxy is distributed in 2 variants: as a set of standalone modules (proxy,
socks, pop3p, tcppm, udppm) and as a universal proxy server. These services are
@@ -552,7 +552,7 @@ except socks, which is started with port 3129.
All logs are in the file /var/log/3proxy.log (with daily date modification and
rotation). The 30 most recent files are stored.
The -i option specifies the internal interface; -p specifies the listening port. No spaces are
allowed. To bind the 'proxy' service to port 8080 on interfaces 192.168.1.1
@@ -562,30 +562,30 @@ proxy -p8080 -i192.168.1.1
proxy -p8080 -i192.168.2.1
- A: Use one of proxy, connect+, socks4+, or socks5+ as the parent type. 3proxy
- itself still performs name resolution; it's required, e.g., for ACL matching.
- So, if no name resolution must be performed by 3proxy itself, add the command
+
+ A: Use one of proxy, connect+, socks4+, or socks5+ as the parent type. 3proxy
+ itself still performs name resolution; it's required, e.g., for ACL matching.
+ So, if no name resolution must be performed by 3proxy itself, add the command
fakeresolve
- This command resolves any name to the 127.0.0.2 address.
-
- There is FTP over HTTP (what is called FTP proxy in browsers) and FTP over FTP - (what is called FTP proxy in file managers and FTP clients). For browsers, there is no need to start an additional - proxy service; 'proxy' supports FTP over HTTP. Configure the 'proxy' port as an FTP proxy. For FTP clients and file - managers, use ftppr. The FTP proxy supports both active and passive mode with the client but always uses passive mode with FTP servers. -
-- An SNI proxy can be used to transparently redirect any TLS traffic with an external router or via local redirection rules. It can also be used - to extract hostnames from TLS to use in ACLs in combination with SOCKS or HTTP(s) proxy and/or the Transparent plugin. It can also be used to require TLS or mTLS between services. The TLS handshake contains no - port information; if tlspr is used as a standalone service, the destination port may be either detected with the Transparent plugin or configured with the -P option (default 443). - Note: tlspr does not support user authentication (there are no credentials in the TLS handshake to authenticate against); use ACLs by IP or a parent proxy with authentication if access control is required. -
- Options: + This command resolves any name to the 127.0.0.2 address. +
++ There is FTP over HTTP (what is called FTP proxy in browsers) and FTP over FTP + (what is called FTP proxy in file managers and FTP clients). For browsers, there is no need to start an additional + proxy service; 'proxy' supports FTP over HTTP. Configure the 'proxy' port as an FTP proxy. For FTP clients and file + managers, use ftppr. The FTP proxy supports both active and passive mode with the client but always uses passive mode with FTP servers. +
++ An SNI proxy can be used to transparently redirect any TLS traffic with an external router or via local redirection rules. It can also be used + to extract hostnames from TLS to use in ACLs in combination with SOCKS or HTTP(s) proxy and/or the Transparent plugin. It can also be used to require TLS or mTLS between services. The TLS handshake contains no + port information; if tlspr is used as a standalone service, the destination port may be either detected with the Transparent plugin or configured with the -P option (default 443). + Note: tlspr does not support user authentication (there are no credentials in the TLS handshake to authenticate against); use ACLs by IP or a parent proxy with authentication if access control is required. +
+ Options:
-P <port> - destination port (default: 443) -c <level> - TLS check level: @@ -606,17 +606,17 @@ tlspr supports both: for implicit TLS the destination host is taken from SNI and the -X option makes tlspr speak the plaintext protocol phase with the client (greeting, STARTTLS command) before upgrading both sides to TLS. Example:- --# https (implicit) +# https (implicit) tlspr -p443 -P443 -c1 -# imaps (implicit) +# imaps (implicit) tlspr -p993 -P993 -c1 -# submissions (implicit) +# submissions (implicit) tlspr -p465 -P465 -c1 -# imap STARTTLS (explicit) +# imap STARTTLS (explicit) tlspr -p143 -P143 -Ximap -# submission STARTTLS (explicit) +# submission STARTTLS (explicit) tlspr -p587 -P587 -Xsmtp -# pop3 STLS (explicit) +# pop3 STLS (explicit) tlspr -p110 -P110 -Xpop3@@ -685,8 +685,8 @@ deny * * blocked.example.com allow * proxy
dnspr is a DNS forwarding service. It answers queries from the 3proxy name cache (including static nsrecord entries), forwards other queries to the resolvers configured with nserver, and caches the results if @@ -705,15 +705,15 @@ nscache 65536 nscache6 65536 dnspr -p53 -# google +# google nsrecord smtp.gmail.com 10.0.0.1 nsrecord imap.gmail.com 10.0.0.1 nsrecord pop.gmail.com 10.0.0.1 -# mail.ru +# mail.ru nsrecord smtp.mail.ru 10.0.0.1 nsrecord imap.mail.ru 10.0.0.1 nsrecord pop.mail.ru 10.0.0.1 -# yandex.ru +# yandex.ru nsrecord smtp.yandex.ru 10.0.0.1 nsrecord imap.yandex.ru 10.0.0.1 nsrecord pop.yandex.ru 10.0.0.1 @@ -726,8 +726,8 @@ nscache 65536 nscache6 65536 dnspr -p53 -F10.0.0.1 -
-Since version 0.9.7, SSL/TLS support is built into 3proxy when compiled with OpenSSL (WITH_SSL). Previously available as SSLPlugin, the functionality is now integrated @@ -820,15 +820,15 @@ ssl_nocli
This creates an HTTPS proxy (ssl_serv) that accepts TLS connections from clients. For parent proxy connections, user1's traffic goes through an https parent with TLS encryption (secure type), while user2's traffic goes through a regular socks5 parent without TLS. Secure parent types include: tcps, https, connects, connect+s, socks4s, socks5s, socks4+s, socks5+s, pop3s, smtps, ftps.
-
Creating a Certificate Authority (CA):
For MITM or mTLS, you need a CA. Generate a CA private key and certificate:
-# Generate CA private key
+# Generate CA private key
openssl genrsa -out ca.key 4096
-# Generate CA certificate (valid for 10 years)
+# Generate CA certificate (valid for 10 years)
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
-subj "/C=US/ST=State/L=City/O=MyOrg/CN=My CA" \
-out ca.crt
@@ -840,15 +840,15 @@ For MITM, import ca.crt into client browsers/OS as a trusted root CA.
Creating a server certificate for https:// proxy:
The server certificate must have proper Subject Alternative Names (SAN):
-# Generate server private key
+# Generate server private key
openssl genrsa -out server.key 2048
-# Create a certificate signing request (CSR)
+# Create a certificate signing request (CSR)
openssl req -new -key server.key \
-subj "/C=US/ST=State/L=City/O=MyOrg/CN=proxy.example.com" \
-out server.csr
-# Create extensions file for SAN
+# Create extensions file for SAN
cat > server.ext << 'EOF'
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
@@ -862,7 +862,7 @@ DNS.2 = proxy
IP.1 = 192.168.1.100
EOF
-# Sign the certificate with CA
+# Sign the certificate with CA
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 365 -sha256 \
-extfile server.ext
@@ -873,27 +873,27 @@ For a public https:// proxy, use a CA like Let's Encrypt instead of self-signed.
Creating a client certificate for mTLS:
-# Generate client private key
+# Generate client private key
openssl genrsa -out client1.key 2048
-# Create CSR
+# Create CSR
openssl req -new -key client1.key \
-subj "/C=US/ST=State/L=City/O=MyOrg/CN=client1" \
-out client1.csr
-# Create extensions file
+# Create extensions file
cat > client.ext << 'EOF'
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
extendedKeyUsage = clientAuth
EOF
-# Sign with CA
+# Sign with CA
openssl x509 -req -in client1.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out client1.crt -days 365 -sha256 \
-extfile client.ext
-# Create PKCS#12 bundle for browser import
+# Create PKCS#12 bundle for browser import
openssl pkcs12 -export -out client1.p12 \
-inkey client1.key -in client1.crt -certfile ca.crt
@@ -903,15 +903,15 @@ Import client1.p12 into the client browser or OS certificate store.
Quick setup script for development/testing:
-#!/bin/sh
-# Creates CA, server, and client certificates for SSLPlugin testing
+#!/bin/sh
+# Creates CA, server, and client certificates for SSLPlugin testing
-# CA
+# CA
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
-subj "/CN=3proxy CA" -out ca.crt
-# Server
+# Server
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=localhost" -out server.csr
cat > server.ext << 'EOF'
@@ -923,7 +923,7 @@ EOF
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 365 -sha256 -extfile server.ext
-# Client
+# Client
openssl genrsa -out client.key 2048
openssl req -new -key client.key -subj "/CN=client" -out client.csr
cat > client.ext << 'EOF'
@@ -935,7 +935,7 @@ openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key \
openssl pkcs12 -export -out client.p12 -passout pass: \
-inkey client.key -in client.crt -certfile ca.crt
- Since version 0.9.7, PCRE (Perl Compatible Regular Expressions) filtering is built into 3proxy when compiled with PCRE2 support (WITH_PCRE). Previously available as PCREPlugin, @@ -980,13 +980,13 @@ matches the connection data.
Examples:
-# Block requests containing specific keywords for certain users +# Block requests containing specific keywords for certain users pcre request deny "porn|sex" user1,user2,user3 192.168.0.0/16 -# Block responses with specific content type +# Block responses with specific content type pcre srvheader deny "Content-type: application" -# Replace content in both directions (censorship) +# Replace content in both directions (censorship) pcre_rewrite clidata,srvdata dunno "porn|sex|pussy" "***" baduser pcre_extend deny * 192.168.0.1/16@@ -994,11 +994,11 @@ pcre_extend deny * 192.168.0.1/16 Note: Regular expressions don't require authentication and cannot replace authentication and/or allow/deny ACLs. -
First, always specify the internal interface to accept incoming connections with the 'internal' configuration command or '-i' service command. (See -How to start any of the proxy services (HTTP, SOCKS, etc.)). If +How to start any of the proxy services (HTTP, SOCKS, etc.)). If no internal interface is specified, your proxy will act as an open proxy.
It's also important to specify the external interface to prevent access to the internal network with 'external' or -e. @@ -1040,7 +1040,7 @@ socks It's possible to authorize access by client IP address, IP address or requested resource, target port, time, etc., after authentication. -(See How to limit resource access). +(See How to limit resource access).
Since version 0.6, double authentication is possible, e.g.:
auth iponly strong @@ -1073,13 +1073,13 @@ proxy -n Please note that caching affects security. Never use caching for access to critical resources, such as web administration. -authcache can be used to bind a user's sessions to an IP with the 'limit' option. With +
authcache can be used to bind a user's sessions to an IP with the 'limit' option. With
authcache ip,user,pass,limit 120 auth cache strong- the user will not be able to use more than a single IP during the cache time (120 sec). - -
The user list is created with the 'users' command.
@@ -1097,10 +1097,10 @@ Please note the usage of quotation marks: they're required to escape the $ sign, which is otherwise used as a file inclusion macro. The following password types are available:
The commands allow, deny, and flush are used to manage ACLs:
@@ -1130,55 +1130,55 @@ allow <userlist> <sourcelist> <targetlist> <targetportlist&
The 'flush' command is used to finish with the existing ACL and start a new one.
It's required to have different ACLs for different services.
'allow' is used to allow a connection, and 'deny' to deny a connection. The 'allow'
-command can be extended by the 'parent' command to manage redirections (see How to manage redirections). If the ACL
+command can be extended by the 'parent' command to manage redirections (see How to manage redirections). If the ACL
is empty, it allows everything. If the ACL is not empty, the first matching ACL entry
is searched for the user request, and the ACL action (allow or deny) is performed. If
no matching record is found, the connection is denied, and the user will be asked to
re-authenticate (prompted for username/password). To prevent this prompt,
add 'deny *' to the end of the list.
-
-
* in an ACL means "any".
Usage examples can be found in 3proxy.cfg.sample.
CONNECT - establish an outgoing TCP connection, e.g., POP3 or SOCKSv5
-
BIND - allow an incoming TCP connection (SOCKSv5)
-
UDPASSOC - create a UDP association (SOCKSv5)
-
ICMPASSOC - create an ICMP association (not implemented)
-
HTTP_GET - HTTP GET request (HTTP proxy)
-
HTTP_PUT - HTTP PUT request (HTTP proxy)
-
HTTP_POST - HTTP POST request (HTTP proxy)
-
HTTP_HEAD - HTTP HEAD request (HTTP proxy)
-
HTTP_CONNECT - HTTP CONNECT, aka HTTPS request (HTTP proxy)
-
HTTP_OTHER - another HTTP request (HTTP proxy)
-
HTTP - any HTTP request except HTTP_CONNECT (HTTP proxy)
-
HTTPS - alias for HTTP_CONNECT (HTTP proxy)
-
FTP_GET - FTP get request (http, ftp proxy)
-
FTP_PUT - FTP put request (ftp proxy)
-
FTP_LIST - FTP list request (http, ftp proxy)
-
FTP - any FTP request
-
ADMIN - administration interface access
+
CONNECT - establish an outgoing TCP connection, e.g., POP3 or SOCKSv5
+
BIND - allow an incoming TCP connection (SOCKSv5)
+
UDPASSOC - create a UDP association (SOCKSv5)
+
ICMPASSOC - create an ICMP association (not implemented)
+
HTTP_GET - HTTP GET request (HTTP proxy)
+
HTTP_PUT - HTTP PUT request (HTTP proxy)
+
HTTP_POST - HTTP POST request (HTTP proxy)
+
HTTP_HEAD - HTTP HEAD request (HTTP proxy)
+
HTTP_CONNECT - HTTP CONNECT, aka HTTPS request (HTTP proxy)
+
HTTP_OTHER - another HTTP request (HTTP proxy)
+
HTTP - any HTTP request except HTTP_CONNECT (HTTP proxy)
+
HTTPS - alias for HTTP_CONNECT (HTTP proxy)
+
FTP_GET - FTP get request (http, ftp proxy)
+
FTP_PUT - FTP put request (ftp proxy)
+
FTP_LIST - FTP list request (http, ftp proxy)
+
FTP - any FTP request
+
ADMIN - administration interface access
Redirections are useful to, e.g., forward requests from specific clients to different servers or proxy servers. Additionally, redirections are useful @@ -1219,7 +1219,7 @@ no need to run these services explicitly. Local redirections are useful if you want to see and control via ACLs protocol-specific parameters, e.g., filenames requested through FTP while clients are using SOCKS.
-
Q: What is it for?
A: To have control based on the request and to have URLs and other protocol-specific parameters logged. @@ -1237,22 +1237,22 @@ auth iponly allow * * * 80,8080-8088 parent 1000 http 0.0.0.0 0 allow * * * 80,8080-8088 -#redirect ports 80 and 8080-8088 to local HTTP proxy -#Second allow is required, because ACLs are checked -#twice: first time by socks and second by http proxy. +#redirect ports 80 and 8080-8088 to local HTTP proxy +#Second allow is required, because ACLs are checked +#twice: first time by socks and second by http proxy. allow * * * 21,2121 parent 1000 ftp 0.0.0.0 0 allow * * * 21,2121 -#redirect ports 21 and 2121 to local -#ftp proxy +#redirect ports 21 and 2121 to local +#ftp proxy allow * -#allow the rest of connections directly +#allow the rest of connections directly socks -#now let the socks server start +#now let the socks server startQ: How does it affect different ACL rules?
@@ -1260,20 +1260,20 @@ A: After local redirections, rules are applied again to the protocol-level requeallow * * * 80,8080-8088 parent 1000 http 0.0.0.0 0 -#redirect http traffic to internal proxy +#redirect http traffic to internal proxy allow * * $c:\3proxy\local.nets 80,8080-8088 -#allow direct access to local.nets networks +#allow direct access to local.nets networks allow * * * 80,8080-8088 parent 1000 http proxy.3proxy.org 3128 -#use parent caching proxy for the rest of the networks +#use parent caching proxy for the rest of the networks allow * -#allow direct connections for the rest of socks -#requests +#allow direct connections for the rest of socks +#requests-
The proxy itself doesn't manage network-level routing. The only way to control the outgoing channel is to select the external interface. It's possible to make @@ -1302,7 +1302,7 @@ for Windows: If you don't have a second address yet, just add it. Under Linux/Unix, it's better to use source routing.
-The parent command may also be used to build proxy chains. In this case, multiple 'parent' commands are used for a single 'allow' rule with different @@ -1338,7 +1338,7 @@ the second hop is 192.168.20.1, and the 3rd one is either 192.168.30.1 with a pr of 30% or 192.168.40.1 with a probability of 70%.
-3proxy supports bandwidth filters. Use the bandlimin/bandlimout and nobandlimin/nobandlimout commands to manage filters. 'in' means incoming and 'out' means outgoing traffic. @@ -1368,7 +1368,7 @@ In this example: mail traffic from POP3 servers bypasses the pipe and has no bandwidth limitation.
-
counter <filename> <type> <reportpath> @@ -1387,136 +1387,136 @@ The reportpath specifies the location of text reports; the type parameter of the command controls how often text reports are created. The amount is the amount of allowed traffic in megabytes (MB). nocountin allows you to set exclusions.
-3proxy accounts for protocol-level traffic. Providers count channel- or IP-level traffic with network and transport headers. In addition, 3proxy does not count DNS resolutions, pings, floods, scans, etc. This accounts for approximately a 10% difference. That is why you should have a 15% reserve if you use 3proxy to limit your traffic. If the difference with your provider is significantly above 10%, you should look for traffic bypassing the proxy server, for example connections through NAT, traffic originating from the host with the proxy installed, traffic from server applications, etc. -
- For name resolution and caching, use the commands nserver, nscache / nscache6, and nsrecord. +
3proxy accounts for protocol-level traffic. Providers count channel- or IP-level traffic with network and transport headers. In addition, 3proxy does not count DNS resolutions, pings, floods, scans, etc. This accounts for approximately a 10% difference. That is why you should have a 15% reserve if you use 3proxy to limit your traffic. If the difference with your provider is significantly above 10%, you should look for traffic bypassing the proxy server, for example connections through NAT, traffic originating from the host with the proxy installed, traffic from server applications, etc. +
+ For name resolution and caching, use the commands nserver, nscache / nscache6, and nsrecord.
nserver 192.168.1.2 nserver 192.168.1.3:5353/tcp- sets DNS resolvers. 192.168.1.3 will be used via TCP/5353 (instead of default UDP/53) - only if 192.168.1.2 fails. Up to 5 nservers may be specified. - If no nserver is configured, default system name resolution functions are used. + sets DNS resolvers. 192.168.1.3 will be used via TCP/5353 (instead of default UDP/53) + only if 192.168.1.2 fails. Up to 5 nservers may be specified. + If no nserver is configured, default system name resolution functions are used.
nscache 65535 nscache6 65535- sets name cache size for IPv4 and IPv6. The name cache must be large enough, if present. - The name cache is only used if nserver is configured. + sets name cache size for IPv4 and IPv6. The name cache must be large enough, if present. + The name cache is only used if nserver is configured.
nsrecord server.mycompany.example.com 192.168.1.1 nsrecord www.porno.com 127.0.0.2 ... deny * * 127.0.0.2- adds static nsrecords. Also, static nsrecords are used for dnspr, unless the -s option is specified. - Since version 0.8, a parent proxy may be configured for dnspr. + adds static nsrecords. Also, static nsrecords are used for dnspr, unless the -s option is specified. + Since version 0.8, a parent proxy may be configured for dnspr. -
- IPv6 is supported since version 0.8. Please note that some proxy protocols, e.g., SOCKSv4,
- do not support IPv6. SOCKSv5 supports IPv6 with a special request type (which must be
- implemented by the client).
-
- 3proxy supports proxying from IPv4 and IPv6 networks to IPv4,
- IPv6, and mixed networks. An IPv6 address may be used in
- internal, external, and parent commands, ACLs, -i and -e options, etc.
- The external command and -e options may be given twice for each service—once with an IPv4
- and once with an IPv6 address. internal can be given only once; to bind to all IPv4 and
- IPv6 addresses, use [0:0:0:0:0:0:0:0] or [::].
-
- Any service may be configured with -4, -46, -64, or -6 options to specify the desired
- priority for name-to-IPv4/IPv6 address resolution (IPv4 only, IPv4 priority,
- IPv6 priority, IPv6 only).
-
- For example, a user needs access from an external network to a proxy server located - on the host 192.168.1.2. This host cannot be accessed from the external network, - but it has access to the external network with an external address 1.1.1.1. - Also, the user has access to the host 2.2.2.2 (IP address may be dynamic) with - hostname host.dyndns.example.org via the external network. The user needs 2 instances - of 3proxy, the first one on the host 192.168.1.2 with the config +
+ IPv6 is supported since version 0.8. Please note that some proxy protocols, e.g., SOCKSv4,
+ do not support IPv6. SOCKSv5 supports IPv6 with a special request type (which must be
+ implemented by the client).
+
+ 3proxy supports proxying from IPv4 and IPv6 networks to IPv4,
+ IPv6, and mixed networks. An IPv6 address may be used in
+ internal, external, and parent commands, ACLs, -i and -e options, etc.
+ The external command and -e options may be given twice for each service—once with an IPv4
+ and once with an IPv6 address. internal can be given only once; to bind to all IPv4 and
+ IPv6 addresses, use [0:0:0:0:0:0:0:0] or [::].
+
+ Any service may be configured with -4, -46, -64, or -6 options to specify the desired
+ priority for name-to-IPv4/IPv6 address resolution (IPv4 only, IPv4 priority,
+ IPv6 priority, IPv6 only).
+
+ For example, a user needs access from an external network to a proxy server located + on the host 192.168.1.2. This host cannot be accessed from the external network, + but it has access to the external network with an external address 1.1.1.1. + Also, the user has access to the host 2.2.2.2 (IP address may be dynamic) with + hostname host.dyndns.example.org via the external network. The user needs 2 instances + of 3proxy, the first one on the host 192.168.1.2 with the config
users user:CL:password auth strong allow user proxy -rhost.dyndns.example.org:1234- and the second one on host.dyndns.example.org (2.2.2.2) with the config + and the second one on host.dyndns.example.org (2.2.2.2) with the config
auth iponly allow * * 1.1.1.1 tcppm -R0.0.0.0:1234 3128 1.1.1.1 3128- For browser settings, the proxy is host.dyndns.example.org:3128. - -
- 3proxy supports HAProxy PROXY protocol v1 for both receiving and sending client - IP information. This is useful when 3proxy is behind a load balancer or when - passing client information to a parent proxy. -
-
- Receiving PROXY protocol header:
-
Use the -H option to make 3proxy expect a PROXY protocol v1 header
- on incoming connections. This allows 3proxy to receive the real client IP address
- from HAProxy or another load balancer:
+ For browser settings, the proxy is host.dyndns.example.org:3128.
+
+ 3proxy supports HAProxy PROXY protocol v1 for both receiving and sending client + IP information. This is useful when 3proxy is behind a load balancer or when + passing client information to a parent proxy. +
+
+ Receiving PROXY protocol header:
+
Use the -H option to make 3proxy expect a PROXY protocol v1 header
+ on incoming connections. This allows 3proxy to receive the real client IP address
+ from HAProxy or another load balancer:
proxy -H -p3128 socks -H -p1080-
- The PROXY protocol header must be sent before any protocol-specific data. -
-
- Sending PROXY protocol header to parent proxy:
-
Use the ha parent type to send a PROXY protocol v1 header to
- the parent proxy. Place ha before the parent that should receive
- the header; after the header is sent, parent protocol negotiation continues:
+
+ The PROXY protocol header must be sent before any protocol-specific data. +
+
+ Sending PROXY protocol header to parent proxy:
+
Use the ha parent type to send a PROXY protocol v1 header to
+ the parent proxy. Place ha before the parent that should receive
+ the header; after the header is sent, parent protocol negotiation continues:
allow * parent 1000 ha 0.0.0.0 0 parent 1000 socks5 parent.example.com 1080 proxy-
- This configuration connects to the SOCKS5 parent, sends the PROXY protocol
- header with the original client IP, then performs SOCKS5 negotiation before
- relaying the client payload. The parent should use -H to accept
- the header (for example socks -H).
-
- Use the maxseg command to set the TCP maximum segment size (MSS)
- for outgoing connections. This can be useful to work around path MTU discovery
- issues or to optimize traffic for specific network conditions:
+
+ This configuration connects to the SOCKS5 parent, sends the PROXY protocol
+ header with the original client IP, then performs SOCKS5 negotiation before
+ relaying the client payload. The parent should use -H to accept
+ the header (for example socks -H).
+
+ Use the maxseg command to set the TCP maximum segment size (MSS)
+ for outgoing connections. This can be useful to work around path MTU discovery
+ issues or to optimize traffic for specific network conditions:
maxseg 1400 proxy -p3128 -OcTCP_NODELAY,TCP_MAXSEG -OsTCP_NODELAY,TCP_MAXSEG-
- The value is specified in bytes. This setting uses the TCP_MAXSEG socket option - and may not be supported on all platforms. A typical use case is to reduce MSS - to avoid fragmentation in VPN tunnels or to work around MTU issues with certain - network paths. -
-+ The value is specified in bytes. This setting uses the TCP_MAXSEG socket option + and may not be supported on all platforms. A typical use case is to reduce MSS + to avoid fragmentation in VPN tunnels or to work around MTU issues with certain + network paths. +
+
-
The latest version of 3proxy may be obtained -here. +here. A new version may have changes and incompatibilities with the previous one in file formats or commands. Please read the CHANGELOG file and other documentation before installing a new version.
-If installed as a system service, 3proxy understands Windows service commands for START, STOP, PAUSE, and RESUME. If the service is PAUSEd, no new connections @@ -1526,79 +1526,79 @@ completely if you have changed any configuration. You can control the 3proxy service via "Services" administration or via the "net" command:
- net start 3proxy - net stop 3proxy - net pause 3proxy - net continue 3proxy + net start 3proxy + net stop 3proxy + net pause 3proxy + net continue 3proxy-
-
- Ask it in Github.
- Please read this document before asking a question.
+ Ask it in Github.
+ Please read this document before asking a question.
diff --git a/doc/html/howtor.html b/doc/html/howtor.html
index c237741..fa364cc 100644
--- a/doc/html/howtor.html
+++ b/doc/html/howtor.html
@@ -2,547 +2,547 @@
3APA3A 3proxy tiny proxy server HowTo
В стадии разработки
-
- Извлеките файлы из архива 3proxy.tgz (например, с помощью WinZip) или используйте git. +
+
+ Извлеките файлы из архива 3proxy.tgz (например, с помощью WinZip) или используйте git.
nmake /f Makefile.msvc
- Исполняемые файлы будут помещены в каталог bin/.
-
-
- CMake предоставляет кроссплатформенную систему сборки. Работает на Windows (MSVC, MinGW), Linux, macOS и BSD.
-
Базовые шаги сборки:
+ Исполняемые файлы будут помещены в каталог bin/.
+
+ CMake предоставляет кроссплатформенную систему сборки. Работает на Windows (MSVC, MinGW), Linux, macOS и BSD.
+
Базовые шаги сборки:
mkdir build
cd build
cmake ..
cmake --build .
- На Windows с Visual Studio можно также сгенерировать файл решения:
+ На Windows с Visual Studio можно также сгенерировать файл решения:
cmake -G "Visual Studio 17 2022" -A x64 ..
cmake --build . --config Release
- Опциональные функции можно включить через параметры cmake:
+ Опциональные функции можно включить через параметры cmake:
cmake -D3PROXY_USE_OPENSSL=ON -D3PROXY_USE_PCRE2=ON ..
- Доступные опции: 3PROXY_USE_OPENSSL, 3PROXY_USE_PCRE2, 3PROXY_USE_PAM, 3PROXY_USE_ODBC.
- build/bin/.
-
-
- Для Linux используйте:
+ Доступные опции: 3PROXY_USE_OPENSSL, 3PROXY_USE_PCRE2, 3PROXY_USE_PAM, 3PROXY_USE_ODBC.
+
Исполняемые файлы будут помещены в каталог build/bin/.
+
+ Для Linux используйте:
ln -sf Makefile.Linux Makefile
make
- Для FreeBSD используйте:
+ Для FreeBSD используйте:
ln -sf Makefile.FreeBSD Makefile
make
- Для других Unix-подобных систем используйте Makefile.unix. На BSD-производных системах
- убедитесь, что используете GNU make; иногда он называется gmake вместо make.
- bin/.
-
- bin/.
+
+
- Извлеките файлы из архива 3proxy.zip в любой каталог - (например, c:\Program Files\3proxy). Если необходимо, создайте каталог для - хранения файлов журналов. Создайте файл конфигурации 3proxy.cfg в - каталоге 3proxy (см. раздел Конфигурация сервера). - Откройте командную строку (cmd.exe). - Перейдите в каталог с 3proxy и дайте команду 3proxy.exe --install: +
+ Извлеките файлы из архива 3proxy.zip в любой каталог + (например, c:\Program Files\3proxy). Если необходимо, создайте каталог для + хранения файлов журналов. Создайте файл конфигурации 3proxy.cfg в + каталоге 3proxy (см. раздел Конфигурация сервера). + Откройте командную строку (cmd.exe). + Перейдите в каталог с 3proxy и дайте команду 3proxy.exe --install:
D:\>C: C:\>cd C:\Program Files\3proxy C:\Program Files\3proxy>3proxy.exe --install- Сервис должен быть установлен и запущен. Если сервис не запускается, - попробуйте запустить 3proxy.exe вручную и проанализировать сообщения об ошибках. -
- Для удаления 3proxy необходимо остановить сервис и дать - команду 3proxy.exe --remove: + Сервис должен быть установлен и запущен. Если сервис не запускается, + попробуйте запустить 3proxy.exe вручную и проанализировать сообщения об ошибках. +
+ Для удаления 3proxy необходимо остановить сервис и дать + команду 3proxy.exe --remove:
D:\>C: C:\>cd C:\Program Files\3proxy C:\Program Files\3proxy>net stop 3proxy C:\Program Files\3proxy>3proxy.exe --remove- после чего каталог 3proxy можно удалить. - -
- С помощью Makefile:
-
Скомпилируйте 3proxy (см. раздел Компиляция), затем выполните:
+ после чего каталог 3proxy можно удалить.
+
+ С помощью Makefile:
+
Скомпилируйте 3proxy (см. раздел Компиляция), затем выполните:
sudo make install- Это установит исполняемые файлы в
/usr/local/3proxy/sbin/,
- конфигурацию в /etc/3proxy/ и настроит chroot-каталоги.
- Файл конфигурации по умолчанию: /etc/3proxy/3proxy.cfg.
-
-
- С помощью CMake:
+ Это установит исполняемые файлы в /usr/local/3proxy/sbin/,
+ конфигурацию в /etc/3proxy/ и настроит chroot-каталоги.
+ Файл конфигурации по умолчанию: /etc/3proxy/3proxy.cfg.
+
+ С помощью CMake:
mkdir build && cd build cmake .. cmake --build . sudo cmake --install .- -
- С помощью готовых пакетов из GitHub:
-
Скачайте .deb или .rpm пакеты со страницы GitHub Releases.
-
Для Debian/Ubuntu:
+
+ С помощью готовых пакетов из GitHub:
+
Скачайте .deb или .rpm пакеты со страницы GitHub Releases.
+
Для Debian/Ubuntu:
sudo dpkg -i 3proxy_*.deb- Для RHEL/CentOS/Fedora: + Для RHEL/CentOS/Fedora:
sudo rpm -i 3proxy-*.rpm- -
- Добавьте 3proxy в скрипты автозапуска или используйте systemd: +
++ Добавьте 3proxy в скрипты автозапуска или используйте systemd:
sudo systemctl enable 3proxy sudo systemctl start 3proxy- -
- С помощью CMake (рекомендуется): +
++ С помощью CMake (рекомендуется):
mkdir build && cd build cmake .. cmake --build . sudo cmake --install .- Это установит: -
/usr/local/bin//etc/3proxy//usr/local/lib/3proxy//Library/LaunchDaemons/org.3proxy.3proxy.plist- С помощью Makefile: + Это установит: +
/usr/local/bin//etc/3proxy//usr/local/lib/3proxy//Library/LaunchDaemons/org.3proxy.3proxy.plist+ С помощью Makefile:
ln -sf Makefile.FreeBSD Makefile make sudo make install- Это установит исполняемые файлы в
/usr/local/3proxy/bin/ и конфигурацию в /usr/local/etc/3proxy/.
-
-
- Управление службой через launchd:
-
После установки через cmake службой можно управлять с помощью launchctl:
+ Это установит исполняемые файлы в /usr/local/3proxy/bin/ и конфигурацию в /usr/local/etc/3proxy/.
+
+ Управление службой через launchd:
+
После установки через cmake службой можно управлять с помощью launchctl:
- # Загрузить и запустить службу + # Загрузить и запустить службу sudo launchctl load /Library/LaunchDaemons/org.3proxy.3proxy.plist - # Остановить службу + # Остановить службу sudo launchctl stop org.3proxy.3proxy - # Запустить службу + # Запустить службу sudo launchctl start org.3proxy.3proxy - # Выгрузить и отключить службу + # Выгрузить и отключить службу sudo launchctl unload /Library/LaunchDaemons/org.3proxy.3proxy.plist- Служба запускается от имени пользователя
proxy (создаётся при установке).
- Файл конфигурации: /etc/3proxy/3proxy.cfg
-
-
- Использование готовых образов из GitHub Container Registry:
+ Служба запускается от имени пользователя proxy (создаётся при установке).
+ Файл конфигурации: /etc/3proxy/3proxy.cfg
+
+ Использование готовых образов из GitHub Container Registry:
docker pull ghcr.io/3proxy/3proxy:latest- -
- Сборка Docker-образов:
-
Предоставляются два Dockerfile:
-
Dockerfile.minimal - минимальная статическая сборка без плагинов, конфигурация из stdin:
+
+
+ Сборка Docker-образов:
+
Предоставляются два Dockerfile:
+
Dockerfile.minimal - минимальная статическая сборка без плагинов, конфигурация из stdin:
docker build -f Dockerfile.minimal -t 3proxy.minimal . docker run -i -p 3129:3129 --name 3proxy 3proxy.minimal- Затем введите конфигурацию, завершив командой "end". -
Dockerfile.full - полная сборка с плагинами (SSL, PCRE, Transparent):
+ Затем введите конфигурацию, завершив командой "end".
+ Dockerfile.full - полная сборка с плагинами (SSL, PCRE, Transparent):
docker build -f Dockerfile.full -t 3proxy.full . docker run -p 3129:3129 -v /path/to/config:/usr/local/3proxy/conf 3proxy.full- Файл конфигурации должен находиться по пути
/path/to/config/3proxy.cfg.
-
- По умолчанию 3proxy работает в chroot-окружении с uid/gid 65535. Используйте nserver в конфигурации для DNS-разрешения в chroot.
- Для запуска без chroot монтируйте конфигурацию в /etc/3proxy.
-
/path/to/config/3proxy.cfg.
+
+ По умолчанию 3proxy работает в chroot-окружении с uid/gid 65535. Используйте nserver в конфигурации для DNS-разрешения в chroot.
+ Для запуска без chroot монтируйте конфигурацию в /etc/3proxy.
+
- Для работы требуется корректный файл конфигурации. Если прокси не запускается, значит в конфигурации есть ошибка. -
-- A: Обычные ошибки - использование auth none (для работы любых - функций, основанных на ACL, требуется auth iponly, nbname или strong), - нарушение порядка ввода команд (команды выполняются последовательно, - запуск сервиса proxy, socks, tcppm и т.д. должен осуществляться после - того, как указана его конфигурация), неправильный порядок записей в ACL - (записи просматриваются последовательно до первой, удовлетворяющей - критериям). Если в ACL имеется хотя бы одна запись, то считается, что - последняя запись в ACL - это неявная deny *. -
-- Чаще всего 3proxy не запускается службой (но запускается вручную) по одной из следующих причин: -
+ Для работы требуется корректный файл конфигурации. Если прокси не запускается, значит в конфигурации есть ошибка. +
++ A: Обычные ошибки - использование auth none (для работы любых + функций, основанных на ACL, требуется auth iponly, nbname или strong), + нарушение порядка ввода команд (команды выполняются последовательно, + запуск сервиса proxy, socks, tcppm и т.д. должен осуществляться после + того, как указана его конфигурация), неправильный порядок записей в ACL + (записи просматриваются последовательно до первой, удовлетворяющей + критериям). Если в ACL имеется хотя бы одна запись, то считается, что + последняя запись в ACL - это неявная deny *. +
++ Чаще всего 3proxy не запускается службой (но запускается вручную) по одной из следующих причин: +
3proxy --install path_to_configuration_file
- - Убедитесь, что выправильно понимаете что такое internal и external адреса. - Оба адреса - это адреса, принадлежищие хосту, на котором установлен 3proxy. - Эта опция конфигурации необходима в классической ситуации, когда 3proxy - установлен на граничном компьютере с двумя (или более) подключениями: +
+ Убедитесь, что выправильно понимаете что такое internal и external адреса. + Оба адреса - это адреса, принадлежищие хосту, на котором установлен 3proxy. + Эта опция конфигурации необходима в классической ситуации, когда 3proxy + установлен на граничном компьютере с двумя (или более) подключениями:
LAN connection +-------------+ Internet connection
LAN <-------------->| 3proxy host |<-------------------> INTERNET
^+-------------+^
| |
Internal IP External IP
- Если 3proxy работает на хосте с одним интерфейсом, то его адрес будет и
- internal и external.
- - Интерфейс с адресом external, если он указан, должен быть рабочим на момент - получения запроса клиента. При отсутствии external или адресе 0.0.0.0 внешний - адрес будет выбираться системой при установке соединения. При этом, может быть - возможность доступа через прокси к ресурсам локальной сети, поэтому для - предотвращения несанкционированного доступа следует использовать ACL. Кроме - того, могут быть проблемы с приемом входящих соединений через SOCKSv5 - (SOCKSv5 используется в клиентах исключительно редко). - В случае, если адрес динамический, можно либо не - указывать external, либо использовать адрес 0.0.0.0, либо, если необходима - поддержка входящих соединений в SOCKSv5, использовать скрипт, - который будет получать текущий адрес и сохранять его в файл, который будет - отслуживаться через команду monitor. -
-- Убедитесь, что используется системный, а не - пользовательский DSN. Убедитесь, что выполняется правильный SQL запрос. Наиболее - распространенная проблема связана с отсутствием кавычек или неправильным - форматом данных. Самый простой способ - сделать ведение журнала в файл или - на стандартный вывод, просмотреть выдаваемые SQL запросы и попробовать - дать такой запрос вручную. -
-- Прокси не может обращаться напрямую к IPv6 сети если в запросе от клиента - указан IPv4. В запросе от клиента должен быть IPv6 адрес или имя хоста, чаще - всего это решается включением опции разрешения имен через прокси-сервер на стороне - клиента. -
-- Возможно, недостаточен размер стека потока по-умолчанию, это может - быть при использовани каких-либо сторонних плагинов (PAM, ODBC) или на - некоторых платформах (некоторые версии FreeBSD на amd64). Можно решить - проблему с помощью опции 'stacksize' или '-S', поддерживаемых в 0.8.4 и выше. -
-- Пример файла конфигурации 3proxy.cfg.sample поставляется с любым дистрибутивом - программы. -
-
- 3proxy поддерживает ведение журнала на экран (stdout), в файл, через ODBC и через службу
- syslog (только для Unix/Linux/CygWin). Можно управлять либо общим файлом
- журнала, задаваемым в файле конфигурации 3proxy.cfg и единым для всех служб,
- либо индивидуальными файлами для отдельных служб (например, команда
- socks -l/var/log/socks.log запускает SOCKS прокси
- и задает для него индивидуальный журнал). Для общего файла журнала
- поддерживается ротация (т.е. периодическое создание новых файлов журнала
- с предопределенными именами и удаление файлов старше определенного срока)
- и архивация файлов журнала.
- Тип журнала определяется параметром log в файле конфигурации либо ключом
- -l при вызове конкретной службы (например, socks прокси). log или -l без
- параметров соответствуют ведению журнала на экран (stdout).
+ Если 3proxy работает на хосте с одним интерфейсом, то его адрес будет и
+ internal и external.
+
Интерфейс с адресом internal должен существовать и быть рабочим на момент
+ запуска 3proxy, и не должен отключаться. Если internal интерфейс
+ периодически отключается, то не следует его указывать, или можно указать адрес
+ 0.0.0.0. При этом прокси будет принимать запросы на всех интерфейсах, поэтому
+ при наличии нескольких интерфейсов для ограничения доступа следует использовать
+ фаервол или хотя бы ACL.
+
+ Интерфейс с адресом external, если он указан, должен быть рабочим на момент + получения запроса клиента. При отсутствии external или адресе 0.0.0.0 внешний + адрес будет выбираться системой при установке соединения. При этом, может быть + возможность доступа через прокси к ресурсам локальной сети, поэтому для + предотвращения несанкционированного доступа следует использовать ACL. Кроме + того, могут быть проблемы с приемом входящих соединений через SOCKSv5 + (SOCKSv5 используется в клиентах исключительно редко). + В случае, если адрес динамический, можно либо не + указывать external, либо использовать адрес 0.0.0.0, либо, если необходима + поддержка входящих соединений в SOCKSv5, использовать скрипт, + который будет получать текущий адрес и сохранять его в файл, который будет + отслуживаться через команду monitor. +
++ Убедитесь, что используется системный, а не + пользовательский DSN. Убедитесь, что выполняется правильный SQL запрос. Наиболее + распространенная проблема связана с отсутствием кавычек или неправильным + форматом данных. Самый простой способ - сделать ведение журнала в файл или + на стандартный вывод, просмотреть выдаваемые SQL запросы и попробовать + дать такой запрос вручную. +
++ Прокси не может обращаться напрямую к IPv6 сети если в запросе от клиента + указан IPv4. В запросе от клиента должен быть IPv6 адрес или имя хоста, чаще + всего это решается включением опции разрешения имен через прокси-сервер на стороне + клиента. +
++ Возможно, недостаточен размер стека потока по-умолчанию, это может + быть при использовани каких-либо сторонних плагинов (PAM, ODBC) или на + некоторых платформах (некоторые версии FreeBSD на amd64). Можно решить + проблему с помощью опции 'stacksize' или '-S', поддерживаемых в 0.8.4 и выше. +
++ Пример файла конфигурации 3proxy.cfg.sample поставляется с любым дистрибутивом + программы. +
++ 3proxy поддерживает ведение журнала на экран (stdout), в файл, через ODBC и через службу + syslog (только для Unix/Linux/CygWin). Можно управлять либо общим файлом + журнала, задаваемым в файле конфигурации 3proxy.cfg и единым для всех служб, + либо индивидуальными файлами для отдельных служб (например, команда + socks -l/var/log/socks.log запускает SOCKS прокси + и задает для него индивидуальный журнал). Для общего файла журнала + поддерживается ротация (т.е. периодическое создание новых файлов журнала + с предопределенными именами и удаление файлов старше определенного срока) + и архивация файлов журнала. + Тип журнала определяется параметром log в файле конфигурации либо ключом + -l при вызове конкретной службы (например, socks прокси). log или -l без + параметров соответствуют ведению журнала на экран (stdout).
log filename- и + и
-lfilename- соответствуют записи журнала в файл filename. Если при указании имени файла - в log в нем содержится символ %, то имя рассматривается как форматный - спецификатор (см. logformat). Например, - log c:\3proxy\logs\%y%m%d.log D создаст файл типа c:\3proxy\logs\060725.log, - для образования даты будет использовано местное время. + соответствуют записи журнала в файл filename. Если при указании имени файла + в log в нем содержится символ %, то имя рассматривается как форматный + спецификатор (см. logformat). Например, + log c:\3proxy\logs\%y%m%d.log D создаст файл типа c:\3proxy\logs\060725.log, + для образования даты будет использовано местное время.
log @ident- и + и
-l@ident- соответствуют ведению журнала через syslog с идентификатором ident. + соответствуют ведению журнала через syslog с идентификатором ident.
- log &connstring- соответствует ведению журнала через ODBC, connstring задается в формате - datasource,username,password (последние два параметра опциональны, если - datasource не требует или уже содержит сведения для авторизации). При этом - команда logformat должна задавать SQL запрос, который необходимо выполнить - для добавления записи в журнал, см Как настроить формат журнала. -
- Управление ротацией общего файла журнала происходит с помощью команд файла - конфигурации log, rotate и archiver. + log &connstring; + соответствует ведению журнала через ODBC, connstring задается в формате + datasource,username,password (последние два параметра опциональны, если + datasource не требует или уже содержит сведения для авторизации). При этом + команда logformat должна задавать SQL запрос, который необходимо выполнить + для добавления записи в журнал, см Как настроить формат журнала. +
+ Управление ротацией общего файла журнала происходит с помощью команд файла + конфигурации log, rotate и archiver.
log filename LOGTYPE- задает тип ротации. LOGTYPE может принимать значения: -
rotate NUMBER- указывает на число файлов, участвующих в ротации (т.е. сколько последних - журналов хранить). + указывает на число файлов, участвующих в ротации (т.е. сколько последних + журналов хранить).
archiver EXT COMMAND PARAMETERS- задает параметры архивации журнала. EXT указывает на расширение - архива (например, zip, gz, Z, rar и т.д.) COMMAND указывает на - программу и PARAMETERS - на параметры командной строки. Архиватор - должен сам удалять исходный файл, также ему можно передать имя файла - с помощью макроса %F и ожидаемое имя архива с помощью макроса %A. - В качестве архиватора вполне можно задать пакетный файл, который, - например, будет загружать данные из журнала в базу данных. - Примеры команды archiver для популярных архиваторов можно найти в - 3proxy.cfg.sample + задает параметры архивации журнала. EXT указывает на расширение + архива (например, zip, gz, Z, rar и т.д.) COMMAND указывает на + программу и PARAMETERS - на параметры командной строки. Архиватор + должен сам удалять исходный файл, также ему можно передать имя файла + с помощью макроса %F и ожидаемое имя архива с помощью макроса %A. + В качестве архиватора вполне можно задать пакетный файл, который, + например, будет загружать данные из журнала в базу данных. + Примеры команды archiver для популярных архиваторов можно найти в + 3proxy.cfg.sample
logdump OFFSET_BYTES_FROM_SERVER OFFSET_BYTES_FROM_CLIENT- Задает смещение в байтах на входящий и исходящий трафик, при достижении - которого необходимо создавать запись в журнале даже в том случае, если - соединение еще не завершено. Если logdump не указан или значения - OFFSET_BYTES_FROM_SERVER OFFSET_BYTES_FROM_CLIENT нулевые - в журнале - будет создана единственная запись по окончании обработки запроса клиента - (при разрыве соединения). Пример: + Задает смещение в байтах на входящий и исходящий трафик, при достижении + которого необходимо создавать запись в журнале даже в том случае, если + соединение еще не завершено. Если logdump не указан или значения + OFFSET_BYTES_FROM_SERVER OFFSET_BYTES_FROM_CLIENT нулевые - в журнале + будет создана единственная запись по окончании обработки запроса клиента + (при разрыве соединения). Пример:
logdump 1048576 1048576- создает в журнале запись на каждый мегабайт входящего или исходящего - трафика. - -
- Начиная с версии 0.3, формат журнала может быть настроен с помощью - команды logformat со строкой формата. Первый символ строки должен - быть L или G, что указывает на формат, в котором будет указываться - время и даты, L - текущее локальное время, G - абсолютное время по - Гринвичу. Строка формата может содержать следующие модификаторы: -
+ Начиная с версии 0.3, формат журнала может быть настроен с помощью + команды logformat со строкой формата. Первый символ строки должен + быть L или G, что указывает на формат, в котором будет указываться + время и даты, L - текущее локальное время, G - абсолютное время по + Гринвичу. Строка формата может содержать следующие модификаторы: +
logformat "L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"- будет генерировать в журнале записи типа + будет генерировать в журнале записи типа
1042454727.0296 SOCK4.1080 000 3APA3A 127.0.0.1:4739 195.122.226.28:4739 505 18735 1 GET http://3proxy.ru/ HTTP/1.1- (без переноса строк) - При использовании ODBC, logformat должен задавать формат SQL команды, - которую необходимо дать для внесения записи в журнал, например: + (без переноса строк) + При использовании ODBC, logformat должен задавать формат SQL команды, + которую необходимо дать для внесения записи в журнал, например:
logformat "-\'+_GINSERT INTO proxystat VALUES (%t, '%c', '%U', %I)"- префикс -\'+_ указывает, что символы \ и ' следует заменить на _ . + префикс -\'+_ указывает, что символы \ и ' следует заменить на _ . - -
- Просто сделайте формат ведения журнала совместимым с одним из форматов,
- поддерживаемых анализатором. Это позволяет использовать практически любые
- анализаторы. Примеры совместимых форматов:
-
- Формат Squid access.log:
+
+ Просто сделайте формат ведения журнала совместимым с одним из форматов,
+ поддерживаемых анализатором. Это позволяет использовать практически любые
+ анализаторы. Примеры совместимых форматов:
+
+ Формат Squid access.log:
"- +_G%t.%. %D %C TCP_MISS/200 %I %1-1T %2-2T %U DIRECT/%R application/unknown"- Более совместимый формат, но без %D + Более совместимый формат, но без %D
"- +_G%t.%. 1 %C TCP_MISS/200 %I %1-1T %2-2T %U DIRECT/%R application/unknown"- Формат ISA 2000 proxy WEBEXTD.LOG (поля разделены табуляцией): + Формат ISA 2000 proxy WEBEXTD.LOG (поля разделены табуляцией):
- "- + L%C %U Unknown Y %Y-%m-%d %H:%M:%S - w3proxy 3PROXY - %n %R %r %D - %O %I http TCP %1-1T %2-2T - - - %E - - -"- Формат ISA 2004 proxy WEB.w3c (поля разделены табуляцией): + "- + L%C %U Unknown Y %Y-%m-%d %H:%M:%S + w3proxy 3PROXY - %n %R %r %D + %O %I http TCP %1-1T %2-2T - - + %E - - -" + Формат ISA 2004 proxy WEB.w3c (поля разделены табуляцией):
- "- + L%C %U Unknown %Y-%m-%d %H:%M:%S - 3PROXY - %n %R %r %D %O - %I http %1-1T %2-2T - %E - - - Internal External 0x0 Allowed"- Формат ISA 2000/2004 firewall FWSEXTD.log (поля разделены табуляцией): + "- + L%C %U Unknown %Y-%m-%d %H:%M:%S + 3PROXY - %n %R %r %D %O + %I http %1-1T %2-2T - %E - + - Internal External 0x0 Allowed" + Формат ISA 2000/2004 firewall FWSEXTD.log (поля разделены табуляцией):
- "- + L%C %U unknown:0:0.0 N %Y-%m-%d - %H:%M:%S fwsrv 3PROXY - %n %R %r - %D %O %I %r TCP Connect - - - - %E - - - - -"- Стандартный лог HTTPD (Apache и другие): + "- + L%C %U unknown:0:0.0 N %Y-%m-%d + %H:%M:%S fwsrv 3PROXY - %n %R %r + %D %O %I %r TCP Connect - - + - %E - - - - -" + Стандартный лог HTTPD (Apache и другие):
"-""+_L%C - %U [%d/%o/%Y:%H:%M:%S %z] ""%T"" %E %I"- Более совместимый, но без кода ошибки: + Более совместимый, но без кода ошибки:
"-""+_L%C - %U [%d/%o/%Y:%H:%M:%S %z] ""%T"" 200 %I"-
- 3proxy поставляется в двух вариантах: как набор отдельных модулей (proxy,
- socks, pop3p, tcppm, udppm) и как универсальный прокси-сервер (3proxy).
- Универсальный прокси сервер - это законченная программа, которой не требуются
- отдельные модули.
-
Отдельный модуль управляется только из командной строки. Поэтому для
- отдельного модуля не поддерживаются многие функции, такие как управление
- доступом и ротация журнала. Запуск модуля осуществляется из командной строки.
- Например,
+
+ 3proxy поставляется в двух вариантах: как набор отдельных модулей (proxy,
+ socks, pop3p, tcppm, udppm) и как универсальный прокси-сервер (3proxy).
+ Универсальный прокси сервер - это законченная программа, которой не требуются
+ отдельные модули.
+
Отдельный модуль управляется только из командной строки. Поэтому для
+ отдельного модуля не поддерживаются многие функции, такие как управление
+ доступом и ротация журнала. Запуск модуля осуществляется из командной строки.
+ Например,
$/sbin/socks -l/var/log/socks.log -i127.0.0.1- запускает SOCKS на порту 127.0.0.1:1080 с ведением журнала /var/log/socks.log - Справку по опциям командной строки можно получить запустив модуль с ключом -?. -
- Если используется 3proxy, то запускаемые службы указываются в файле 3proxy.cfg. - Файл 3proxy.cfg просматривается 3proxy построчно, каждая строка рассматривается - как управляющая команда. Синтаксис команд описан в 3proxy.cfg.sample. Например, + запускает SOCKS на порту 127.0.0.1:1080 с ведением журнала /var/log/socks.log + Справку по опциям командной строки можно получить запустив модуль с ключом -?. +
+ Если используется 3proxy, то запускаемые службы указываются в файле 3proxy.cfg. + Файл 3proxy.cfg просматривается 3proxy построчно, каждая строка рассматривается + как управляющая команда. Синтаксис команд описан в 3proxy.cfg.sample. Например,
log /var/log/3proxy.log D rotate 30 @@ -551,49 +551,49 @@ proxy socks pop3p -l/var/log/pop3proxy- запускает 3 службы - PROXY, SOCKS и POP3 Proxy. Каждая слушает на интерфейсе - 127.0.0.1 порт по-умолчанию (3128 для proxy, 1080 для socks и 110 для - pop3p). Журналы всех служб кроме pop3p ведутся в файле /var/log/3proxy.log, - который ежедневно меняется. Хранятся 30 последних файлов. Для pop3p ведется - отдельный журнал /var/log/pop3proxy (см. Как настроить ведение журнала). - -
- Опция -i позволяет указать внутренний интерфейс, -p - порт (пробелы в - опциях не допускаются). Например, чтобы служба proxy висела на порту - 8080 интерфейсов 192.168.1.1 и 192.168.2.1 необходимо дать команды -
+ запускает 3 службы - PROXY, SOCKS и POP3 Proxy. Каждая слушает на интерфейсе + 127.0.0.1 порт по-умолчанию (3128 для proxy, 1080 для socks и 110 для + pop3p). Журналы всех служб кроме pop3p ведутся в файле /var/log/3proxy.log, + который ежедневно меняется. Хранятся 30 последних файлов. Для pop3p ведется + отдельный журнал /var/log/pop3proxy (см. Как настроить ведение журнала). + ++ Опция -i позволяет указать внутренний интерфейс, -p - порт (пробелы в + опциях не допускаются). Например, чтобы служба proxy висела на порту + 8080 интерфейсов 192.168.1.1 и 192.168.2.1 необходимо дать команды +
proxy -p8080 -i192.168.1.1 proxy -p8080 -i192.168.2.1-
- A: Для этого надо использовать тип родительского прокси http, - connect+, socks4+ и socks5+. Однако, при это надо помнить, что самому 3proxy - требуется разрешение имени для управления ACL. Поэтому, если с прокси-хоста - не работают разрешения имени, необходимо в конфигурации дать команду +
+ A: Для этого надо использовать тип родительского прокси http, + connect+, socks4+ и socks5+. Однако, при это надо помнить, что самому 3proxy + требуется разрешение имени для управления ACL. Поэтому, если с прокси-хоста + не работают разрешения имени, необходимо в конфигурации дать команду
fakeresolve- которая разрешает любое имя в адрес 127.0.0.2. - -
- Есть поддержка как FTP через HTTP (то, что называется FTP прокси в браузерах) так и настоящего FTP прокси (то, что называется - FTP proxy в командных оболочках и FTP клиентах). В браузерах в качестве FTP прокси следует прописывать порт службы proxy, - т.е. FTP организован - через http прокси, дополнительного прокси поднимать не надо. Для FTP-клиентов необходимо поднять ftppr. FTP прокси всегда работает - с FTP сервером в пассивном режиме. -
-- SNI proxy может быть использован для транспарентного перенаправления любого TLS трафика (например HTTPS) на внешнем маршрутизаторе - или локальными правилами. Так же можно использовать его для извлечения имени хоста из TLS хендшейка с целью логгирования или использования в ACL. - Еще одна задача которую может решать модуль - требование наличия TLS или mTLS (mutual TLS). - Если tlspr используется как отдельный сервис без использования плагина Transparent, то необходимо задать порт назначения через опцию -P (по умолчанию 443), - т.к. TLS хендшейк не содержит информации о порте назначения. - Примечание: tlspr не поддерживает аутентификацию пользователей (в TLS-хендшейке нет учетных данных); используйте ACL по IP или родительский прокси с аутентификацией, если требуется контроль доступа. -
- Опции: + которая разрешает любое имя в адрес 127.0.0.2. +
++ Есть поддержка как FTP через HTTP (то, что называется FTP прокси в браузерах) так и настоящего FTP прокси (то, что называется + FTP proxy в командных оболочках и FTP клиентах). В браузерах в качестве FTP прокси следует прописывать порт службы proxy, + т.е. FTP организован + через http прокси, дополнительного прокси поднимать не надо. Для FTP-клиентов необходимо поднять ftppr. FTP прокси всегда работает + с FTP сервером в пассивном режиме. +
++ SNI proxy может быть использован для транспарентного перенаправления любого TLS трафика (например HTTPS) на внешнем маршрутизаторе + или локальными правилами. Так же можно использовать его для извлечения имени хоста из TLS хендшейка с целью логгирования или использования в ACL. + Еще одна задача которую может решать модуль - требование наличия TLS или mTLS (mutual TLS). + Если tlspr используется как отдельный сервис без использования плагина Transparent, то необходимо задать порт назначения через опцию -P (по умолчанию 443), + т.к. TLS хендшейк не содержит информации о порте назначения. + Примечание: tlspr не поддерживает аутентификацию пользователей (в TLS-хендшейке нет учетных данных); используйте ACL по IP или родительский прокси с аутентификацией, если требуется контроль доступа. +
+ Опции:
-P <порт> - порт назначения (по умолчанию: 443) -c <уровень> - уровень проверки TLS: @@ -614,17 +614,17 @@ tlspr поддерживает оба варианта: для implicit TLS хо опция -X заставляет tlspr говорить с клиентом на plaintext-фазе протокола (приветствие, команда STARTTLS) перед поднятием TLS с обеих сторон. Пример:- + --# https (implicit) +# https (implicit) tlspr -p443 -P443 -c1 -# imaps (implicit) +# imaps (implicit) tlspr -p993 -P993 -c1 -# submissions (implicit) +# submissions (implicit) tlspr -p465 -P465 -c1 -# imap STARTTLS (explicit) +# imap STARTTLS (explicit) tlspr -p143 -P143 -Ximap -# submission STARTTLS (explicit) +# submission STARTTLS (explicit) tlspr -p587 -P587 -Xsmtp -# pop3 STLS (explicit) +# pop3 STLS (explicit) tlspr -p110 -P110 -Xpop3@@ -693,9 +693,9 @@ deny * * blocked.example.com allow * proxy
dnspr - сервис пересылки DNS-запросов. Он отвечает на запросы из кэша имен 3proxy (включая статические записи nsrecord), пересылает остальные запросы на резолверы, заданные командой nserver, и кэширует результаты, если @@ -714,15 +714,15 @@ nscache 65536 nscache6 65536 dnspr -p53 -# google +# google nsrecord smtp.gmail.com 10.0.0.1 nsrecord imap.gmail.com 10.0.0.1 nsrecord pop.gmail.com 10.0.0.1 -# mail.ru +# mail.ru nsrecord smtp.mail.ru 10.0.0.1 nsrecord imap.mail.ru 10.0.0.1 nsrecord pop.mail.ru 10.0.0.1 -# yandex.ru +# yandex.ru nsrecord smtp.yandex.ru 10.0.0.1 nsrecord imap.yandex.ru 10.0.0.1 nsrecord pop.yandex.ru 10.0.0.1 @@ -735,9 +735,9 @@ nscache 65536 nscache6 65536 dnspr -p53 -F10.0.0.1 -
+ -Начиная с версии 0.9.7 поддержка TLS/SSL встроена в 3proxy при компиляции с OpenSSL (WITH_SSL). Ранее доступная как SSLPlugin, функциональность теперь интегрирована @@ -830,15 +830,15 @@ ssl_nocli
Создаётся HTTPS-прокси (ssl_serv), принимающий TLS-соединения от клиентов. Для соединений с родительским прокси трафик user1 идёт через https родитель с TLS-шифрованием (защищённый тип), а трафик user2 — через обычный socks5 родитель без TLS. Защищённые типы parent прокси: tcps, https, connects, connect+s, socks4s, socks5s, socks4+s, socks5+s, pop3s, smtps, ftps.
-
Создание удостоверяющего центра (CA):
Для MITM или mTLS требуется CA. Сгенерируйте закрытый ключ CA и сертификат:
-# Генерация закрытого ключа CA
+# Генерация закрытого ключа CA
openssl genrsa -out ca.key 4096
-# Генерация сертификата CA (действителен 10 лет)
+# Генерация сертификата CA (действителен 10 лет)
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
-subj "/C=RU/ST=Region/L=City/O=MyOrg/CN=My CA" \
-out ca.crt
@@ -850,15 +850,15 @@ openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
Создание серверного сертификата для https:// прокси:
Серверный сертификат должен иметь правильные альтернативные имена (SAN):
-# Генерация закрытого ключа сервера
+# Генерация закрытого ключа сервера
openssl genrsa -out server.key 2048
-# Создание запроса на подпись сертификата (CSR)
+# Создание запроса на подпись сертификата (CSR)
openssl req -new -key server.key \
-subj "/C=RU/ST=Region/L=City/O=MyOrg/CN=proxy.example.com" \
-out server.csr
-# Создание файла расширений для SAN
+# Создание файла расширений для SAN
cat > server.ext << 'EOF'
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
@@ -872,7 +872,7 @@ DNS.2 = proxy
IP.1 = 192.168.1.100
EOF
-# Подписание сертификата CA
+# Подписание сертификата CA
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 365 -sha256 \
-extfile server.ext
@@ -883,27 +883,27 @@ openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
Создание клиентского сертификата для mTLS:
-# Генерация закрытого ключа клиента
+# Генерация закрытого ключа клиента
openssl genrsa -out client1.key 2048
-# Создание CSR
+# Создание CSR
openssl req -new -key client1.key \
-subj "/C=RU/ST=Region/L=City/O=MyOrg/CN=client1" \
-out client1.csr
-# Создание файла расширений
+# Создание файла расширений
cat > client.ext << 'EOF'
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
extendedKeyUsage = clientAuth
EOF
-# Подписание CA
+# Подписание CA
openssl x509 -req -in client1.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out client1.crt -days 365 -sha256 \
-extfile client.ext
-# Создание PKCS#12 для импорта в браузер
+# Создание PKCS#12 для импорта в браузер
openssl pkcs12 -export -out client1.p12 \
-inkey client1.key -in client1.crt -certfile ca.crt
@@ -913,15 +913,15 @@ openssl pkcs12 -export -out client1.p12 \
Скрипт быстрой настройки для разработки/тестирования:
-#!/bin/sh
-# Создаёт CA, серверный и клиентский сертификаты для тестирования SSLPlugin
+#!/bin/sh
+# Создаёт CA, серверный и клиентский сертификаты для тестирования SSLPlugin
-# CA
+# CA
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
-subj "/CN=3proxy CA" -out ca.crt
-# Сервер
+# Сервер
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=localhost" -out server.csr
cat > server.ext << 'EOF'
@@ -933,7 +933,7 @@ EOF
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 365 -sha256 -extfile server.ext
-# Клиент
+# Клиент
openssl genrsa -out client.key 2048
openssl req -new -key client.key -subj "/CN=client" -out client.csr
cat > client.ext << 'EOF'
@@ -946,7 +946,7 @@ openssl pkcs12 -export -out client.p12 -passout pass: \
-inkey client.key -in client.crt -certfile ca.crt
- Начиная с версии 0.9.7 фильтрация PCRE встроена в 3proxy при компиляции с поддержкой PCRE2 (WITH_PCRE). Ранее доступная как PCREPlugin, функциональность теперь интегрирована @@ -991,13 +991,13 @@ IP назначения, порты и т.д.), аналогичный кома
Примеры:
-# Блокировать запросы с определёнными ключевыми словами для некоторых пользователей +# Блокировать запросы с определёнными ключевыми словами для некоторых пользователей pcre request deny "porn|sex" user1,user2,user3 192.168.0.0/16 -# Блокировать ответы с определённым content-type +# Блокировать ответы с определённым content-type pcre srvheader deny "Content-type: application" -# Замена содержимого в обоих направлениях (цензура) +# Замена содержимого в обоих направлениях (цензура) pcre_rewrite clidata,srvdata dunno "porn|sex|pussy" "***" baduser pcre_extend deny * 192.168.0.1/16@@ -1006,49 +1006,49 @@ pcre_extend deny * 192.168.0.1/16 авторизацию и/или ACL allow/deny. -
- Во-первых, для ограничения доступа необходимо указать внутренний интерфейс, - на котором прокси-сервер будет принимать соединения. Внутренний интерфейс - указывается с помощью команды internal в файле конфигурации или с помощью - ключа -i конкретного модуля. - (см. Как запустить конкретную службу (HTTP, SOCKS и т.д)). - Отсутствие указания внутреннего интерфейса может привести к тому, что ваш - прокси будет открытым. -
Указание внешнего интерфейса (т.е. IP, с которого сервер будет устанавливать - внешние соединения) так же является полезным. Для этого служит команда external - и ключ -e соответственно. - Для универсального прокси возможна дополнительная авторизация доступа с помощью - имени/пароля, NetBIOS имени пользователя и по спискам доступа (по IP клиента, - IP и порту назначения, см. Как ограничить доступ пользователей к ресурсам). - Тип авторизации устанавливается командой auth в файле конфигурации. +
+ Во-первых, для ограничения доступа необходимо указать внутренний интерфейс, + на котором прокси-сервер будет принимать соединения. Внутренний интерфейс + указывается с помощью команды internal в файле конфигурации или с помощью + ключа -i конкретного модуля. + (см. Как запустить конкретную службу (HTTP, SOCKS и т.д)). + Отсутствие указания внутреннего интерфейса может привести к тому, что ваш + прокси будет открытым. +
Указание внешнего интерфейса (т.е. IP, с которого сервер будет устанавливать + внешние соединения) так же является полезным. Для этого служит команда external + и ключ -e соответственно. + Для универсального прокси возможна дополнительная авторизация доступа с помощью + имени/пароля, NetBIOS имени пользователя и по спискам доступа (по IP клиента, + IP и порту назначения, см. Как ограничить доступ пользователей к ресурсам). + Тип авторизации устанавливается командой auth в файле конфигурации.
auth none- Отсутствие какой-либо авторизации. Списки доступа не проверяются. + Отсутствие какой-либо авторизации. Списки доступа не проверяются.
auth iponly- Будет идти проверка по списку доступа с использованием IP клиента, IP и номера - порта назначения. + Будет идти проверка по списку доступа с использованием IP клиента, IP и номера + порта назначения.
auth nbname- Перед проверкой по списком доступа будет произведена попытка получить NetBIOS - имя клиента. Для этого используется NetBIOS код службы messager (0x03). Если - имя определить не удалось (служба messager для Windows NT/2000/XP или WinPopUP - для 95/98/ME не запущена), то имя будет считаться пустым. Далее следует - проверка по спискам доступа. Данный тип авторизации не зависит от платформы - сервера (т.е. прокси сервер, запущенный под Unix, сможет определять NetBIOS - имена). Его рекомендуется использовать в однородных сетях, где у всех клиентов - установлена Windows NT/2000/XP и пользователи не имеют доступа к - привелегированным учетным записям. Этот вид авторизации не является надежным. + Перед проверкой по списком доступа будет произведена попытка получить NetBIOS + имя клиента. Для этого используется NetBIOS код службы messager (0x03). Если + имя определить не удалось (служба messager для Windows NT/2000/XP или WinPopUP + для 95/98/ME не запущена), то имя будет считаться пустым. Далее следует + проверка по спискам доступа. Данный тип авторизации не зависит от платформы + сервера (т.е. прокси сервер, запущенный под Unix, сможет определять NetBIOS + имена). Его рекомендуется использовать в однородных сетях, где у всех клиентов + установлена Windows NT/2000/XP и пользователи не имеют доступа к + привелегированным учетным записям. Этот вид авторизации не является надежным.
auth strong- Проверяется имя и пароль, переданные пользователем при подключении к прокси. - Данный вид авторизации работает только с proxy и socks. Необходимо задание - списка пользователей (см Как создать список пользователей). - Соединения от неизвестных пользователей не принимаются. После проверки имени - пользвоателя и пароля происходит проверка списков доступа. -
- Для разных служб можно установить различные типы авторизации, например, + Проверяется имя и пароль, переданные пользователем при подключении к прокси. + Данный вид авторизации работает только с proxy и socks. Необходимо задание + списка пользователей (см Как создать список пользователей). + Соединения от неизвестных пользователей не принимаются. После проверки имени + пользвоателя и пароля происходит проверка списков доступа. +
+ Для разных служб можно установить различные типы авторизации, например,
auth none pop3p @@ -1056,169 +1056,169 @@ pcre_extend deny * 192.168.0.1/16 proxy auth strong socks- не накладывает ограничений на использование POP3 Proxy, производит проверку - по спискам доступа для пользователей HTTP Proxy и требует авторизации с именем - и паролем для SOCKS. -
С версии 0.6 возможно использвоать двойную авторизацию, например, + не накладывает ограничений на использование POP3 Proxy, производит проверку + по спискам доступа для пользователей HTTP Proxy и требует авторизации с именем + и паролем для SOCKS. +
С версии 0.6 возможно использвоать двойную авторизацию, например,
auth iponly strong allow * * 192.168.0.0/16 allow user1,user2 proxy- будет использовать авторизацию только в том случае, если не удалось пропустить - пользователя с авторизаций iponly, т.е. для доступа к ресурсам 192.168.0.0/16 - авторизация не требуется. -
С версии 0.6 так же можно использвоать кэширование авторизации (имени - пользователя) с целью повышения производительности. Использовать кэширование - для strong практически не имеет смысла, она полезно для nbname и авторизации - через внешние плагины, типа WindowsAuthentication. Кэширование настраивается - командой authcache с двумя параметрами - типом кэширования и временем, на - которое кэшируется пароль. Возможные типы: ip - после успешной авторизации в - течение времени кэширования все запросы пришедшие с того же адреса считаются - запросами от того же пользователя, name - после успешной авторизации от - пользователя с тем же именем требуют указания имени, но реально аутентификации - не производится, ip,name - запрос должен придти от того же IP и с тем же - именем. user,password - имя и пароль пользователя сверяются с кэшированными. - Возможны и другие сочетания. Для авторизации должен использоваться специальный - метод авторизации - cache. Пример: + будет использовать авторизацию только в том случае, если не удалось пропустить + пользователя с авторизаций iponly, т.е. для доступа к ресурсам 192.168.0.0/16 + авторизация не требуется. +
С версии 0.6 так же можно использвоать кэширование авторизации (имени + пользователя) с целью повышения производительности. Использовать кэширование + для strong практически не имеет смысла, она полезно для nbname и авторизации + через внешние плагины, типа WindowsAuthentication. Кэширование настраивается + командой authcache с двумя параметрами - типом кэширования и временем, на + которое кэшируется пароль. Возможные типы: ip - после успешной авторизации в + течение времени кэширования все запросы пришедшие с того же адреса считаются + запросами от того же пользователя, name - после успешной авторизации от + пользователя с тем же именем требуют указания имени, но реально аутентификации + не производится, ip,name - запрос должен придти от того же IP и с тем же + именем. user,password - имя и пароль пользователя сверяются с кэшированными. + Возможны и другие сочетания. Для авторизации должен использоваться специальный + метод авторизации - cache. Пример:
authcache ip 60 auth cache strong windows proxy -n- Кэширование влияет на безопасность доступа. Ни в коем случае не следует - использовать кэширование для доступа к критичным ресурсам, в частности к - интерфейсу администрирования. - -
authcache так же может использоваться для привязки сессий пользователя к ip с - с помощью опции limit + Кэширование влияет на безопасность доступа. Ни в коем случае не следует + использовать кэширование для доступа к критичным ресурсам, в частности к + интерфейсу администрирования. +
+authcache так же может использоваться для привязки сессий пользователя к ip с + с помощью опции limit
autchcache ip,user,pass,limit 120 auth cache strong- запретит пользователю использовать более одного адреса в течении времени кеширования. - -
- Список пользователей задается с помощью команды users. + запретит пользователю использовать более одного адреса в течении времени кеширования. +
++ Список пользователей задается с помощью команды users.
users USERDESC ...- С помощью одной команды можно задать несколько пользователей, можно - давать несколько команд users. USERDESC - описание пользователя. Описание - пользователя состоит из трех полей разделенных : (двоеточием) - имени (login) - типа пароля и пароля. Например: + С помощью одной команды можно задать несколько пользователей, можно + давать несколько команд users. USERDESC - описание пользователя. Описание + пользователя состоит из трех полей разделенных : (двоеточием) - имени (login) + типа пароля и пароля. Например:
users admin:CL:bigsecret test:CL:password test1:CL:password1 users "test2:CR:$1$lFDGlder$pLRb4cU2D7GAT58YQvY49." users test3:NT:BD7DFBF29A93F93C63CB84790DA00E63- Обратите внимание на двойные кавычки - они необходимы для второго пользователя, - т.к. в его пароле встречается знак $, который для файла 3proxy.cfg означает - включение другого файла. Поддеживается следующие типы паролей: -
users $/etc/.3proxypasswd- или + или
users $"c:\Program Files\3proxy\passwords"- Шифрованные NT и crypt пароли можно создавать с помощью утилиты 3proxy_crypt. -
- Для построения списков доступа используются команды allow, deny и
- flush. Команды имеют следующую структуру:
+ Шифрованные NT и crypt пароли можно создавать с помощью утилиты 3proxy_crypt.
+
Список пользователей един для всех служб. Разграничение доступа по службам
+ необходимо производить с помощью списков доступа.
+
+ Для построения списков доступа используются команды allow, deny и + flush. Команды имеют следующую структуру:
allow <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> <weekdays> <timeperiodslist> deny <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> <weekdays> <timeperiodslist> flush- Команда flush используется для сброса существующего списка доступа (это - необходимо для того, чтобы можно было задать различные списки доступа для - различных служб). allow служит для разрешения соединения, deny - для запрета - соединения. Команда parent используется в качестве расширения команды - allow для управления перенаправлениями соединений (о перенаправлении см. Как управлять перенаправлениями). - В момент установки исходящего соединения просматривается список доступа и - находится первая запись, соответствующая запрошенному клиентом соединению. - Если запись соттветствует allow - соединение разрешается, deny - запрещается. - Если список пуст, то соединение разрешается. Если список не пуст, но подходящей - записи нет, то соединение запрещается. При этом: -
- Перенаправления имеет смысл использовать, например, чтобы перенаправить - обращения определенных клиентов или на определнные сервера на другой сервер - (например, при попытке доступа на Web сервер с недозволенным материалом - перенаправить на собственный Web сервер, или для того, чтобы в зависимости - от IP клиента перенаправлять его соединения на разные сервера (особенно при - отображении портов через tcppm). Кроме того, перенаправление может быть - использовано, например, для перенаправления все исходящих HTTP запросов, - посланных через SOCKS, на HTTP прокси. Поскольку формат запроса к Web серверу - и Proxy различается, не любой Proxy сервер способен корректно обработать - перенаправленный запрос (HTTP proxy в комплекте 3proxy нормально обрабатывает - перенаправленные запросы, что делает возможным его использования в качестве - "прозрачного" прокси. Кроме того, HTTP прокси обнаруживает перенаправления - на родительский прокси и генерирует нормальные заголовки. Пример простейшего - перенаправления: + Команда flush используется для сброса существующего списка доступа (это + необходимо для того, чтобы можно было задать различные списки доступа для + различных служб). allow служит для разрешения соединения, deny - для запрета + соединения. Команда parent используется в качестве расширения команды + allow для управления перенаправлениями соединений (о перенаправлении см. Как управлять перенаправлениями). + В момент установки исходящего соединения просматривается список доступа и + находится первая запись, соответствующая запрошенному клиентом соединению. + Если запись соттветствует allow - соединение разрешается, deny - запрещается. + Если список пуст, то соединение разрешается. Если список не пуст, но подходящей + записи нет, то соединение запрещается. При этом: +
+ Перенаправления имеет смысл использовать, например, чтобы перенаправить + обращения определенных клиентов или на определнные сервера на другой сервер + (например, при попытке доступа на Web сервер с недозволенным материалом + перенаправить на собственный Web сервер, или для того, чтобы в зависимости + от IP клиента перенаправлять его соединения на разные сервера (особенно при + отображении портов через tcppm). Кроме того, перенаправление может быть + использовано, например, для перенаправления все исходящих HTTP запросов, + посланных через SOCKS, на HTTP прокси. Поскольку формат запроса к Web серверу + и Proxy различается, не любой Proxy сервер способен корректно обработать + перенаправленный запрос (HTTP proxy в комплекте 3proxy нормально обрабатывает + перенаправленные запросы, что делает возможным его использования в качестве + "прозрачного" прокси. Кроме того, HTTP прокси обнаруживает перенаправления + на родительский прокси и генерирует нормальные заголовки. Пример простейшего + перенаправления:
auth iponly allow * parent 1000 http 192.168.1.1 3128 proxy- перенаправляет весь трафик службы proxy на родительский HTTP-прокси сервер - 192.168.1.1 порт 3128. -
auth iponly allow * * * 80 @@ -1228,569 +1228,569 @@ pcre_extend deny * 192.168.0.1/16 allow * * * 110 parent 1000 pop3 0.0.0.0 0 socks- перенаправляет все содеинения, проходящие через SOCKS-сервер по 80 порту, в - локальный HTTP прокси, 21-му - в FTP, и 110 - в POP3 прокси. При этом службы - proxy, ftppr или pop3pr запускать не требуется. Это может быть полезно для - того, чтобы видеть в логах записи о посещаемых пользвоателем ресурсах и - загружаемых файлах даже в том случае, если он подключается через SOCKS. - + перенаправляет все содеинения, проходящие через SOCKS-сервер по 80 порту, в + локальный HTTP прокси, 21-му - в FTP, и 110 - в POP3 прокси. При этом службы + proxy, ftppr или pop3pr запускать не требуется. Это может быть полезно для + того, чтобы видеть в логах записи о посещаемых пользвоателем ресурсах и + загружаемых файлах даже в том случае, если он подключается через SOCKS. +
- A: Чтобы иметь в логах URL запросов, если пользователь SOCKS пользуется - Web, FTP или POP3. -
-- A: Перенапраление невозможно для web-серверов или FTP, висящих на - нестандартных портах, для SOCKSv4 не поддрживается авторизация с - паролем (IE поддерживает только SOCKSv4), но при этом IE передает - имя пользователя по SOCKSv4 (имя, с которым пользователь вошел в систему). - Для SOCKSv5 не поддерживается NTLM авторизация, пароли передаются в открытом - тексте. -
-- A: Достаточно в настройках IE только указать адрес SOCKS прокси. В - больших сетях можно для этого использовать WPAD (автоматическое - обнаружение прокси). В 3proxy достаточно запускать только одну службу - (socks). Если используется только Internet Explorer, то можно - автоматически получать имя пользователя в логах, не запрашивая - логин/пароль. -
-- A: Указывается parent http proxy со специальным адресом 0.0.0.0 и портом - 0. Пример: +
+ A: Чтобы иметь в логах URL запросов, если пользователь SOCKS пользуется + Web, FTP или POP3. +
++ A: Перенапраление невозможно для web-серверов или FTP, висящих на + нестандартных портах, для SOCKSv4 не поддрживается авторизация с + паролем (IE поддерживает только SOCKSv4), но при этом IE передает + имя пользователя по SOCKSv4 (имя, с которым пользователь вошел в систему). + Для SOCKSv5 не поддерживается NTLM авторизация, пароли передаются в открытом + тексте. +
++ A: Достаточно в настройках IE только указать адрес SOCKS прокси. В + больших сетях можно для этого использовать WPAD (автоматическое + обнаружение прокси). В 3proxy достаточно запускать только одну службу + (socks). Если используется только Internet Explorer, то можно + автоматически получать имя пользователя в логах, не запрашивая + логин/пароль. +
++ A: Указывается parent http proxy со специальным адресом 0.0.0.0 и портом + 0. Пример:
allow * * * 80,8080-8088 parent 1000 http 0.0.0.0 0 allow * * * 80,8080-8088 - #перенаправить соединения по портам 80 и 8080-8088 в локальный - #http прокси. Вторая команда allow необходима, т.к. контроль доступа - #осуществляется 2 раза - на уровне socks и на уровне HTTP прокси + #перенаправить соединения по портам 80 и 8080-8088 в локальный + #http прокси. Вторая команда allow необходима, т.к. контроль доступа + #осуществляется 2 раза - на уровне socks и на уровне HTTP прокси allow * * * 21,2121 parent 1000 ftp 0.0.0.0 0 allow * * * 21,2121 - #перенаправить соединения по портам 21 и 2121 в локальный - #ftp прокси + #перенаправить соединения по портам 21 и 2121 в локальный + #ftp прокси allow * - #пустить все соединения напрямую + #пустить все соединения напрямую socks- -
- A: После внутреннего перенаправления правила рассматриваются еще раз за - исключением самого правила с перенаправлением (т.е. обработка правил не - прекращается). Это позволяет сделать дальнейшие перенаправления на - внешний прокси. По этой же причине локальное перенаправление не должно - быть последним правилом (т.е. должно быть еще хотя бы правило allow, - чтобы разрешить внешние соединения через HTTP прокси). - Например, +
++ A: После внутреннего перенаправления правила рассматриваются еще раз за + исключением самого правила с перенаправлением (т.е. обработка правил не + прекращается). Это позволяет сделать дальнейшие перенаправления на + внешний прокси. По этой же причине локальное перенаправление не должно + быть последним правилом (т.е. должно быть еще хотя бы правило allow, + чтобы разрешить внешние соединения через HTTP прокси). + Например,
allow * * * 80,8080-8088 parent 1000 http 0.0.0.0 0 - #перенаправить во внутренний прокси + #перенаправить во внутренний прокси allow * * $c:\3proxy\local.nets 80,8080-8088 - #разрешить прямой web-доступ к сетям из local.nets + #разрешить прямой web-доступ к сетям из local.nets allow * * * 80,8080-8088 parent 1000 http proxy.3proxy.ru 3128 - #все остальные веб-запросы перенаправить на внешний прокси-сервер + #все остальные веб-запросы перенаправить на внешний прокси-сервер allow * - #разрешить socks-запросы по другим портам- + #разрешить socks-запросы по другим портам + -
- Сам по себе прокси не может управлять маршрутизацией пакетов сетевого уровня. - Единственная возможность для управления внешними соединениями - это выбор - внешнего интерфейса. Сделать выбор внешнего интерфейса случайным начиная - с версии 0.6 можно с использованием локальных перенаправлений (с номером - порта равным нулю): +
+ Сам по себе прокси не может управлять маршрутизацией пакетов сетевого уровня. + Единственная возможность для управления внешними соединениями - это выбор + внешнего интерфейса. Сделать выбор внешнего интерфейса случайным начиная + с версии 0.6 можно с использованием локальных перенаправлений (с номером + порта равным нулю):
auth iponly allow * parent 500 http 10.1.1.101 0 parent 500 http 10.2.1.102 0- будет использовать внешний интерфейс 10.1.1.1 или 10.2.1.1 с вероятностью 0.5. - Внешний интерфейс это то же, что задается командой external или опцией -e. - Чтобы это работало как ожидается, необходимо, чтобы локальным интерфейсам - 10.1.1.1 и 10.2.1.1 соответствовали разные маршруты по-умолчанию. -
- Если оба адреса принадлежат одной сети, например, 10.1.1.101 и 10.1.1.102 и - нужно случайным образом выбирать один из шлюзов 10.1.1.1 и 10.1.1.2, то нужно - управлять роутингом примерно так (при условии что маршрут по-умолчанию не - задан): + будет использовать внешний интерфейс 10.1.1.1 или 10.2.1.1 с вероятностью 0.5. + Внешний интерфейс это то же, что задается командой external или опцией -e. + Чтобы это работало как ожидается, необходимо, чтобы локальным интерфейсам + 10.1.1.1 и 10.2.1.1 соответствовали разные маршруты по-умолчанию. +
+ Если оба адреса принадлежат одной сети, например, 10.1.1.101 и 10.1.1.102 и + нужно случайным образом выбирать один из шлюзов 10.1.1.1 и 10.1.1.2, то нужно + управлять роутингом примерно так (при условии что маршрут по-умолчанию не + задан):
route add -p 10.1.1.1 10.1.1.101 route add -p 10.1.1.2 10.1.1.102 route add -p 0.0.0.0 mask 0.0.0.0 192.168.1.1 route add -p 0.0.0.0 mask 0.0.0.0 192.168.1.2- Если второго адреса на прокси сервере нет - его надо добавить. Под Linux/Unix - лучше использовать source routing. - -
- Для составления цепочек прокси так же можно использовать команду parent, которая - является расширением команды allow (т.е. команде parent должна предшествовать - команда allow). С помощью этой команды можно строить цепочки из HTTPS - (HTTP CONNECT), SOCKS4 и SOCKS5 прокси (т.е. последовательно подключаться - через несколько прокси), при этом возможна авторизация на родительском прокси, - звено цепочки может выбираться случайным образом из несольких значений - с вероятностью согласно их весу. Вес (от 1 до 1000) задается для каждого - прокси. Сумма весов по всем перенаправлениям должна быть кратна 1000. - Прокси с весами до 1000 группируются, и при построении цепочки один из них - выбирается случайно согласно весу. Длина цепочки определяется из суммарного - веса. Например, если суммарный вес цепочки 3000, в цепочке будет 3 звена (хопа). - Синтаксис команды: + Если второго адреса на прокси сервере нет - его надо добавить. Под Linux/Unix + лучше использовать source routing. +
++ Для составления цепочек прокси так же можно использовать команду parent, которая + является расширением команды allow (т.е. команде parent должна предшествовать + команда allow). С помощью этой команды можно строить цепочки из HTTPS + (HTTP CONNECT), SOCKS4 и SOCKS5 прокси (т.е. последовательно подключаться + через несколько прокси), при этом возможна авторизация на родительском прокси, + звено цепочки может выбираться случайным образом из несольких значений + с вероятностью согласно их весу. Вес (от 1 до 1000) задается для каждого + прокси. Сумма весов по всем перенаправлениям должна быть кратна 1000. + Прокси с весами до 1000 группируются, и при построении цепочки один из них + выбирается случайно согласно весу. Длина цепочки определяется из суммарного + веса. Например, если суммарный вес цепочки 3000, в цепочке будет 3 звена (хопа). + Синтаксис команды:
parent <weight> <type> <ip> <port> <username> <password>- weight - вес прокси, type - тип прокси (tcp - перенаправление соединения, - может быть только последним в цепочке, http - синоним tcp, connect - HTTP - CONNECT/HTTPS прокси, socks4 - SOCKSv4 прокси, socks5 - SOCKSv5 прокси), - ip - IP адрес прокси, port - порт прокси, username - имя для авторизации - на прокси (опционально), password - пароль для авторизации на прокси - (опционально). -
allow * parent 500 socks5 192.168.1.1 1080 parent 500 connect 192.168.10.1 3128- Создает цепочку из одного звена (суммарный вес 1000), в котором один из двух - прокси выбирается случайно с равной вероятностью (веса равны). В цепочку - перенаправляются все исходящие соединения (определяется командой allow). + Создает цепочку из одного звена (суммарный вес 1000), в котором один из двух + прокси выбирается случайно с равной вероятностью (веса равны). В цепочку + перенаправляются все исходящие соединения (определяется командой allow).
allow * * * 80 parent 1000 socks5 192.168.10.1 1080 parent 1000 connect 192.168.20.1 3128 parent 300 socks4 192.168.30.1 1080 parent 700 socks5 192.168.40.1 1080- Создает цепочку из трех звеньев (суммарный вес 3000). Первое звено - - 192.168.10.1, второе - 192.168.20.1, а третье - либо 192.168.30.1 с - вероятностью 0.3 либо 192.168.40.1 с вероятностью 0.7 - -
- 3proxy позволяет устанавливать фильтры ширины потребляемого канала. Для этого - служат команды bandlimin/bandlimout и nobandlimin/nobandlimout - (in в команде означает, что правило применяется к входящему трафику, - out - к исходящему). + Создает цепочку из трех звеньев (суммарный вес 3000). Первое звено - + 192.168.10.1, второе - 192.168.20.1, а третье - либо 192.168.30.1 с + вероятностью 0.3 либо 192.168.40.1 с вероятностью 0.7 +
++ 3proxy позволяет устанавливать фильтры ширины потребляемого канала. Для этого + служат команды bandlimin/bandlimout и nobandlimin/nobandlimout + (in в команде означает, что правило применяется к входящему трафику, + out - к исходящему).
bandlimin <bitrate> <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> nobandlimin <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist>-
- bitrate указывает ширину потока в битах в секунду (именно в битах). В остальном - команды аналогичны командам allow/deny с тем отличием, что команды bandlim - не имеют привязки к конкретному сервису, такому как HTTP прокси или SOCKS - и действуют на все сервисы, трафик по всем соединениям, попавшим под действие - правила суммируется независимо от того, через какой сервис это соединение - установлено. +
+ bitrate указывает ширину потока в битах в секунду (именно в битах). В остальном + команды аналогичны командам allow/deny с тем отличием, что команды bandlim + не имеют привязки к конкретному сервису, такому как HTTP прокси или SOCKS + и действуют на все сервисы, трафик по всем соединениям, попавшим под действие + правила суммируется независимо от того, через какой сервис это соединение + установлено.
bandlimin 57600 * 192.168.10.16 bandlimin 57600 * 192.168.10.17 bandlimin 57600 * 192.168.10.18 bandlimin 57600 * 192.168.10.19- устанавалиет канал 57600 для каждого из четырех клиентов, + устанавалиет канал 57600 для каждого из четырех клиентов,
bandlimin 57600 * 192.168.10.16/30- устанавалиает суммарный канал 57600 на 4-х клиентов. Если необходимо, чтобы на - какой-то сервис не было ограничения ширины канала, следует указать nobandlim - для этого сервиса, например: + устанавалиает суммарный канал 57600 на 4-х клиентов. Если необходимо, чтобы на + какой-то сервис не было ограничения ширины канала, следует указать nobandlim + для этого сервиса, например:
nobandlimin * * * 110 bandlimin 57600 * 192.168.10.16/32- разрешает клиентам неограниченный по скорости доступ по протоколу POP3. - -
+ разрешает клиентам неограниченный по скорости доступ по протоколу POP3. +
+
counter <filename> <type> <reportpath> countin <number> <type> <amount> <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> nocountin <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist>- countout <number> <type> <amount> <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> - nocountout <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> -
- Команды позволяют установить лимит трафика на день, неделю или месяц.
- Сведения о трафике постоянно сохраняются в двоичном файле, указываемом
- командой counter, что делает подсчет трафика независимым от
- перезагрузки прокси. Можно управлять двоичным файлом, используя утилиту
- countersutil.
- Действие команд countin/nocountin аналогично действию bandlimin/nobandlimin,
- number - задает последовательный номер счетчика, номер должен быть
- уникальным положительным числом. Значение 0 указывает, что сведения
- для данного счетчика не надо сохранять в файле.
-
- reportpath - путь, по которому будут создаваться текстовые отчеты по
- потребленному трафику.
-
- type - тип ограничения или частота создания файлов отчета.
- D (На день), W (на неделю) или M (на месяц).
-
- amount - объем трафика на указанный период в мегабайтах.
-
- Следует учитывать, что 3proxy считает трафик только на прикладном уровне и - только проходящий через прокси-сервер. Провайдеры и другие средства учета - трафика считают трафик на сетевом уровне, что уже дает расхождение порядка 10% - за счет информации из заголовков пакетов. Кроме того, часть трафика, как - минимум DNS-разрешения, различный флудовый трафик и т.д. идут мимо прокси. - Уровень "шумового" трафика в Internet сейчас составляет порядка 50KB/день на - каждый реальный IP адрес, но может сильно варьироваться в зависимости от сети, - наличия открытых портов, реакции на ping-запросы и текущего уровня вирусной - активности. По этим причинам, если 3proxy используется чтобы не "выжрать" - трафик, выделенный провайдером, всегда следует делать некий запас порядка - 15%. -
-- Если на одной с 3proxy машине имеются какие-либо сервисы или - работает пользователь, то их трафик не проходит через proxy-сервер и так же - не будет учтен. Если где-то есть NAT, то клиенты, выходящие через NAT мимо - прокси, так же останутся неучтенными. Если расхождение с провайдером превышает - 10% - нужно искать причину именно в этом. -
-- Для разрешения имен и кэширования применяются команды nserver, - nscache и nsrecord. + countout <number> <type> <amount> <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> + nocountout <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> +
+ Команды позволяют установить лимит трафика на день, неделю или месяц.
+ Сведения о трафике постоянно сохраняются в двоичном файле, указываемом
+ командой counter, что делает подсчет трафика независимым от
+ перезагрузки прокси. Можно управлять двоичным файлом, используя утилиту
+ countersutil.
+ Действие команд countin/nocountin аналогично действию bandlimin/nobandlimin,
+ number - задает последовательный номер счетчика, номер должен быть
+ уникальным положительным числом. Значение 0 указывает, что сведения
+ для данного счетчика не надо сохранять в файле.
+
+ reportpath - путь, по которому будут создаваться текстовые отчеты по
+ потребленному трафику.
+
+ type - тип ограничения или частота создания файлов отчета.
+ D (На день), W (на неделю) или M (на месяц).
+
+ amount - объем трафика на указанный период в мегабайтах.
+
+ Следует учитывать, что 3proxy считает трафик только на прикладном уровне и + только проходящий через прокси-сервер. Провайдеры и другие средства учета + трафика считают трафик на сетевом уровне, что уже дает расхождение порядка 10% + за счет информации из заголовков пакетов. Кроме того, часть трафика, как + минимум DNS-разрешения, различный флудовый трафик и т.д. идут мимо прокси. + Уровень "шумового" трафика в Internet сейчас составляет порядка 50KB/день на + каждый реальный IP адрес, но может сильно варьироваться в зависимости от сети, + наличия открытых портов, реакции на ping-запросы и текущего уровня вирусной + активности. По этим причинам, если 3proxy используется чтобы не "выжрать" + трафик, выделенный провайдером, всегда следует делать некий запас порядка + 15%. +
++ Если на одной с 3proxy машине имеются какие-либо сервисы или + работает пользователь, то их трафик не проходит через proxy-сервер и так же + не будет учтен. Если где-то есть NAT, то клиенты, выходящие через NAT мимо + прокси, так же останутся неучтенными. Если расхождение с провайдером превышает + 10% - нужно искать причину именно в этом. +
++ Для разрешения имен и кэширования применяются команды nserver, + nscache и nsrecord.
nserver 192.168.1.2 nserver 192.168.1.3:5353/tcp- указывает 3proxy какие машины следует использвоать в качестве серверов - DNS. Сервер 192.168.1.3 будет использоваться по порту TCP/5353 (вместо дефолтного UDP/53) только при недостижимости - 192.168.1.2. Можно указать до 5 серверов. Если nserver не указан, будут - использованы системные функции разрешения имен. + указывает 3proxy какие машины следует использвоать в качестве серверов + DNS. Сервер 192.168.1.3 будет использоваться по порту TCP/5353 (вместо дефолтного UDP/53) только при недостижимости + 192.168.1.2. Можно указать до 5 серверов. Если nserver не указан, будут + использованы системные функции разрешения имен.
nscache 65535 nscache6 65535- указывает размер кэша для разрешения имен (обычно достаточно большой) для IPv4 и IPv6 соответственно. - Кэш исопльзуется только при явном указании nserver. + указывает размер кэша для разрешения имен (обычно достаточно большой) для IPv4 и IPv6 соответственно. + Кэш исопльзуется только при явном указании nserver.
nsrecord server.mycompany.example.com 192.168.1.1 nsrecord www.porno.com 127.0.0.2 ... deny * * 127.0.0.2- добавляет статическую запись в кэш. Статические записи так же влияют на разрешение через dnspr если не указана опция -s. Начиная с версии 0.8 для dnspr могут быть сконфигурированы родительские прокси. -
- IPv6 поддерживается с версии 0.8. Обратите внимание, что в некоторых видах прокси (например SOCKSv4)
- IPv6 не поддерживает на уровне протокола. В SOCKSv5 есть поддержка IPv6 с помощью отдельного вида
- запроса, который должен быть реализован в клиентском приложении или соксификаторе.
-
- Возможно проксирование из сетей IPv4 и IPv6 в сети IPv4,
- IPv6 и смешанные. Адреса IPv6 могут использоваться в командах
- internal, external, parent, ACL, опциях -i, -e и т.д. Команду external и опцию
- -e для каждого сервиса можно давать два раза - один раз с IPv4 и один раз с IPv6
- адресом. internal и -i может быть указан только один, для биндинга ко всем адресам IPv4 и IPv6
- можно использовать адрес [0:0:0:0:0:0:0:0] or [::].
-
- Кроме того, для каждого сервиса могут быть даны опции -4, -46, -64, -6 которые
- задают приоритет разрешения имен в адреса IPv4 и IPv6 (только IPv4, приоритет IPv4, приоритет IPv6, только IPv6).
-
- Например, пользователю нужен доступ к прокси-серверу, который расположен - на хосте 192.168.1.2 недоступном из внешней сети, но имеющем доступ во внешнюю - сеть с внешним адрес 1.1.1.1. Так же у него есть машина с именем host.dyndns.example.org - с внешним адресом 2.2.2.2. Пользователь запускает 2 экземпляра 3proxy, один на - хосте 192.168.1.2 с конфигурацией + добавляет статическую запись в кэш. Статические записи так же влияют на разрешение через dnspr если не указана опция -s. Начиная с версии 0.8 для dnspr могут быть сконфигурированы родительские прокси.
+
+ IPv6 поддерживается с версии 0.8. Обратите внимание, что в некоторых видах прокси (например SOCKSv4)
+ IPv6 не поддерживает на уровне протокола. В SOCKSv5 есть поддержка IPv6 с помощью отдельного вида
+ запроса, который должен быть реализован в клиентском приложении или соксификаторе.
+
+ Возможно проксирование из сетей IPv4 и IPv6 в сети IPv4,
+ IPv6 и смешанные. Адреса IPv6 могут использоваться в командах
+ internal, external, parent, ACL, опциях -i, -e и т.д. Команду external и опцию
+ -e для каждого сервиса можно давать два раза - один раз с IPv4 и один раз с IPv6
+ адресом. internal и -i может быть указан только один, для биндинга ко всем адресам IPv4 и IPv6
+ можно использовать адрес [0:0:0:0:0:0:0:0] or [::].
+
+ Кроме того, для каждого сервиса могут быть даны опции -4, -46, -64, -6 которые
+ задают приоритет разрешения имен в адреса IPv4 и IPv6 (только IPv4, приоритет IPv4, приоритет IPv6, только IPv6).
+
+ Например, пользователю нужен доступ к прокси-серверу, который расположен + на хосте 192.168.1.2 недоступном из внешней сети, но имеющем доступ во внешнюю + сеть с внешним адрес 1.1.1.1. Так же у него есть машина с именем host.dyndns.example.org + с внешним адресом 2.2.2.2. Пользователь запускает 2 экземпляра 3proxy, один на + хосте 192.168.1.2 с конфигурацией
users user:CL:password auth strong allow user proxy -rhost.dyndns.example.org:1234- второй на хосте host.dyndns.example.org (2.2.2.2) с конфигурацией + второй на хосте host.dyndns.example.org (2.2.2.2) с конфигурацией
auth iponly allow * * 1.1.1.1 tcppm -R0.0.0.0:1234 3128 1.1.1.1 3128- В настройках браузера указывается host.dyndns.example.org:3128. - -
- 3proxy поддерживает протокол HAProxy PROXY v1 как для приёма, так и для - отправки информации об IP-адресе клиента. Это полезно, когда 3proxy находится - за балансировщиком нагрузки или при передаче информации о клиенте родительскому прокси. -
-
- Приём заголовка PROXY протокола:
-
Используйте опцию -H, чтобы 3proxy ожидал заголовок PROXY протокола v1
- на входящих соединениях. Это позволяет 3proxy получать реальный IP-адрес клиента
- от HAProxy или другого балансировщика нагрузки:
+ В настройках браузера указывается host.dyndns.example.org:3128.
+
+ 3proxy поддерживает протокол HAProxy PROXY v1 как для приёма, так и для + отправки информации об IP-адресе клиента. Это полезно, когда 3proxy находится + за балансировщиком нагрузки или при передаче информации о клиенте родительскому прокси. +
+
+ Приём заголовка PROXY протокола:
+
Используйте опцию -H, чтобы 3proxy ожидал заголовок PROXY протокола v1
+ на входящих соединениях. Это позволяет 3proxy получать реальный IP-адрес клиента
+ от HAProxy или другого балансировщика нагрузки:
proxy -H -p3128 socks -H -p1080-
- Заголовок PROXY протокола должен быть отправлен до любых протокольных данных. -
-
- Отправка заголовка PROXY протокола родительскому прокси:
-
Используйте тип родительского прокси ha для отправки заголовка
- PROXY протокола v1 родительскому прокси. Укажите ha перед родителем,
- который должен получить заголовок; после отправки заголовка продолжается
- хендшейк протокола родителя:
+
+ Заголовок PROXY протокола должен быть отправлен до любых протокольных данных. +
+
+ Отправка заголовка PROXY протокола родительскому прокси:
+
Используйте тип родительского прокси ha для отправки заголовка
+ PROXY протокола v1 родительскому прокси. Укажите ha перед родителем,
+ который должен получить заголовок; после отправки заголовка продолжается
+ хендшейк протокола родителя:
allow * parent 1000 ha 0.0.0.0 0 parent 1000 socks5 parent.example.com 1080 proxy-
- Эта конфигурация подключается к SOCKS5 родителю, отправляет PROXY заголовок
- с исходным IP клиента, затем выполняет SOCKS5-хендшейк и только после этого
- передаёт полезную нагрузку. Родитель должен использовать -H
- (например socks -H).
-
- Используйте команду maxseg для установки максимального размера
- сегмента TCP (MSS) для исходящих соединений. Это может быть полезно для обхода
- проблем с Path MTU Discovery или для оптимизации трафика в специфических
- сетевых условиях:
+
+ Эта конфигурация подключается к SOCKS5 родителю, отправляет PROXY заголовок
+ с исходным IP клиента, затем выполняет SOCKS5-хендшейк и только после этого
+ передаёт полезную нагрузку. Родитель должен использовать -H
+ (например socks -H).
+
+ Используйте команду maxseg для установки максимального размера
+ сегмента TCP (MSS) для исходящих соединений. Это может быть полезно для обхода
+ проблем с Path MTU Discovery или для оптимизации трафика в специфических
+ сетевых условиях:
maxseg 1400 proxy -p3128 -OcTCP_NODELAY,TCP_MAXSEG -OsTCP_NODELAY,TCP_MAXSEG-
- Значение указывается в байтах. Эта настройка использует опцию сокета TCP_MAXSEG - и может не поддерживаться на всех платформах. Типичный случай использования - - уменьшение MSS для избежания фрагментации в VPN туннелях или для обхода проблем - с MTU на определённых сетевых путях. -
++ Значение указывается в байтах. Эта настройка использует опцию сокета TCP_MAXSEG + и может не поддерживаться на всех платформах. Типичный случай использования - + уменьшение MSS для избежания фрагментации в VPN туннелях или для обхода проблем + с MTU на определённых сетевых путях. +
Мы будем рассматривать Interenet Explorer, т.к. у него больше особенностей - настройки, с другими браузерами должно возникать меньше вопросов. -
Есть два основных способа работы с 3proxy - использовать HTTP прокси (сервис - proxy) или SOCKS прокси (сервис socks). Обычно используется HTTP прокси. Для - SOCKS прокси можно использовать встроенную поддержку браузера или - программу-соксификатор (см. - Как использовать 3proxy с программой, не поддерживающей работу с прокси-сервером), - если встроенная поддержка SOCKS чем-то не устраивает или так удобнее. Не все - соксификаторы поддерживают входящие соединения, поэтому чтобы не было проблем с - протоколом FTP лучше использовать пассивный режим (в Internet Explorer 5.5SP2 - и выше "Использовать пассивный FTP-протокол"). -
Для конфигурации HTTP прокси необходимо указать внутренний адрес и порт, - установленые для службы proxy в конфигурации 3proxy (либо как "Один - прокси-сервер для всех протоколов" либо для HTTP, Secure, FTP). Поддержка - Gopher в 3proxy в настоящий момент не реализована, но этот устаревший протокол - в Internet практически не используется. Для нормальной работы FTP через HTTP - прокси необходимо отключить представление для папок FTP (FTP folder view), - он включен по-умолчанию, т.к. иначе FTP будет работать без использвания HTTP - прокси. HTTP прокси использует пассивный режим для протокола FTP. В настройках - 3proxy рекомендуется разрешть метод HTTP_CONNECT только для порта назначения 443. - Если метод HTTP_CONNECT не разрешен, то не будет работать протокол HTTPS, если - он разрешен для всех портов, то можно обойти журналирование запросов для - протокола HTTP). - Для работы с HTTP прокси может использоваться авторизация по паролю (strong). -
Для использования SOCKS необходимо настроить только SOCKS прокси (иначе для - протоколов, для которых указан прокси сервер, он будет использоваться как HTTP - прокси). Internet Explorer (включая IE 6.0SP1) - поддерживает только SOCKSv4. В качестве имени пользователя передается имя - пользователя, использованное для входа в систему. Передача пароля в SOCKSv4 не - поддерживается, поэтому авторизация по паролю (strong) не доступна. Можно - использовать имя пользователя, переданное браузером в ACL для iponly-авторизации, - но при этом необходимо иметь ввиду ненадежность такого способа. При работе через - SOCKS Internet Explorer (и большая часть других браузеров) используют пассивный - режим работы для FTP. При использовании SOCKS можно получить в журнале (логах) - URL запрашиваемых страниц, для этого необходимо создать внутреннее - перенаправление в HTTP прокси для порта 80 (и других портов, используемых для - HTTP) в локальный HTTP прокси (proxy), порт 21 (и другие порты, используемые - FTP) в FTP прокси. При перенаправлении соединений в FTP прокси, нужно иметь - ввиду, что FTP создает вторичные соединения для передачи данных. Для этого, - во-первых, необходимо разрешить доступ к внутреннему интерфейсу прокси сервера - через SOCKS (что не очень безопасно), во-вторых, принять меры, чтобы в SOCKS - такие соединения на внутренний интерфейс не тарифицировались (т.к. иначе они - будут тарифицироваться дважды - SOCKS и FTP прокси). -
Internet Explorer и другие продвинутые браузеры поддерживают автоматическую
- конфигурацию прокси-сервера в полностью автоматическом или полуавтоматическом
- режимах. Автоматическая конфигурация позволяет задать достаточно сложные
- правила, позволяющие клиентам использовать (или не использвоать) разные
- прокси-серверы для доступа к разным ресурсам. Эта возможность разбирается в
- статьях
-
Microsoft: Q296591 A Description of the Automatic Discovery Feature
-
http://support.microsoft.com/default.aspx?scid=kb;EN-US;296591
-
Netscape: Navigator Proxy Auto-Config File Format
-
http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html
-
- Настройка FTP клиента для работы через SOCKS прокси не отличается от настройки - браузера. -
- Для работы с FTP клиентом через FTP прокси (ftppr) есть несколько возможностей. - Допустим, нам необходимо подключиться ко внешнему FTP серверу со следующими - параметрами: +
Мы будем рассматривать Interenet Explorer, т.к. у него больше особенностей + настройки, с другими браузерами должно возникать меньше вопросов. +
Есть два основных способа работы с 3proxy - использовать HTTP прокси (сервис + proxy) или SOCKS прокси (сервис socks). Обычно используется HTTP прокси. Для + SOCKS прокси можно использовать встроенную поддержку браузера или + программу-соксификатор (см. + Как использовать 3proxy с программой, не поддерживающей работу с прокси-сервером), + если встроенная поддержка SOCKS чем-то не устраивает или так удобнее. Не все + соксификаторы поддерживают входящие соединения, поэтому чтобы не было проблем с + протоколом FTP лучше использовать пассивный режим (в Internet Explorer 5.5SP2 + и выше "Использовать пассивный FTP-протокол"). +
Для конфигурации HTTP прокси необходимо указать внутренний адрес и порт, + установленые для службы proxy в конфигурации 3proxy (либо как "Один + прокси-сервер для всех протоколов" либо для HTTP, Secure, FTP). Поддержка + Gopher в 3proxy в настоящий момент не реализована, но этот устаревший протокол + в Internet практически не используется. Для нормальной работы FTP через HTTP + прокси необходимо отключить представление для папок FTP (FTP folder view), + он включен по-умолчанию, т.к. иначе FTP будет работать без использвания HTTP + прокси. HTTP прокси использует пассивный режим для протокола FTP. В настройках + 3proxy рекомендуется разрешть метод HTTP_CONNECT только для порта назначения 443. + Если метод HTTP_CONNECT не разрешен, то не будет работать протокол HTTPS, если + он разрешен для всех портов, то можно обойти журналирование запросов для + протокола HTTP). + Для работы с HTTP прокси может использоваться авторизация по паролю (strong). +
Для использования SOCKS необходимо настроить только SOCKS прокси (иначе для + протоколов, для которых указан прокси сервер, он будет использоваться как HTTP + прокси). Internet Explorer (включая IE 6.0SP1) + поддерживает только SOCKSv4. В качестве имени пользователя передается имя + пользователя, использованное для входа в систему. Передача пароля в SOCKSv4 не + поддерживается, поэтому авторизация по паролю (strong) не доступна. Можно + использовать имя пользователя, переданное браузером в ACL для iponly-авторизации, + но при этом необходимо иметь ввиду ненадежность такого способа. При работе через + SOCKS Internet Explorer (и большая часть других браузеров) используют пассивный + режим работы для FTP. При использовании SOCKS можно получить в журнале (логах) + URL запрашиваемых страниц, для этого необходимо создать внутреннее + перенаправление в HTTP прокси для порта 80 (и других портов, используемых для + HTTP) в локальный HTTP прокси (proxy), порт 21 (и другие порты, используемые + FTP) в FTP прокси. При перенаправлении соединений в FTP прокси, нужно иметь + ввиду, что FTP создает вторичные соединения для передачи данных. Для этого, + во-первых, необходимо разрешить доступ к внутреннему интерфейсу прокси сервера + через SOCKS (что не очень безопасно), во-вторых, принять меры, чтобы в SOCKS + такие соединения на внутренний интерфейс не тарифицировались (т.к. иначе они + будут тарифицироваться дважды - SOCKS и FTP прокси). +
Internet Explorer и другие продвинутые браузеры поддерживают автоматическую
+ конфигурацию прокси-сервера в полностью автоматическом или полуавтоматическом
+ режимах. Автоматическая конфигурация позволяет задать достаточно сложные
+ правила, позволяющие клиентам использовать (или не использвоать) разные
+ прокси-серверы для доступа к разным ресурсам. Эта возможность разбирается в
+ статьях
+
Microsoft: Q296591 A Description of the Automatic Discovery Feature
+
http://support.microsoft.com/default.aspx?scid=kb;EN-US;296591
+
Netscape: Navigator Proxy Auto-Config File Format
+
http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html
+
+ Настройка FTP клиента для работы через SOCKS прокси не отличается от настройки + браузера. +
+ Для работы с FTP клиентом через FTP прокси (ftppr) есть несколько возможностей. + Допустим, нам необходимо подключиться ко внешнему FTP серверу со следующими + параметрами:
- Адрес: ftp.security.nnov.ru - Username: ftpuser - Password: ********-
Работа с клиентом, не поддерживающим FTP прокси - в качестве адреса FTP - сервера указывается адрес прокси (например, proxy.security.nnov.ru), в качестве - имени пользователя ftpuser@ftp.security.nnov.ru. Если для доступа к службе - ftppr требуется авторизация по имени и паролю с именем pruser и паролем prpass, - то в качестве имени пользователя необходимо указать - pruser:prpass:ftpuser@ftp.security.nnov.ru. Если FTP клиент требует указания - полной URL для подключения к серверу, то она должна выглядеть как -
- pruser:prpass:ftpuser@ftp.security.nnov.ru:********@proxy.security.nnov.ru -
- Не все клиенты обработают это корректно, но в большинстве случаев этого не - требуется. -
Работа с клиентом, поддерживающим FTP прокси - если 3proxy - не требует авторизации по паролю, то настройки стандартны для клиента. Если - требуется доступ по паролю, то в качестве имени пользователя указывается - pruser:prpass:ftpuser. -
- В большинстве случаев достаточно установить отображение (tcppm) TCP порта 25 на - аналогичный порт SMTP сервера провайдера. В конфигурации клиента указать - внутренний адрес прокси в качестве адреса SMTP-сервера. -
- Предположим, у вас есть следующие настройки для получения почты: + Адрес: ftp.security.nnov.ru + Username: ftpuser + Password: ******** +
Работа с клиентом, не поддерживающим FTP прокси - в качестве адреса FTP + сервера указывается адрес прокси (например, proxy.security.nnov.ru), в качестве + имени пользователя ftpuser@ftp.security.nnov.ru. Если для доступа к службе + ftppr требуется авторизация по имени и паролю с именем pruser и паролем prpass, + то в качестве имени пользователя необходимо указать + pruser:prpass:ftpuser@ftp.security.nnov.ru. Если FTP клиент требует указания + полной URL для подключения к серверу, то она должна выглядеть как +
+ pruser:prpass:ftpuser@ftp.security.nnov.ru:********@proxy.security.nnov.ru +
+ Не все клиенты обработают это корректно, но в большинстве случаев этого не + требуется. +
Работа с клиентом, поддерживающим FTP прокси - если 3proxy + не требует авторизации по паролю, то настройки стандартны для клиента. Если + требуется доступ по паролю, то в качестве имени пользователя указывается + pruser:prpass:ftpuser. +
+ В большинстве случаев достаточно установить отображение (tcppm) TCP порта 25 на + аналогичный порт SMTP сервера провайдера. В конфигурации клиента указать + внутренний адрес прокси в качестве адреса SMTP-сервера. +
+ Предположим, у вас есть следующие настройки для получения почты:
- POP3 server: pop3.security.nnov.ru - Login: user - Password: ********- В настройках почтовой программы следует указать: + POP3 server: pop3.security.nnov.ru + Login: user + Password: ******** + В настройках почтовой программы следует указать:
- POP3 server: (адрес прокси-сервера) - Login: user@pop3.security.nnov.ru - Password: ********-
- Имя пользователя может само по себе содержать знак '@'. Если в примере выше - имя пользователя user@security.nnov.ru, то имя пользвоателя для доступа к - прокси-серверу должно быть user@security.nnov.ru@pop3.security.nnov.ru. Если - pop3pr требует авторизации по имени/паролю (например, pruser и prpass), то их - необходимо указать в начале имени пользователя, отделив знаком ':', т.е для - самого тяжелого случая pruser:prpass:user@security.nnov.ru@pop3.security.nnov.ru -
-- Можно использовать любую программу-редиректор. 3proxy поддерживает исходящие - и обратные TCP и UDP соединения, но редиректоры могут иметь свои ограничения, - кроме того, некоторые плохо написаные приложения не поддаются "соксификации". - Если программе требуется обращаться к небольшому набору серверов - (например, игровых), то проблему можно решить с помощью портмаппинга. -
- Если по каким-то причинам соксификатор не работает или недоступен, - то необходимо использовать отображения портов (обычно игры, - кроме mood-подобных, работают по протоколу UDP, надо использовать udppm). - Нужно иметь ввиду, что для udppm требуется отдельный маппинг для каждого - серверного порта и каждого клиента. Например, если есть один сервер с портами - 2115 и 2116 и три клиента, то нужно создать 6 разных маппингов, например + POP3 server: (адрес прокси-сервера) + Login: user@pop3.security.nnov.ru + Password: ******** +
+ Имя пользователя может само по себе содержать знак '@'. Если в примере выше + имя пользователя user@security.nnov.ru, то имя пользвоателя для доступа к + прокси-серверу должно быть user@security.nnov.ru@pop3.security.nnov.ru. Если + pop3pr требует авторизации по имени/паролю (например, pruser и prpass), то их + необходимо указать в начале имени пользователя, отделив знаком ':', т.е для + самого тяжелого случая pruser:prpass:user@security.nnov.ru@pop3.security.nnov.ru +
++ Можно использовать любую программу-редиректор. 3proxy поддерживает исходящие + и обратные TCP и UDP соединения, но редиректоры могут иметь свои ограничения, + кроме того, некоторые плохо написаные приложения не поддаются "соксификации". + Если программе требуется обращаться к небольшому набору серверов + (например, игровых), то проблему можно решить с помощью портмаппинга. +
+ Если по каким-то причинам соксификатор не работает или недоступен, + то необходимо использовать отображения портов (обычно игры, + кроме mood-подобных, работают по протоколу UDP, надо использовать udppm). + Нужно иметь ввиду, что для udppm требуется отдельный маппинг для каждого + серверного порта и каждого клиента. Например, если есть один сервер с портами + 2115 и 2116 и три клиента, то нужно создать 6 разных маппингов, например
- udppm 12115 server 2115 - udppm 12115 server 2115 - udppm 22115 server 2115 - udppm 32115 server 2115 - udppm 12116 server 2116 - udppm 22116 server 2116 - udppm 32116 server 2116- В игровом клиенте адрес и порт с маппингом следует указывать вместо адреса - и порта сервера. - + udppm 12115 server 2115 + udppm 12115 server 2115 + udppm 22115 server 2115 + udppm 32115 server 2115 + udppm 12116 server 2116 + udppm 22116 server 2116 + udppm 32116 server 2116 + В игровом клиенте адрес и порт с маппингом следует указывать вместо адреса + и порта сервера. +
- Свежую версию всегда можно взять - здесь. Обратите внимание, - что в новой версии может измениться порядок лицензирования или команды - конфигурации, поэтому прежде чем устанавливать новую версии программы - обязательно ознакомьтесь с документацией. -
-- При установке 3proxy в качестве системной службы сервером поддерживаются - команды запуска, остановки, временной приостановки и продолжения. - При временной приостановке сервер перестает принимать новые запросы от - клиентов, но обработка ранее поступивших запросов продолжается. Сервер не - подерживает динамическое изменение конфигурации, т.е. после изменения - конфигурации 3proxy необходимо перезапустить. - Управлять запуском, остановкой, приостановкой и продолжением можно либо - через служебную программу "Службы" (Services) либо через команду net: +
+ Свежую версию всегда можно взять + здесь. Обратите внимание, + что в новой версии может измениться порядок лицензирования или команды + конфигурации, поэтому прежде чем устанавливать новую версии программы + обязательно ознакомьтесь с документацией. +
++ При установке 3proxy в качестве системной службы сервером поддерживаются + команды запуска, остановки, временной приостановки и продолжения. + При временной приостановке сервер перестает принимать новые запросы от + клиентов, но обработка ранее поступивших запросов продолжается. Сервер не + подерживает динамическое изменение конфигурации, т.е. после изменения + конфигурации 3proxy необходимо перезапустить. + Управлять запуском, остановкой, приостановкой и продолжением можно либо + через служебную программу "Службы" (Services) либо через команду net:
net start 3proxy net stop 3proxy net pause 3proxy net continue 3proxy- -
-
+
trafcorrect p <сервис> <tcp/udp> <исходящий порт> [размер пустого пакета]- <tcp/udp> - протокол, по которому осуществляется соединение. - [размер пакета] - средний размер пустого пакета. Можно определить захватив + <tcp/udp> - протокол, по которому осуществляется соединение. + [размер пакета] - средний размер пустого пакета. Можно определить захватив данные при помощи такой утилиты как Ethereal. Параметр необязателен. Если отсутствует, то размер пакета будет считаться равным 66 байт.