Por que o roteamento de políticas nas marcas iptables aplicadas nas cadeias FORWARD ou OUTPUT pode ser inconsistente?

Por que o roteamento de políticas nas marcas iptables aplicadas nas cadeias FORWARD ou OUTPUT pode ser inconsistente?

Estou roteando conexões HTTPS por um túnel SSH (-w) usando iptablesmarcas e iproute2regras. Os motivos pelos quais preciso fazer isso dessa maneira são inventados, para dizer o mínimo, portanto, a maioria das soluções alternativas pode não funcionar para mim.

O dispositivo tun0 existe e está funcionando como desejo, e o roteamento está funcionando quando aplico o MARK na cadeia OUTPUT, mas por algum motivo a regra de roteamento parece não funcionar se o MARK for aplicado na cadeia FORWARD.

O sistema operacional é CentOS 6.7 com kernel 2.6.32 e 1.4.7 iptables. A iptablesmarcação e registro:

# iptables -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark 1 
# iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1 
# iptables -t mangle -A POSTROUTING -m mark --mark 1 -j LOG --log-prefix "marked: "

A iproute2configuração da regra:

# cat 201 tunneled >> /etc/iproute2/rt_tables
# ip rule add fwmark 1 table tunneled
# ip route add default via 192.168.100.1 dev tun1 table tunneled

E uma pequena seção do log para mostrar os resultados:

Feb 17 19:11:35 nhopm kernel: marked: IN= OUT=eth0 SRC=192.168.82.2 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=16734 DF PROTO=TCP SPT=34619 DPT=443 WINDOW=29200 RES=0x00 SYN URGP=0 MARK=0x1 
Feb 17 19:12:00 nhopm kernel: marked: IN= OUT=tun1 SRC=192.168.81.8 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=62747 DF PROTO=TCP SPT=55349 DPT=443 WINDOW=14600 RES=0x00 SYN URGP=0 MARK=0x1 

O host tem 2 NICs: eth0192.168.81.8, sendo 192.168.81.1 o gateway padrão e eth1192.168.82.8, que atua como gateway padrão para 192.168.82.0/24 - não há problemas com esta configuração, ela funciona conforme o esperado. O túnel tun0 tem 192.168.100.1 em sua extremidade.

Tentei restringir isso à situação mais simples que ilustra o problema sem sobrecarregar os detalhes, mas fornecerei todos os detalhes considerados necessários para tentar descobrir onde está o problema. Por favor, peça qualquer coisa que possa ser útil nos comentários. Espero ter entendido mal uma pequena parte de como isso funciona.

Gambiarra

Minha tentativa de fazer o acima foi baseada neste iptablesdiagrama de fluxo: de iptables.info

O que esconde o fato de que o mesmo conjunto deDecisão de roteamentonão são aplicados aos pacotes provenientes da cadeia OUTPUT como aqueles provenientes da cadeia FORWARD.

Para fazer isso funcionar eu precisei substituir a marcação feita na cadeia FORWARD por uma entrada semelhante na cadeia PREROUTING.

iptables -t mangle -A PREROUTING -p tcp --dport 443 ! -d 192.168.0.0/16 -j MARK --set-mark 1

O que realmente atende um pouco melhor às minhas necessidades.

Não estou dando uma resposta (ainda), pois ainda não encontrei documentação sobre isso - se o fizer, fornecerei uma resposta, a menos que alguém chegue antes de mim.

informação relacionada