Estou roteando conexões HTTPS por um túnel SSH (-w) usando as regras iptables
marks e iproute2
. As razões pelas quais preciso fazer isso são, no mínimo, inventadas, então a maioria das soluções alternativas pode não trabalhe para mim em tudo.
O dispositivo tun0 existe e está funcionando como eu desejo, e o roteamento está funcionando quando eu aplico a MARK na cadeia OUTPUT, mas por alguma razão a regra de roteamento parece não funcionar se a MARK for aplicada na cadeia FORWARD. / p>
O sistema operacional é o CentOS 6.7 com um kernel 2.6.32 e 1.4.7 iptables.
A marcação iptables
e o 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 configuração da regra iproute2
:
# 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 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 o gateway padrão para 192.168.82.0/24 - não há problemas com essa configuração , funciona como esperado. O túnel tun0 tem 192.168.100.1 em seu extremo.
Tentei resumir isso à situação mais simples que ilustra o problema sem sobrecarregar os detalhes, mas fornecerá todos os detalhes que julgar necessários para tentar descobrir onde o problema se coloca. Por favor, peça qualquer coisa que possa ser útil comentários. Espero que eu tenha entendido mal uma pequena parte de como isso funciona.
Minha tentativa de fazer o acima foi baseada nesse diagrama de iptables
:
de iptables.info
O que esconde o fato de que o mesmo conjunto de Decisão de Roteamento não é aplicado aos pacotes provenientes da cadeia OUTPUT como aqueles provenientes da cadeia FORWARD.
Para que isso funcione, eu precisava 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
Que realmente atende às minhas necessidades um pouco melhor de qualquer maneira.
Eu não estou fazendo isso como uma resposta (ainda), embora eu ainda não tenha encontrado documentação sobre isso - se eu fornecer, darei uma resposta, a menos que alguém me impeça.