<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.raf.cc/index.php?action=history&amp;feed=atom&amp;title=Redsocks</id>
	<title>Redsocks - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.raf.cc/index.php?action=history&amp;feed=atom&amp;title=Redsocks"/>
	<link rel="alternate" type="text/html" href="https://wiki.raf.cc/index.php?title=Redsocks&amp;action=history"/>
	<updated>2026-04-15T15:58:53Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://wiki.raf.cc/index.php?title=Redsocks&amp;diff=488&amp;oldid=prev</id>
		<title>Admin：​创建页面，内容为“&lt;syntaxhighlight lang=&quot;bash&quot; line=&quot;1&quot;&gt; #!/usr/bin/env bash set -euo pipefail  ### ================= 基本配置 ================= REDSOCKS_CONF=&quot;/etc/redsocks.conf&quot; REDSOCKS_BIN=&quot;/usr/sbin/redsocks&quot;     # 源码版可能是 /usr/local/bin/redsocks REDSOCKS_PORT=12345  CHAIN=&quot;NETPROXY&quot; MARK=&quot;0x1&quot;  STATE_DIR=&quot;/run/netproxy&quot; IPTABLES_BACKUP=&quot;$STATE_DIR/iptables.bak&quot;  ### ================= 工具函数 ================= die() {     echo &quot;[ERROR] $*&quot; &gt;&amp;2     exit 1…”</title>
		<link rel="alternate" type="text/html" href="https://wiki.raf.cc/index.php?title=Redsocks&amp;diff=488&amp;oldid=prev"/>
		<updated>2026-01-19T01:47:45Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt; #!/usr/bin/env bash set -euo pipefail  ### ================= 基本配置 ================= REDSOCKS_CONF=&amp;quot;/etc/redsocks.conf&amp;quot; REDSOCKS_BIN=&amp;quot;/usr/sbin/redsocks&amp;quot;     # 源码版可能是 /usr/local/bin/redsocks REDSOCKS_PORT=12345  CHAIN=&amp;quot;NETPROXY&amp;quot; MARK=&amp;quot;0x1&amp;quot;  STATE_DIR=&amp;quot;/run/netproxy&amp;quot; IPTABLES_BACKUP=&amp;quot;$STATE_DIR/iptables.bak&amp;quot;  ### ================= 工具函数 ================= die() {     echo &amp;quot;[ERROR] $*&amp;quot; &amp;gt;&amp;amp;2     exit 1…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
