Eu tenho uma caixa linux que é um cliente openVPN todo o seu tráfego passa pelo tunel, eu tenho um servidor nginx que eu quero passar por eth0 e o que eu tentei fazer é redirecionar todo o tráfego na porta 80 através de eth0 via 192.168.1.1
root@digger02:~# ip route
0.0.0.0/1 via 10.8.0.1 dev tun0
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.154 metric 10
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2
XXX.XXX.XXX.XXX via 192.168.1.1 dev eth0
128.0.0.0/1 via 10.8.0.1 dev tun0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.154
192.168.1.1 dev eth0 proto dhcp scope link src 192.168.1.154 metric 10
onde XXX.XXX.XXX.XXX é o endereço IP público do meu servidor VPN
root@digger02:~# iptables -t mangle -L -v -n
Chain PREROUTING (policy ACCEPT 665K packets, 164M bytes)
pkts bytes target prot opt in out source destination
176 8430 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK set 0x80
Chain INPUT (policy ACCEPT 665K packets, 164M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 715K packets, 91M bytes)
pkts bytes target prot opt in out source destination
35 82961 MARK all -- * * 0.0.0.0/0 0.0.0.0/0 cgroup 1114129 MARK set 0xb
Chain POSTROUTING (policy ACCEPT 715K packets, 91M bytes)
pkts bytes target prot opt in out source destination
root@digger02:~# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
80 http
11 novpn
isso é o que eu tentei fazer
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 0x80
echo "80 http" >> /etc/iproute2/rt_tables
ip route add default via 192.168.1.1 dev eth0 table http
ip rule add fwmark 0x80 lookup 80
ip route flush table 100
ip route flush cache
ip rule add from xxx.xxx.xxx.xxx table 100
ip route add table 100 to 192.168.1.0/24 dev eth0
ip route add table 100 default via 192.168.1.1
onde a tabela 100 é criada pelo script de rota do OpenVPN e xxx.xxx.xxx.xxx é meu ip público
nada funciona para mim, eu até tentei este script https://gist.github.com/kriswebdev/a8d291936fe4299fb17d3744497b1170 que basicamente marca todo o tráfego para um aplicativo
Eu sinto que o iptables pode não estar funcionando no meu sistema, como faço para diagnosticar isso
Desde o kernel Linux 4.17 , não há necessidade de usar iptables : a pilha de roteamento pode escolher diretamente uma rota diferente, dependendo da porta, sem marcá-la, redirecioná-la e exigir um band-aid NAT (mas geralmente apenas para UDP ou para TCP como cliente , não para TCP como servidor como aqui):
Com o servidor nginx em execução no cliente VPN, supondo que não haja conjunto de regras iptables e nenhuma regra de roteamento adicional em vigor ...
Adicione a rota alternativa na tabela de roteamento, precedida pela rota LAN anterior (pelo menos evitará que conexões da LAN passem inutilmente pelo roteador que terá que emitir redirecionamentos ICMP). Esta tabela será descarregada se a interface cair e depois subir, então isso deve ser integrado com a ferramenta que gerencia a interface:
iif lo
Escolha o tráfego de resposta iniciado localmente (essa é a função especial aqui) da porta 80 (para qualquer lugar) para usar esta tabela:O mesmo para o tráfego HTTP de entrada, ou seja, a direção original (não é realmente necessário, pois o SRPF não será ativado, mas para consistência):
Afrouxe o SRPF caso tenha sido ativado porque não tenho certeza de que o tráfego relacionado a TCP, como erros de ICMP durante PMTUD , pode ser aceito caso tenha sido definido como estrito:
O suporte HTTP/3 (que usa QUIC e, portanto, sobre UDP ) requer apenas as mesmas regras para UDP:
Caso alguns endereços IP sejam uma exceção a essa exceção na porta 80, um método entre outros é adicioná-los à tabela de roteamento como não correspondentes usando a palavra-chave throw , caindo assim na tabela de roteamento principal. Por exemplo, para ter tráfego de 10.8.0.0/24 que é garantido como tráfego OpenVPN, para ainda trabalhar com nginx: