
Estou roteando conexões HTTPS por um túnel SSH (-w) usando iptables
marcas e iproute2
regras. 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 iptables
marcaçã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 iproute2
configuraçã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: eth0
192.168.81.8, sendo 192.168.81.1 o gateway padrão e eth1
192.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 iptables
diagrama 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.