Add direct gateway forwarding when VPN is off
This commit is contained in:
@@ -5,6 +5,9 @@ TPROXY_PORT="${TPROXY_PORT:-7895}"
|
||||
TPROXY_MARK="${TPROXY_MARK:-1}"
|
||||
TPROXY_TABLE="${TPROXY_TABLE:-100}"
|
||||
TPROXY_CHAIN="${TPROXY_CHAIN:-VPN_PROXY_TPROXY}"
|
||||
GATEWAY_FORWARD_CHAIN="${GATEWAY_FORWARD_CHAIN:-VPN_PROXY_FORWARD}"
|
||||
GATEWAY_NAT_CHAIN="${GATEWAY_NAT_CHAIN:-VPN_PROXY_NAT}"
|
||||
GATEWAY_CLIENT_CIDRS="${GATEWAY_CLIENT_CIDRS:-10.0.0.0/8 172.16.0.0/12 192.168.0.0/16}"
|
||||
PROXY_PORT="${PROXY_PORT:-8080}"
|
||||
PROXY_BIND_IP="${PROXY_BIND_IP:-0.0.0.0}"
|
||||
PROXY_INPUT_CHAIN="${PROXY_INPUT_CHAIN:-VPN_PROXY_INPUT}"
|
||||
@@ -35,6 +38,15 @@ cleanup_tproxy() {
|
||||
ip route flush table "$TPROXY_TABLE" 2>/dev/null || true
|
||||
}
|
||||
|
||||
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
|
||||
ipt -F "$GATEWAY_FORWARD_CHAIN" 2>/dev/null || true
|
||||
ipt -X "$GATEWAY_FORWARD_CHAIN" 2>/dev/null || true
|
||||
ipt -t nat -F "$GATEWAY_NAT_CHAIN" 2>/dev/null || true
|
||||
ipt -t nat -X "$GATEWAY_NAT_CHAIN" 2>/dev/null || true
|
||||
}
|
||||
|
||||
enable_ip_forwarding() {
|
||||
if [[ -w /proc/sys/net/ipv4/ip_forward ]]; then
|
||||
printf '1' > /proc/sys/net/ipv4/ip_forward || true
|
||||
@@ -58,6 +70,22 @@ setup_proxy_firewall() {
|
||||
ipt -I INPUT -p udp --dport "$PROXY_PORT" -j "$PROXY_INPUT_CHAIN"
|
||||
}
|
||||
|
||||
setup_gateway_forwarding() {
|
||||
log "setup direct gateway forwarding"
|
||||
cleanup_gateway_forwarding
|
||||
enable_ip_forwarding
|
||||
|
||||
ipt -N "$GATEWAY_FORWARD_CHAIN"
|
||||
ipt -t nat -N "$GATEWAY_NAT_CHAIN"
|
||||
for cidr in $GATEWAY_CLIENT_CIDRS; do
|
||||
ipt -A "$GATEWAY_FORWARD_CHAIN" -s "$cidr" -j ACCEPT
|
||||
ipt -A "$GATEWAY_FORWARD_CHAIN" -d "$cidr" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
|
||||
ipt -t nat -A "$GATEWAY_NAT_CHAIN" -s "$cidr" -m addrtype ! --dst-type LOCAL -j MASQUERADE
|
||||
done
|
||||
ipt -I FORWARD 1 -j "$GATEWAY_FORWARD_CHAIN"
|
||||
ipt -t nat -I POSTROUTING 1 -j "$GATEWAY_NAT_CHAIN"
|
||||
}
|
||||
|
||||
setup_tproxy() {
|
||||
log "setup tproxy on port ${TPROXY_PORT}"
|
||||
cleanup_tproxy
|
||||
@@ -76,9 +104,9 @@ setup_tproxy() {
|
||||
|
||||
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"
|
||||
ipt -t mangle -A PREROUTING -j "$TPROXY_CHAIN"
|
||||
}
|
||||
|
||||
setup_gateway_forwarding
|
||||
setup_tproxy
|
||||
setup_proxy_firewall
|
||||
|
||||
@@ -90,6 +118,7 @@ shutdown() {
|
||||
wait "$APP_PID" 2>/dev/null || true
|
||||
cleanup_proxy_firewall
|
||||
cleanup_tproxy
|
||||
cleanup_gateway_forwarding
|
||||
}
|
||||
|
||||
trap 'shutdown; exit 0' SIGTERM SIGINT
|
||||
@@ -97,4 +126,5 @@ wait "$APP_PID"
|
||||
STATUS=$?
|
||||
cleanup_proxy_firewall
|
||||
cleanup_tproxy
|
||||
cleanup_gateway_forwarding
|
||||
exit "$STATUS"
|
||||
|
||||
Reference in New Issue
Block a user