mirror of
https://github.com/shadowsocks/shadowsocks-rust.git
synced 2026-02-09 01:59:16 +08:00
222 lines
8.2 KiB
Bash
222 lines
8.2 KiB
Bash
#!/bin/bash
|
|
|
|
iptables-save | grep -v shadowsocks- | iptables-restore
|
|
ip6tables-save | grep -v shadowsocks- | ip6tables-restore
|
|
|
|
### IPv4 RULES
|
|
|
|
# Create chnip ipset
|
|
ipset create chnip hash:net family inet -exist
|
|
ipset restore < /usr/local/etc/chnip.ipset
|
|
|
|
# Create gfwlist ipset
|
|
ipset create gfwlist hash:ip family inet timeout 7200 -exist
|
|
ipset create bypasslist hash:ip family inet timeout 7200 -exist
|
|
|
|
SHADOWSOCKS_REDIR_IP=0.0.0.0
|
|
SHADOWSOCKS_REDIR_PORT=60080
|
|
|
|
readonly IPV4_RESERVED_IPADDRS="\
|
|
0/8 \
|
|
10/8 \
|
|
100.64/10 \
|
|
127/8 \
|
|
169.254/16 \
|
|
172.16/12 \
|
|
192/24 \
|
|
192.0.2.0/24 \
|
|
192.88.99/24 \
|
|
192.168/16 \
|
|
198.18/15 \
|
|
198.51.100/24 \
|
|
203.0.113/24 \
|
|
224/4 \
|
|
240/4 \
|
|
255.255.255.255/32 \
|
|
"
|
|
|
|
## TCP
|
|
# NAT PREROUTING
|
|
iptables -t nat -N shadowsocks-nat
|
|
# Skip LoopBack, Reserved
|
|
for addr in ${IPV4_RESERVED_IPADDRS}; do
|
|
iptables -t nat -A shadowsocks-nat -d "${addr}" -j RETURN
|
|
done
|
|
# Bypass sslocal's outbound data
|
|
iptables -t nat -A shadowsocks-nat -m mark --mark 0xff/0xff -j RETURN
|
|
iptables -t nat -A shadowsocks-nat -m owner --uid-owner shadowsocks -j RETURN
|
|
# Proxy gfwlist
|
|
iptables -t nat -A shadowsocks-nat -m set --match-set gfwlist dst -p tcp -j REDIRECT --to-ports ${SHADOWSOCKS_REDIR_PORT}
|
|
# Bypass CN IPs
|
|
iptables -t nat -A shadowsocks-nat -m set --match-set chnip dst -p tcp -j RETURN
|
|
iptables -t nat -A shadowsocks-nat -m set --match-set bypasslist dst -p tcp -j RETURN
|
|
# Redirect TCP to 60080
|
|
iptables -t nat -A shadowsocks-nat -p tcp -j REDIRECT --to-ports ${SHADOWSOCKS_REDIR_PORT}
|
|
# Local TCP -> shadowsocks-nat
|
|
iptables -t nat -A OUTPUT -p tcp -j shadowsocks-nat
|
|
# LAN TCP -> shadowsocks-nat
|
|
iptables -t nat -A PREROUTING -p tcp -j shadowsocks-nat
|
|
|
|
## UDP
|
|
# Strategy Route
|
|
ip -4 rule del fwmark 0x1 table 803
|
|
ip -4 rule add fwmark 0x1 table 803
|
|
ip -4 route del local 0.0.0.0/0 dev lo table 803
|
|
ip -4 route add local 0.0.0.0/0 dev lo table 803
|
|
|
|
# TPROXY for LAN
|
|
iptables -t mangle -N shadowsocks-tproxy
|
|
# Skip LoopBack, Reserved
|
|
for addr in ${IPV4_RESERVED_IPADDRS}; do
|
|
iptables -t mangle -A shadowsocks-tproxy -d "${addr}" -j RETURN
|
|
done
|
|
|
|
# Bypass sslocal's outbound data
|
|
iptables -t mangle -A shadowsocks-tproxy -m mark --mark 0xff/0xff -j RETURN
|
|
# Proxy gfwlist
|
|
iptables -t mangle -A shadowsocks-tproxy -m set --match-set gfwlist dst -p udp -j TPROXY --on-ip ${SHADOWSOCKS_REDIR_IP} --on-port ${SHADOWSOCKS_REDIR_PORT} --tproxy-mark 0x01/0x01
|
|
# Bypass CN IPs
|
|
iptables -t mangle -A shadowsocks-tproxy -m set --match-set chnip dst -p udp -j RETURN
|
|
iptables -t mangle -A shadowsocks-tproxy -m set --match-set bypasslist dst -p udp -j RETURN
|
|
# TPROXY UDP to 60080
|
|
iptables -t mangle -A shadowsocks-tproxy -p udp -j TPROXY --on-ip ${SHADOWSOCKS_REDIR_IP} --on-port ${SHADOWSOCKS_REDIR_PORT} --tproxy-mark 0x01/0x01
|
|
|
|
# TPROXY for Local
|
|
iptables -t mangle -N shadowsocks-tproxy-mark
|
|
# Skip LoopBack, Reserved
|
|
for addr in ${IPV4_RESERVED_IPADDRS}; do
|
|
iptables -t mangle -A shadowsocks-tproxy-mark -d "${addr}" -j RETURN
|
|
done
|
|
|
|
# Bypass sslocal's outbound data
|
|
iptables -t mangle -A shadowsocks-tproxy-mark -m mark --mark 0xff/0xff -j RETURN
|
|
iptables -t mangle -A shadowsocks-tproxy-mark -m owner --uid-owner shadowsocks -j RETURN
|
|
# Proxy gfwlist
|
|
iptables -t mangle -A shadowsocks-tproxy-mark -m set --match-set gfwlist dst -j MARK --set-xmark 0x01/0xffffffff
|
|
# Bypass CN IPs
|
|
iptables -t mangle -A shadowsocks-tproxy-mark -m set --match-set chnip dst -j RETURN
|
|
# Set MARK and reroute
|
|
iptables -t mangle -A shadowsocks-tproxy-mark -p udp -j MARK --set-xmark 0x01/0xffffffff
|
|
#iptables -t mangle -A shadowsocks-tproxy-mark -p tcp -j MARK --set-xmark 1
|
|
|
|
# Apply TPROXY to LAN
|
|
iptables -t mangle -A PREROUTING -p udp -j shadowsocks-tproxy
|
|
#iptables -t mangle -A PREROUTING -p udp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j shadowsocks-tproxy
|
|
# Apply TPROXY for Local
|
|
iptables -t mangle -A OUTPUT -p udp -j shadowsocks-tproxy-mark
|
|
#iptables -t mangle -A OUTPUT -p udp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j shadowsocks-tproxy-mark
|
|
|
|
# DIVERT rules
|
|
# For optimizing TCP
|
|
# iptables -t mangle -N shadowsocks-divert
|
|
# iptables -t mangle -A shadowsocks-divert -j MARK --set-mark 1
|
|
# iptables -t mangle -A shadowsocks-divert -j ACCEPT
|
|
# iptables -t mangle -I PREROUTING -p tcp -m socket -j shadowsocks-divert
|
|
|
|
### IPv6 RULES
|
|
|
|
# Create chnip6 ipset
|
|
ipset create chnip6 hash:net family inet6 -exist
|
|
ipset restore < /usr/local/etc/chnip6.ipset
|
|
|
|
# Create gfwlist6 ipset
|
|
ipset create gfwlist6 hash:ip family inet6 timeout 7200 -exist
|
|
ipset create bypasslist6 hash:ip family inet6 timeout 7200 -exist
|
|
|
|
SHADOWSOCKS6_REDIR_IP=::
|
|
SHADOWSOCKS6_REDIR_PORT=60081
|
|
|
|
readonly IPV6_RESERVED_IPADDRS="\
|
|
::/128 \
|
|
::1/128 \
|
|
::ffff:0:0/96 \
|
|
::ffff:0:0:0/96 \
|
|
64:ff9b::/96 \
|
|
100::/64 \
|
|
2001::/32 \
|
|
2001:20::/28 \
|
|
2001:db8::/32 \
|
|
2002::/16 \
|
|
fc00::/7 \
|
|
fe80::/10 \
|
|
ff00::/8 \
|
|
"
|
|
|
|
## TCP
|
|
# NAT PREROUTING
|
|
ip6tables -t nat -N shadowsocks-nat
|
|
# Skip LoopBack, Reserved
|
|
for addr in ${IPV6_RESERVED_IPADDRS}; do
|
|
ip6tables -t nat -A shadowsocks-nat -d "${addr}" -j RETURN
|
|
done
|
|
# Bypass sslocal's outbound data
|
|
ip6tables -t nat -A shadowsocks-nat -m mark --mark 0xff/0xff -j RETURN
|
|
ip6tables -t nat -A shadowsocks-nat -m owner --uid-owner shadowsocks -j RETURN
|
|
# Proxy gfwlist6
|
|
ip6tables -t nat -A shadowsocks-nat -m set --match-set gfwlist6 dst -p tcp -j REDIRECT --to-ports ${SHADOWSOCKS6_REDIR_PORT}
|
|
# Bypass CN IPs
|
|
ip6tables -t nat -A shadowsocks-nat -m set --match-set chnip6 dst -p tcp -j RETURN
|
|
ip6tables -t nat -A shadowsocks-nat -m set --match-set bypasslist6 dst -p tcp -j RETURN
|
|
# Redirect TCP to 60081
|
|
ip6tables -t nat -A shadowsocks-nat -p tcp -j REDIRECT --to-ports ${SHADOWSOCKS6_REDIR_PORT}
|
|
# Local TCP -> shadowsocks-nat
|
|
ip6tables -t nat -A OUTPUT -p tcp -j shadowsocks-nat
|
|
# LAN TCP -> shadowsocks-nat
|
|
ip6tables -t nat -A PREROUTING -p tcp -j shadowsocks-nat
|
|
|
|
## UDP
|
|
# Strategy Route
|
|
ip -6 rule del fwmark 0x1 table 803
|
|
ip -6 rule add fwmark 0x1 table 803
|
|
ip -6 route del local ::/0 dev lo table 803
|
|
ip -6 route add local ::/0 dev lo table 803
|
|
|
|
# TPROXY for LAN
|
|
ip6tables -t mangle -N shadowsocks-tproxy
|
|
# Skip LoopBack, Reserved
|
|
for addr in ${IPV6_RESERVED_IPADDRS}; do
|
|
ip6tables -t mangle -A shadowsocks-tproxy -d "${addr}" -j RETURN
|
|
done
|
|
|
|
# Bypass sslocal's outbound data
|
|
ip6tables -t mangle -A shadowsocks-tproxy -m mark --mark 0xff/0xff -j RETURN
|
|
# Proxy gfwlist6
|
|
ip6tables -t mangle -A shadowsocks-tproxy -m set --match-set gfwlist6 dst -p udp -j TPROXY --on-ip ${SHADOWSOCKS6_REDIR_IP} --on-port ${SHADOWSOCKS6_REDIR_PORT} --tproxy-mark 0x01/0x01
|
|
# Bypass CN IPs
|
|
ip6tables -t mangle -A shadowsocks-tproxy -m set --match-set chnip6 dst -p udp -j RETURN
|
|
ip6tables -t mangle -A shadowsocks-tproxy -m set --match-set bypasslist6 dst -p udp -j RETURN
|
|
# TPROXY UDP to 60081
|
|
ip6tables -t mangle -A shadowsocks-tproxy -p udp -j TPROXY --on-ip ${SHADOWSOCKS6_REDIR_IP} --on-port ${SHADOWSOCKS6_REDIR_PORT} --tproxy-mark 0x01/0x01
|
|
|
|
# TPROXY for Local
|
|
ip6tables -t mangle -N shadowsocks-tproxy-mark
|
|
# Skip LoopBack, Reserved
|
|
for addr in ${IPV6_RESERVED_IPADDRS}; do
|
|
ip6tables -t mangle -A shadowsocks-tproxy-mark -d "${addr}" -j RETURN
|
|
done
|
|
|
|
# Bypass sslocal's outbound data
|
|
ip6tables -t mangle -A shadowsocks-tproxy-mark -m mark --mark 0xff/0xff -j RETURN
|
|
ip6tables -t mangle -A shadowsocks-tproxy-mark -m owner --uid-owner shadowsocks -j RETURN
|
|
# Proxy gfwlist6
|
|
ip6tables -t mangle -A shadowsocks-tproxy-mark -m set --match-set gfwlist6 dst -j MARK --set-xmark 0x01/0xffffffff
|
|
# Bypass CN IPs
|
|
ip6tables -t mangle -A shadowsocks-tproxy-mark -m set --match-set chnip6 dst -j RETURN
|
|
# Set MARK and reroute
|
|
ip6tables -t mangle -A shadowsocks-tproxy-mark -p udp -j MARK --set-xmark 0x01/0xffffffff
|
|
#ip6tables -t mangle -A shadowsocks-tproxy-mark -p tcp -j MARK --set-xmark 1
|
|
|
|
# Apply TPROXY to LAN
|
|
ip6tables -t mangle -A PREROUTING -p udp -j shadowsocks-tproxy
|
|
#ip6tables -t mangle -A PREROUTING -p udp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j shadowsocks-tproxy
|
|
# Apply TPROXY for Local
|
|
ip6tables -t mangle -A OUTPUT -p udp -j shadowsocks-tproxy-mark
|
|
#ip6tables -t mangle -A OUTPUT -p udp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j shadowsocks-tproxy-mark
|
|
|
|
# DIVERT rules
|
|
# For optimizing TCP
|
|
# ip6tables -t mangle -N shadowsocks-divert
|
|
# ip6tables -t mangle -A shadowsocks-divert -j MARK --set-mark 1
|
|
# ip6tables -t mangle -A shadowsocks-divert -j ACCEPT
|
|
# ip6tables -t mangle -I PREROUTING -p tcp -m socket -j shadowsocks-divert
|