Using SOCKS 4/5 proxy is no easy task:

- a machine may well be able to reach the proxy, even if it is not on the same sub-net(s) as the machine itself (absolutely legitimate)
 - tsocks.conf needs a list of so-called 'local' networks that can be reached without the need for a SOCKS connection
 - SOCKS proxies are expected to be in 'local' networks
 - there is absolutely NO way to tell what networks are local, besides the sub-net(s) the machine is in

Therefore, appropriate configuration of SOCKS 4/5 configuration is really complex, and attempts to correctly overcome this issue are doomed.

 /trunk/scripts/crosstool.sh              |   52    46     6     0 ++++++++++++++++++++++++++++++++++----
 /trunk/config/global/download_extract.in |   39    31     8     0 +++++++++++++++++++++++------
 2 files changed, 77 insertions(+), 14 deletions(-)
This commit is contained in:
Yann E. MORIN" 2008-04-18 22:16:28 +00:00
parent b44e4e652a
commit 59ed1ed600
2 changed files with 77 additions and 14 deletions

View File

@ -74,7 +74,8 @@ endif # USE_HTTP_PROXY
config PROXY_TYPE_SOCKS
bool
prompt "SOCKS 4/5 proxy"
prompt "SOCKS 4/5 proxy (EXPERIMENTAL)"
depends on EXPERIMENTAL
help
Use a Socks 4/5 proxy to connect to the internet.
All protocols can get tunneled through this kind of proxy (depending
@ -100,18 +101,36 @@ if PROXY_TYPE_SOCKS
choice
bool
prompt "type"
default PROXY_TYPE_SOCKS_5
default PROXY_TYPE_SOCKS_SYS
config PROXY_TYPE_SOCKS_5
config PROXY_TYPE_SOCKS_SYS
bool
prompt "SOCKS 5"
prompt "Use system settings"
help
Use that if your system is already configured to
connect to SOCKS 4/5 proxies.
config PROXY_TYPE_SOCKS_AUTO
bool
prompt "Auto"
help
crosstool-NG will attempt to guess what type of
SOCKS version the proxy speaks.
config PROXY_TYPE_SOCKS_4
bool
prompt "SOCKS 4"
config PROXY_TYPE_SOCKS_5
bool
prompt "SOCKS 5"
endchoice
if ! PROXY_TYPE_SOCKS_SYS
comment "THIS IS HIGHLY EXPERIMENTAL!!!"
config PROXY_HOST
string
prompt "hostname/IP"
@ -129,16 +148,20 @@ config PROXY_PASS
string
prompt "password"
endif # ! PROXY_TYPE_SOCKS_SYS
endif # USE_SOCKS_PROXY
endchoice
config PROXY_TYPE
string
default "none" if PROXY_TYPE_NONE
default "http" if PROXY_TYPE_HTTP
default "socks5" if PROXY_TYPE_SOCKS_5
default "socks4" if PROXY_TYPE_SOCKS_4
default "none" if PROXY_TYPE_NONE
default "http" if PROXY_TYPE_HTTP
default "sockssys" if PROXY_TYPE_SOCKS_SYS
default "socksauto" if PROXY_TYPE_SOCKS_AUTO
default "socks4" if PROXY_TYPE_SOCKS_4
default "socks5" if PROXY_TYPE_SOCKS_5
# Force restore indentation
config BREAK_INDENT

View File

@ -224,15 +224,55 @@ case "${CT_PROXY_TYPE}" in
export ftp_proxy="${http_proxy}"
CT_DoLog DEBUG "http_proxy='${http_proxy}'"
;;
socks?)
# Re;ove any lingering config file from any previous run
sockssys)
CT_HasOrAbort tsocks
. tsocks -on
;;
socks*)
CT_HasOrAbort tsocks
# Remove any lingering config file from any previous run
rm -f "${CT_BUILD_DIR}/tsocks.conf"
( echo "server=${CT_PROXY_HOST}";
echo "server_port=${CT_PROXY_PORT}";
echo "server_type=${CT_PROXY_TYPE#socks}";
# Find all interfaces and build locally accessible networks
/sbin/ifconfig |gawk '
$0 ~ /inet addr:/ {
split( $2, ip, ":|\\." );
ip_num = ip[2]*2^24 + ip[3]*2^16 + ip[4]*2^8 + ip[5]*2^0;
# Skip 127.0.0.1
if( ip_num == 2130706433 ) {
next;
}
split( $(NF), mask, ":|\\." );
mask_num = mask[2]*2^24 + mask[3]*2^16 + mask[4]*2^8 + mask[5]*2^0;
ip_num = and( ip_num, mask_num );
printf( "local = %d.%d.%d.%d/%d.%d.%d.%d\n",
and( 0xFF, rshift( ip_num, 24 ) ),
and( 0xFF, rshift( ip_num, 16 ) ),
and( 0xFF, rshift( ip_num, 8 ) ),
and( 0xFF, rshift( ip_num, 0 ) ),
and( 0xFF, rshift( mask_num, 24 ) ),
and( 0xFF, rshift( mask_num, 16 ) ),
and( 0xFF, rshift( mask_num, 8 ) ),
and( 0xFF, rshift( mask_num, 0 ) ) );
}
' >"${CT_BUILD_DIR}/tsocks.conf"
( echo "server = ${CT_PROXY_HOST}";
echo "server_port = ${CT_PROXY_PORT}";
[ -n "${CT_PROXY_USER}" ] && echo "default_user=${CT_PROXY_USER}";
[ -n "${CT_PROXY_PASS}" ] && echo "default_pass=${CT_PROXY_PASS}";
) >"${CT_BUILD_DIR}/tsocks.conf"
) >>"${CT_BUILD_DIR}/tsocks.conf"
case "${CT_PROXY_TYPE/socks}" in
4|5) proxy_type="${CT_PROXY_TYPE/socks}";;
auto)
reply=$(inspectsocks "${CT_PROXY_HOST}" "${CT_PROXY_PORT}" 2>&1 || true)
case "${reply}" in
*"server is a version 4 socks server"*) proxy_type=4;;
*"server is a version 5 socks server"*) proxy_type=5;;
*) CT_Abort "Unable to determine SOCKS proxy type for '${CT_PROXY_HOST}:${CT_PROXY_PORT}'"
esac
;;
esac
echo "server_type = ${proxy_type}" >> "${CT_BUILD_DIR}/tsocks.conf"
validateconf -f "${CT_BUILD_DIR}/tsocks.conf" 2>&1 |CT_DoLog DEBUG
export TSOCKS_CONF_FILE="${CT_BUILD_DIR}/tsocks.conf"
. tsocks -on
;;