### ================= 基本配置 =================&lt;br /&gt;
REDSOCKS_CONF=&amp;quot;/etc/redsocks.conf&amp;quot;&lt;br /&gt;
REDSOCKS_BIN=&amp;quot;/usr/sbin/redsocks&amp;quot;     # 源码版可能是 /usr/local/bin/redsocks&lt;br /&gt;
REDSOCKS_PORT=12345&lt;br /&gt;
&lt;br /&gt;
CHAIN=&amp;quot;NETPROXY&amp;quot;&lt;br /&gt;
MARK=&amp;quot;0x1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
STATE_DIR=&amp;quot;/run/netproxy&amp;quot;&lt;br /&gt;
IPTABLES_BACKUP=&amp;quot;$STATE_DIR/iptables.bak&amp;quot;&lt;br /&gt;
&lt;br /&gt;
### ================= 工具函数 =================&lt;br /&gt;
die() {&lt;br /&gt;
    echo &amp;quot;[ERROR] $*&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
    exit 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
need_root() {&lt;br /&gt;
    [[ $EUID -eq 0 ]] || die &amp;quot;Must run as root&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ensure_dirs() {&lt;br /&gt;
    mkdir -p &amp;quot;$STATE_DIR&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
parse_proxy() {&lt;br /&gt;
    [[ &amp;quot;$1&amp;quot; =~ ^([^:]+):([0-9]+)$ ]] || die &amp;quot;Invalid proxy format: ip:port&amp;quot;&lt;br /&gt;
    PROXY_IP=&amp;quot;${BASH_REMATCH[1]}&amp;quot;&lt;br /&gt;
    PROXY_PORT=&amp;quot;${BASH_REMATCH[2]}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
### ================= redsocks =================&lt;br /&gt;
write_redsocks_conf() {&lt;br /&gt;
    cat &amp;gt; &amp;quot;$REDSOCKS_CONF&amp;quot; &amp;lt;&amp;lt;EOF&lt;br /&gt;
base {&lt;br /&gt;
    log_info = on;&lt;br /&gt;
    log = &amp;quot;syslog:daemon&amp;quot;;&lt;br /&gt;
    daemon = on;&lt;br /&gt;
    redirector = iptables;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
redsocks {&lt;br /&gt;
    local_ip = 127.0.0.1;&lt;br /&gt;
    local_port = $REDSOCKS_PORT;&lt;br /&gt;
    ip = $PROXY_IP;&lt;br /&gt;
    port = $PROXY_PORT;&lt;br /&gt;
    type = socks5;&lt;br /&gt;
}&lt;br /&gt;
EOF&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
start_redsocks() {&lt;br /&gt;
    pkill redsocks 2&amp;gt;/dev/null || true&lt;br /&gt;
    &amp;quot;$REDSOCKS_BIN&amp;quot; -c &amp;quot;$REDSOCKS_CONF&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
stop_redsocks() {&lt;br /&gt;
    pkill redsocks 2&amp;gt;/dev/null || true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
### ================= iptables =================&lt;br /&gt;
iptables_save() {&lt;br /&gt;
    iptables-save &amp;gt; &amp;quot;$IPTABLES_BACKUP&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
iptables_restore() {&lt;br /&gt;
    [[ -f &amp;quot;$IPTABLES_BACKUP&amp;quot; ]] &amp;amp;&amp;amp; iptables-restore &amp;lt; &amp;quot;$IPTABLES_BACKUP&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
iptables_apply() {&lt;br /&gt;
    # nat 链&lt;br /&gt;
    iptables -t nat -N $CHAIN 2&amp;gt;/dev/null || true&lt;br /&gt;
    iptables -t nat -F $CHAIN&lt;br /&gt;
&lt;br /&gt;
    # 已标记流量直接放行（防回环）&lt;br /&gt;
    iptables -t nat -A $CHAIN -m mark --mark $MARK -j RETURN&lt;br /&gt;
&lt;br /&gt;
    # 本地 &amp;amp; 私网放行&lt;br /&gt;
    iptables -t nat -A $CHAIN -d 127.0.0.0/8 -j RETURN&lt;br /&gt;
&lt;br /&gt;
    # 排除代理服务器自身（关键）&lt;br /&gt;
    iptables -t nat -A $CHAIN -d &amp;quot;$PROXY_IP&amp;quot; -j RETURN&lt;br /&gt;
&lt;br /&gt;
    # TCP 全部重定向&lt;br /&gt;
    iptables -t nat -A $CHAIN -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT&lt;br /&gt;
&lt;br /&gt;
    # 挂载到 OUTPUT（只影响本机）&lt;br /&gt;
    iptables -t nat -C OUTPUT -p tcp -j $CHAIN 2&amp;gt;/dev/null || \&lt;br /&gt;
        iptables -t nat -A OUTPUT -p tcp -j $CHAIN&lt;br /&gt;
&lt;br /&gt;
    # mangle：给 redsocks 出口流量打标记&lt;br /&gt;
    iptables -t mangle -C OUTPUT -p tcp --sport $REDSOCKS_PORT -j MARK --set-mark $MARK 2&amp;gt;/dev/null || \&lt;br /&gt;
        iptables -t mangle -A OUTPUT -p tcp --sport $REDSOCKS_PORT -j MARK --set-mark $MARK&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
iptables_clear() {&lt;br /&gt;
    iptables -t nat -D OUTPUT -p tcp -j $CHAIN 2&amp;gt;/dev/null || true&lt;br /&gt;
    iptables -t nat -F $CHAIN 2&amp;gt;/dev/null || true&lt;br /&gt;
    iptables -t nat -X $CHAIN 2&amp;gt;/dev/null || true&lt;br /&gt;
&lt;br /&gt;
    iptables -t mangle -D OUTPUT -p tcp --sport $REDSOCKS_PORT -j MARK --set-mark $MARK 2&amp;gt;/dev/null || true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
### ================= 命令实现 =================&lt;br /&gt;
cmd_start() {&lt;br /&gt;
    parse_proxy &amp;quot;$1&amp;quot;&lt;br /&gt;
    ensure_dirs&lt;br /&gt;
    iptables_save&lt;br /&gt;
    write_redsocks_conf&lt;br /&gt;
    start_redsocks&lt;br /&gt;
    iptables_apply&lt;br /&gt;
    echo &amp;quot;[OK] netproxy started via $PROXY_IP:$PROXY_PORT&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmd_stop() {&lt;br /&gt;
    stop_redsocks&lt;br /&gt;
    iptables_restore || iptables_clear&lt;br /&gt;
    rm -rf &amp;quot;$STATE_DIR&amp;quot;&lt;br /&gt;
    echo &amp;quot;[OK] netproxy stopped and restored&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmd_status() {&lt;br /&gt;
    echo &amp;quot;=== redsocks ===&amp;quot;&lt;br /&gt;
    pgrep redsocks &amp;gt;/dev/null &amp;amp;&amp;amp; echo &amp;quot;running&amp;quot; || echo &amp;quot;stopped&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;=== iptables nat ===&amp;quot;&lt;br /&gt;
    iptables -t nat -S | grep &amp;quot;$CHAIN&amp;quot; || echo &amp;quot;no netproxy nat rules&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;=== iptables mangle ===&amp;quot;&lt;br /&gt;
    iptables -t mangle -S | grep &amp;quot;$REDSOCKS_PORT&amp;quot; || echo &amp;quot;no netproxy mangle rules&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
### ================= 主入口 =================&lt;br /&gt;
need_root&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;${1:-}&amp;quot; in&lt;br /&gt;
    start)&lt;br /&gt;
        [[ $# -eq 2 ]] || die &amp;quot;Usage: $0 start ip:port&amp;quot;&lt;br /&gt;
        cmd_start &amp;quot;$2&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
    stop)&lt;br /&gt;
        cmd_stop&lt;br /&gt;
        ;;&lt;br /&gt;
    status)&lt;br /&gt;
        cmd_status&lt;br /&gt;
        ;;&lt;br /&gt;
    *)&lt;br /&gt;
        echo &amp;quot;Usage:&amp;quot;&lt;br /&gt;
        echo &amp;quot;  $0 start ip:port&amp;quot;&lt;br /&gt;
        echo &amp;quot;  $0 stop&amp;quot;&lt;br /&gt;
        echo &amp;quot;  $0 status&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
        ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>