Add per-device VPN and direct routing policies
This commit is contained in:
+33
-3
@@ -6,6 +6,7 @@ TPROXY_PORT="${TPROXY_PORT:-7895}"
|
||||
TPROXY_MARK="${TPROXY_MARK:-1}"
|
||||
TPROXY_TABLE="${TPROXY_TABLE:-100}"
|
||||
TPROXY_CHAIN="${TPROXY_CHAIN:-VPN_PROXY_TPROXY}"
|
||||
DEVICE_POLICY_CHAIN="${DEVICE_POLICY_CHAIN:-VPN_PROXY_DEVICE_POLICY}"
|
||||
GATEWAY_FORWARD_CHAIN="${GATEWAY_FORWARD_CHAIN:-VPN_PROXY_FORWARD}"
|
||||
GATEWAY_NAT_CHAIN="${GATEWAY_NAT_CHAIN:-VPN_PROXY_NAT}"
|
||||
TRAFFIC_UPLOAD_CHAIN="${TRAFFIC_UPLOAD_CHAIN:-VPN_PROXY_TRAFFIC_UP}"
|
||||
@@ -17,7 +18,7 @@ PROXY_INPUT_CHAIN="${PROXY_INPUT_CHAIN:-VPN_PROXY_INPUT}"
|
||||
PROXY_FIREWALL="${PROXY_FIREWALL:-true}"
|
||||
PROXY_ALLOWED_CIDRS="${PROXY_ALLOWED_CIDRS:-10.0.0.0/8 172.16.0.0/12 192.168.0.0/16}"
|
||||
BYPASS_CIDRS="${BYPASS_CIDRS:-0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 169.254.0.0/16 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4}"
|
||||
export TRAFFIC_UPLOAD_CHAIN TRAFFIC_DOWNLOAD_CHAIN BYPASS_CIDRS
|
||||
export TPROXY_PORT TPROXY_MARK DEVICE_POLICY_CHAIN TRAFFIC_UPLOAD_CHAIN TRAFFIC_DOWNLOAD_CHAIN BYPASS_CIDRS
|
||||
|
||||
log() {
|
||||
printf '[gateway-entrypoint] %s\n' "$*"
|
||||
@@ -50,6 +51,25 @@ cleanup_tproxy() {
|
||||
ip route flush table "$TPROXY_TABLE" 2>/dev/null || true
|
||||
}
|
||||
|
||||
cleanup_device_policy() {
|
||||
ipt -t mangle -F "$DEVICE_POLICY_CHAIN" 2>/dev/null || true
|
||||
for slot in A B; do
|
||||
ipt -t mangle -F "${DEVICE_POLICY_CHAIN}_${slot}" 2>/dev/null || true
|
||||
ipt -t mangle -X "${DEVICE_POLICY_CHAIN}_${slot}" 2>/dev/null || true
|
||||
done
|
||||
ipt -t mangle -X "$DEVICE_POLICY_CHAIN" 2>/dev/null || true
|
||||
}
|
||||
|
||||
setup_device_policy() {
|
||||
cleanup_device_policy
|
||||
ipt -t mangle -N "$DEVICE_POLICY_CHAIN" || return 1
|
||||
ipt -t mangle -N "${DEVICE_POLICY_CHAIN}_A" || return 1
|
||||
ipt -t mangle -N "${DEVICE_POLICY_CHAIN}_B" || return 1
|
||||
ipt -t mangle -A "${DEVICE_POLICY_CHAIN}_A" -p tcp -j TPROXY --on-port "$TPROXY_PORT" --tproxy-mark "$TPROXY_MARK/$TPROXY_MARK" || return 1
|
||||
ipt -t mangle -A "${DEVICE_POLICY_CHAIN}_A" -p udp -j TPROXY --on-port "$TPROXY_PORT" --tproxy-mark "$TPROXY_MARK/$TPROXY_MARK" || return 1
|
||||
ipt -t mangle -A "$DEVICE_POLICY_CHAIN" -j "${DEVICE_POLICY_CHAIN}_A" || return 1
|
||||
}
|
||||
|
||||
cleanup_gateway_forwarding() {
|
||||
ipt -D FORWARD -j "$GATEWAY_FORWARD_CHAIN" 2>/dev/null || true
|
||||
ipt -t nat -D POSTROUTING -j "$GATEWAY_NAT_CHAIN" 2>/dev/null || true
|
||||
@@ -129,6 +149,10 @@ setup_gateway_forwarding() {
|
||||
setup_tproxy() {
|
||||
log "setup tproxy on port ${TPROXY_PORT}"
|
||||
cleanup_tproxy
|
||||
if ! setup_device_policy; then
|
||||
log "device policy unavailable; using global VPN fallback"
|
||||
cleanup_device_policy
|
||||
fi
|
||||
enable_ip_forwarding
|
||||
|
||||
ip rule add fwmark "$TPROXY_MARK" table "$TPROXY_TABLE" 2>/dev/null || true
|
||||
@@ -143,8 +167,12 @@ setup_tproxy() {
|
||||
ipt -t mangle -A "$TPROXY_CHAIN" -d "$cidr" -j RETURN
|
||||
done
|
||||
|
||||
ipt -t mangle -A "$TPROXY_CHAIN" -p tcp -j TPROXY --on-port "$TPROXY_PORT" --tproxy-mark "$TPROXY_MARK/$TPROXY_MARK"
|
||||
ipt -t mangle -A "$TPROXY_CHAIN" -p udp -j TPROXY --on-port "$TPROXY_PORT" --tproxy-mark "$TPROXY_MARK/$TPROXY_MARK"
|
||||
if ipt -t mangle -L "$DEVICE_POLICY_CHAIN" -n >/dev/null 2>&1; then
|
||||
ipt -t mangle -A "$TPROXY_CHAIN" -j "$DEVICE_POLICY_CHAIN"
|
||||
else
|
||||
ipt -t mangle -A "$TPROXY_CHAIN" -p tcp -j TPROXY --on-port "$TPROXY_PORT" --tproxy-mark "$TPROXY_MARK/$TPROXY_MARK"
|
||||
ipt -t mangle -A "$TPROXY_CHAIN" -p udp -j TPROXY --on-port "$TPROXY_PORT" --tproxy-mark "$TPROXY_MARK/$TPROXY_MARK"
|
||||
fi
|
||||
}
|
||||
|
||||
setup_gateway_forwarding
|
||||
@@ -168,6 +196,7 @@ shutdown() {
|
||||
cleanup_proxy_firewall
|
||||
cleanup_device_traffic
|
||||
cleanup_tproxy
|
||||
cleanup_device_policy
|
||||
cleanup_gateway_forwarding
|
||||
}
|
||||
|
||||
@@ -177,5 +206,6 @@ STATUS=$?
|
||||
cleanup_proxy_firewall
|
||||
cleanup_device_traffic
|
||||
cleanup_tproxy
|
||||
cleanup_device_policy
|
||||
cleanup_gateway_forwarding
|
||||
exit "$STATUS"
|
||||
|
||||
Reference in New Issue
Block a user