Estou executando meu cliente proxy na mesma máquina Linux em que estou usando a conexão. Na configuração, posso dizer para ele fazer tproxy para a porta 2500. O proxy é executado na porta 443, usando TLS (embora o proxy assuma o gerenciamento dessa parte)
Então preciso usar iptables ou nftables para rotear todos os pacotes para o proxy. Mas preciso marcá-los também, para não criar um loop.
Minhas tentativas iniciais não tiveram sucesso, parece que meus pacotes UDP não passaram (estou atrás de um NAT, mas não sei se é esse o problema, já que estou fazendo proxy de qualquer maneira). Gostaria de saber como funciona melhor para que eu possa depurar sozinho.
Aqui está minha tentativa:
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
#Setup a chain DIVERT to mark packets
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
#Use DIVERT to prevent existing connections going through TPROXY twice:
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A PREROUTING -p udp -m socket -j DIVERT
#Mark all other (new) packets and use TPROXY to pass into xray
iptables -t mangle -A PREROUTING -p tcp -j TPROXY --tproxy-mark 0x1/0x1 --on-port 2500
iptables -t mangle -A PREROUTING -p udp -j TPROXY --tproxy-mark 0x1/0x1 --on-port 2500
#disable rp_filter and enable ip_forward
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.wlp38s0.rp_filter=0
os pacotes simplesmente passam pelas minhas regras como se não existissem
Então descobri uma maneira de fazer isso executando o executável xray como um usuário diferente:
sudo -u xray_tproxy xray -c config.json
onde o GID é 23333a seguir criei essas regras
e eu os corri com
sudo
veja: https://xtls.github.io/document/level-2/iptables_gid.html#_3-%E9%85%8D%E7%BD%AE%E6%9C%80%E5%A4%A7%E6%96%87%E4%BB%B6%E6%89%93%E5%BC%80%E6%95%B0-%E8%BF%90%E8%A1%8C-xray-%E5%AE%A2%E6%88%B7%E7%AB%AF