Ignorar VPN para tráfego HTTP/HTTPS no Ubuntu?

Ignorar VPN para tráfego HTTP/HTTPS no Ubuntu?

Eu tenho uma máquina Ubuntu 14.04 em que todo o tráfego de saída é feito por meio de uma VPN e sou obrigado a garantir que o tráfego HTTP e HTTPS não passe pela VPN.
Examinei o roteamento estático, mas parece lidar apenas com a camada 3.
Como devo abordar essa configuração? Obrigado.

Responder1

Para rotear pacotes destinados a portas específicas através de um gateway padrão diferente, você precisa marcar esses pacotes usando iptables e então roteá-los através de uma tabela de rotas diferente.

Então, primeiro crie uma nova tabela de rotas com o gateway padrão do seu gateway local (não o seu gateway VPN)

ip route add table 4 default via 192.168.0.1

Em seguida, marque os pacotes necessários com base nas portas de destino.

iptables -t mangle -A PREROUTING -p tcp --dport 80  -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 4

Por fim, roteie esses pacotes marcados por meio da tabela de rotas recém-criada.

ip rule add fwmark 4 table 4

Eu não testei os comandos acima, então eles podem precisar de alguns ajustes.

Responder2

Uma maneira de fazer isso é usando ip rulee iptables. Um exemplo seria marcar o tráfego que você está interessado em encaminhar

iptables -I OUTPUT -m tcp -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x0001

Então você cria uma nova tabela de roteamento:

echo 101 r_http >> /etc/iproute2/rt_tables
ip route add default via 10.0.0.1 dev eth0 table r_http
ip route flush cache

E agora que você marcou seu tráfego HTTP e HTTPS, você pode criar uma regra para aplicar essa nova tabela de roteamento

ip rule fwmark 0x0001 table 101

Isso deve funcionar. Como exercício para o leitor é como torná-lo permanente e como criar a rota padrão :-)

Responder3

Recentemente enfrentei uma situação semelhante à do OP. Graças às respostas fornecidas por @Cha0s e @Pablo Martinez, consegui fazer funcionar para minha situação.

Primeiro, como ambos disseram, devemos ter regras de iptables para marcar os pacotes que não devem passar pela VPN. @Cha0s estava certo ao colocar as regras na tabela mangle. De acordo com a página de manual do iptables, você deve usar a tabela mangle para executar o destino -j MARK.

Por outro lado, @Pablo Martinez está correto ao colocá-los na cadeia OUTPUT, mesmo que a página man do iptables diga que você deve usar -j MARK na cadeia PREROUTING. Esses pacotes são gerados no host local e enviados. Eles não serão processados ​​pela cadeia PREROUTING. Mas a cadeia OUTPUT faz sentido e também possui uma tabela mangle. Então aqui está a regra do iptables que usei:

iptables -t mangle -I OUTPUT -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x101

Em seguida, crie uma nova tabela de roteamento e adicione uma rota a ela, conforme descrito por @Pablo Martinez:

echo 101 r_http > /etc/iproute2/rt_tables.d/r_http.conf
ip route add table r_http default via 192.168.0.1 dev enp2s0
ip route flush cache

Substitua 192.168.0.1 pelo IP do seu gateway ou roteador (não VPN) e enp2s0 pelo nome da sua interface de rede. Você pode usar "ip addr" para verificar os nomes das interfaces.

Por fim, adicione uma regra ip para permitir que o iproute2 inspecione a marca e use nossa nova tabela de roteamento.

ip rule add fwmark 0x101 table 101

Você pode adicionar uma regra iptables para registrar os pacotes que vão para as portas 80 e 443. Observe que essa regra é adicionada ao topo da cadeia OUTPUT na tabela de filtros porque a tabela de filtros é processada após a tabela mangle e deve ser a primeira regra a ser evitada. ser ignorado.

iptables -I OUTPUT -p tcp -m multiport --dports 80,443 -j LOG --log-prefix "<HTTP/S>" --log-level info

As entradas de log devem aparecer em /var/log/kern.log (em um sistema Debian). Você pode verificar se todos eles possuem MARK=0x101. Não se esqueça de excluir a regra de registro assim que coletar entradas suficientes.

cat /var/log/kern.log | grep '<HTTP/S>' | less

Depois de ter certeza de que os pacotes estão marcados corretamente, você pode verificar se o iproute2 escolherá a rota correta para os pacotes marcados.

ip route get to 8.8.8.8
ip route get to 8.8.8.8 mark 0x101

O resultado da primeira linha deve informar que o pacote passará pelo gateway VPN e pelo dispositivo de túnel. A segunda linha deve mostrar que o pacote passará pelo seu próprio gateway e dispositivo de rede.

REFERÊNCIAS:

Responder4

Você poderia tentar configurar seus navegadores para usar um proxy.
- Você pode especificar proxy no DNS, mas não estou familiarizado com esta técnica. (Como funcionam as pesquisas de DNS ao usar um proxy HTTP (ou não) no IE) - Isso também pode ser feito com a Política de Grupo (http://social.technet.microsoft.com/wiki/contents/articles/5156.how-to-force-proxy-settings-via-group-policy.aspx) e se os navegadores em questão respeitarem as configurações do Internet Explorer, você poderá implantá-lo facilmente em toda a rede.

Você precisará de um servidor proxy HTTP para que isso funcione (https://stackoverflow.com/questions/1994846/open-source-http-or-https-proxy)

Isso manteria o tráfego do navegador fora da VPN, mas todo o resto deveria ficar bem. Configure seu servidor proxy de forma que nenhum tráfego seja roteado pela VPN.

informação relacionada