依存関係のダウンロード#
yum install -y libevent libevent-devel gcc
ソースコードのダウンロード#
https://github.com/darkk/redsocks
ソースコードのコンパイル#
cd redsocks
make
ショートカット#
redsocks を /usr/bin にコピーします
設定ファイルの変更#
proxy.sh(自動化スクリプト)と /etc/redsocks.conf を変更します
proxy.sh(centos7)
#!/bin/bash
socks5_ip="192.168.31.200"
user="root"
line(){
echo -e "========================================="
}
startproxy(){
# iptablesポリシーの設定
iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -d $socks5_ip -j RETURN
iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 100.64.0.0/10 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 198.18.0.0/15 -j RETURN
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
# その他はすべてポート12345にリダイレクトされるべきです
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
# `luser'によって作成された任意のtcp接続はリダイレクトされるべきです。
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $user -j REDSOCKS
# redsocksサービスを開始します
nohup redsocks -c /etc/redsocks.conf > /dev/null 2>&1 &
redsocks_pid=$(ps -ef | grep 'redsocks' | grep -v 'grep' | awk '{ printf $2 }')
}
stopproxy(){
# iptablesポリシーをクリアします
iptables -t nat -F
iptables -t nat -X
# redsocksサービスを停止します
kill $redsocks_pid
wait $redsocks_pid 2>/dev/null
}
while true;do
line
echo -e "Redsocks自動化スクリプト【1.0】
【1】全体プロキシを開始
【2】全体プロキシを停止"
line
read -r -p "数字を入力してください【1-2】:" num
if [ $num -eq 1 ]; then
startproxy
echo "【+】Redsocksが開始されました。。。"
continue
elif [ $num -eq 2 ]; then
stopproxy
echo "【-】Redsocksが停止されました。。。"
continue
else
echo -e "正しい数字を入力してください!!!"
fi
done
proxy.sh(kali)
#!/bin/bash
socks5_ip="192.168.31.121"
user="root"
red_prefix="\033[31m"
green_prefix="\033[32m"
purple_prefix="\033[35m"
font_suffix="\033[0m"
line(){
echo -e "========================================="
}
startproxy(){
# iptablesポリシーの設定
iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -d $socks5_ip -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 198.18.0.0/15 -j RETURN
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
# その他はすべてポート12345にリダイレクトされるべきです
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
# `luser'によって作成された任意のtcp接続はリダイレクトされるべきです。
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $user -j REDSOCKS
# redsocksサービスを開始します
nohup redsocks -c /etc/redsocks.conf > /dev/null 2>&1 &
# redsocksプロセスIDを取得します
redsocks_pid=$(ps -ef | grep 'redsocks' | grep -v 'grep' | awk '{ printf $2 }')
}
stopproxy(){
# iptablesポリシーをクリアします
iptables -t nat -F
iptables -t nat -X
# redsocksサービスを停止します
pkill redsocks
}
while true;do
if [ $(netstat -tanplu | grep redsocks | wc -l) -ne 0 ];then
line
echo -e " $purple_prefix Redsocks自動化スクリプト【1.0】$font_suffix
$green_prefix【現在の状態:開始】$font_suffix
【1】全体プロキシを開始
【2】全体プロキシを停止"
line
else
line
echo -e " $purple_prefix Redsocks自動化スクリプト【1.0】$font_suffix
$red_prefix【現在の状態:停止】$font_suffix
【1】全体プロキシを開始
【2】全体プロキシを停止"
line
fi
read -r -p "数字を入力してください【1-2】:" num
if [ $num -eq 1 ]; then
startproxy
echo -e "$green_prefix 【+】Redsocksが開始されました。。。$font_suffix"
continue
elif [ $num -eq 2 ]; then
stopproxy
echo -e "$red_prefix【-】Redsocksが停止されました。。。$font_suffix"
continue
else
echo -e "正しい数字を入力してください!!!"
fi
done
/etc/redsocks.conf
base {
// デバッグ: 接続の進行状況
log_debug = off;
// 情報: クライアントセッションの開始と終了
log_info = on;
/* 可能な`log`値は次のとおりです:
* stderr
* "file:/path/to/file"
* syslog:FACILITY facilityは"daemon"、"local0"..."local7"のいずれかです
*/
log = stderr;
// log = "file:/path/to/file";
// log = "syslog:local7";
// コンソールから切り離す
daemon = off;
/* uid、gid、およびルートディレクトリを変更します。これらのオプションは、起動時にroot権限を必要とします。
* 注意: chrootを使用する場合、ログをsyslogに書き込む場合は/etc/localtimeが必要です。
* ログはchrootおよびuid変更の前に開かれます。
* Debian、Ubuntuおよび他のいくつかのディストリビューションは、`nobody`の代わりに`nogroup`を使用します。
* したがって、redsocksがroot権限を放棄するようにしたい場合は、システムに応じて変更してください。
*/
// user = nobody;
// group = nobody;
// chroot = "/var/chroot";
/* 可能な`redirector`値は次のとおりです:
* iptables - Linux用
* ipf - FreeBSD用
* pf - OpenBSD用
* generic - 動作する可能性のある一般的なリダイレクタ
*/
redirector = iptables;
/* TCP_KEEPIDLE、TCP_KEEPCNT、およびTCP_KEEPINTVLのソケットごとの値をオーバーライドします。
* 詳細についてはman 7 tcpを参照してください。
* `redsocks`はSO_KEEPALIVEオプションに大きく依存しています。 */
//tcp_keepalive_time = 0;
//tcp_keepalive_probes = 0;
//tcp_keepalive_intvl = 0;
// 各`redsocks`接続には、ソケット用に2つのファイルディスクリプタが必要です。
// `splice`が有効な場合、パイプ用に4つのファイルディスクリプタも必要です。`redudp`は現在考慮されていません。
// 最大接続数に達すると、redsocksはアイドル接続を閉じようとします。アイドル接続がない場合、新しい接続をaccept()するのを停止しますが、
// カーネルはlistenqを埋め続けます。
// 開いているファイルディスクリプタの最大数を設定します(`ulimit -n`としても知られています)。
// 0 -- 起動制限を変更しない(デフォルト)
// rlimit_nofile = 0;
// サーブされる接続の最大数を設定します。デフォルトは、`splice`設定とRLIMIT_NOFILEから安全な制限を推測することです。
// redsocks_conn_max = 0;
// 接続数制限に達した場合、N秒間アイドル状態の接続を閉じます。
// 0 -- アイドル接続を閉じない
// 7440 -- 2時間4分、RFC 5382を参照(デフォルト)
// connpres_idle_timeout = 7440;
// `max_accept_backoff`は、失敗後に`accept()`を再試行するためのミリ秒単位の遅延です(例: ファイルディスクリプタが不足しているため)。
// これは、誤って設定された`redsocks_conn_max`のための安全ネットです。acceptバックオフが発生した場合は、redsocks_conn_maxを調整する必要があります。
// max_accept_backoff = 60000;
}
redsocks {
/* `local_ip`はセキュリティ上の理由から127.0.0.1がデフォルトですが、
* すべてのインターフェースでリッスンしたい場合は0.0.0.0を使用します。
* `local_*`はリダイレクト先のポートとして使用されます。
*/
local_ip = 127.0.0.1;
local_port = 12345;
// listen()キューの長さ。デフォルト値はSOMAXCONNで、ほとんどの人にとって十分であるはずです。
// listenq = 128; // SOMAXCONNは私のLinuxボックスで128に等しいです。
// splice(2)システムコールに基づいて、より高速なデータポンプを有効または無効にします。
// デフォルト値はカーネルのバージョンに依存し、2.6.27.13以上ではtrueです。
// splice = false;
// `ip`と`port`はプロキシサーバーのIPとtcpポートです。
// IPの代わりにホスト名を使用することもできます。マルチホーミングホストのアドレスのうち、1つ(ランダム)だけが使用されます。
ip = 192.168.31.200;
port = 2801;
// 知られているタイプ: socks4, socks5, http-connect, http-relay
type = socks5;
// login = "foobar";
// password = "baz";
// プロキシにクライアントIPを開示する方法:
// false -- 何も開示しない
// http-connectは次のことをサポートします:
// X-Forwarded-For -- X-Forwarded-For: IP
// Forwarded_ip -- Forwarded: for=IP # RFC7239を参照
// Forwarded_ipport -- Forwarded: for="IP:port" # RFC7239を参照
// disclose_src = false;
// プロキシの失敗を処理するさまざまな方法
// close -- 接続を単に閉じる(デフォルト)
// forward_http_err -- プロキシからHTTPエラーページをそのまま転送
// on_proxy_fail = close;
}
redudp {
// `local_ip`は0.0.0.0であってはならず、これは応答として送信されるパケットにも使用されるため、
// NATが正しく機能するためには修正する必要があります。
local_ip = 127.0.0.1;
local_port = 10053;
// socks5プロキシサーバーの`ip`と`port`。
ip = 10.0.0.1;
port = 1080;
login = username;
password = pazzw0rd;
// redsocksは、LinuxでUDPパケットをリダイレクトする際に2つのオプションを認識しています: TPROXYとREDIRECT。
// TPROXYはより複雑なルーティング設定と新しいカーネル(>= 2.6.37、squid開発者による)を必要としますが、
// 元の宛先アドレスを取得するためのハックフリーな方法です。REDIRECTは設定が簡単ですが、`dest_ip`と
// `dest_port`を設定する必要があり、パケットのリダイレクトを単一の宛先に制限します。
// [1] http://wiki.squid-cache.org/Features/Tproxy4
dest_ip = 8.8.8.8;
dest_port = 53;
udp_timeout = 30;
udp_timeout_stream = 180;
}
dnstc {
// 偽の非常に単純なDNSサーバーで、すべてのクエリに対して"切り捨てられた回答"を返します。
// RFC準拠のリゾルバは、この場合TCP経由で同じクエリを繰り返す必要があります。
local_ip = 127.0.0.1;
local_port = 5300;
}
dnsu2t {
// 偽の少し賢いDNSサーバーで、いくつかのUDPクエリを単一のパイプライン化されたTCPストリームのDNSクエリに変換します。
local_ip = 127.0.0.1;
local_port = 5313;
// https://en.wikipedia.org/wiki/Public_recursive_name_serverを参照してください
// 注意: この${ip}:${port}へのTCP接続はプロキシを通過しません。必要に応じてファイアウォールルールを設定してください。
remote_ip = 8.8.8.8;
remote_port = 53;
// リモートサーバーに送信される同時に進行中のDNSクエリの最大数。
// 一部の公共DNSサーバーはこれを制限し、高い数の進行中のリクエストで接続を終了するようです。
// したがって、リクエストの待機時間と可用性の間のトレードオフです。進行中のリクエストはキャッシュされず、
// DNS/TCP接続が終了した場合は失われます。
// inflight_max = 16;
// リモートエンドポイントのI/Oタイムアウト。デフォルト値はかなり保守的で、Wikipediaの公共サーバーの中で最も高いタイムアウトに対応しています。
// remote_timeout = 30;
}
// 必要に応じて、さらに多くの`redsocks`および`redudp`セクションを追加できます。