Roteamento OpenVPN: várias entradas padrão. Cliente OpenVPN: iptables. Problemas de DNS

3

Estou executando um OpenVPN-Server (Debian 8) para fins de privacidade quando uso wifi público. Portanto, todo o tráfego de rede do cliente deve ser manipulado pela conexão VPN. A configuração do servidor e do cliente é fornecida abaixo.

Configuração do servidor:

port 1194
proto tcp
dev tun

ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt    
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
tls-auth /etc/openvpn/tlsauth.key 0

user nobody
group nogroup

server 10.11.12.0 255.255.255.0

ifconfig-pool-persist ipp.txt
keepalive 10 120

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

persist-key
persist-tun

comp-lzo
status openvpn-status.log
verb 3

Configuração do cliente:

client
remote X.X.X.X 1194
proto tcp

dev tun

resolv-retry-infinite

nobind

user nobody
group nogroup

persist-key
persist-tun

ca /etc/openvpn/ca.crt
cert /etc/openvpn/client.crt    
key /etc/openvpn/client.key
tls-auth /etc/openvpn/tlsauth.key 0

comp-lzo 0
verb 2

Quando o serviço VPN é iniciado no cliente, a tabela de roteamento é alterada conforme abaixo:

Tabela de roteamento (192.168.178.0/24 denota o wifi público):

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.11.12.13     128.0.0.0       UG    0      0        0 tun0
0.0.0.0         192.168.178.1   0.0.0.0         UG    1024   0        0 wlan0
10.11.12.1      10.11.12.13     255.255.255.255 UGH   0      0        0 tun0
10.11.12.13     0.0.0.0         255.255.255.255 UH    0      0        0 tun0
128.0.0.0       10.11.12.13     128.0.0.0       UG    0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 wlan0
192.168.178.0   0.0.0.0         255.255.255.0   U     0      0        0 wlan0
X.X.X.X         192.168.178.1   255.255.255.255 UGH   0      0        0 wlan0

A seção relevante do syslog ao iniciar o openvpn:

ovpn-client[3395]: OpenVPN 2.3.4 i586-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Dec  1 2014
ovpn-client[3395]: library versions: OpenSSL 1.0.1k 8 Jan 2015, LZO 2.08    
ovpn-client[3395]: WARNING: No server certificate verification method has been enabled.  See http://openvpn.net/howto.html#mitm for more info.
ovpn-client[3395]: Control Channel Authentication: using '/etc/openvpn/tlsauth.key' as a OpenVPN static key file
ovpn-client[3395]: Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
ovpn-client[3395]: Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
ovpn-client[3396]: NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
ovpn-client[3396]: Attempting to establish TCP connection with [AF_INET]X.X.X.X:1194 [nonblock]
ovpn-client[3396]: TCP connection established with [AF_INET]X.X.X.X:1194
ovpn-client[3396]: TCPv4_CLIENT link local: [undef]
ovpn-client[3396]: TCPv4_CLIENT link remote: [AF_INET]X.X.X.X:1194
ovpn-client[3396]: VERIFY OK: depth=1, [...]
ovpn-client[3396]: VERIFY OK: depth=0, [...]
ovpn-client[3396]: Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
ovpn-client[3396]: Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
ovpn-client[3396]: Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
ovpn-client[3396]: Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
ovpn-client[3396]: Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 2048 bit RSA
ovpn-client[3396]: [VPN-Server] Peer Connection Initiated with [AF_INET]X.X.X.X:1194
ovpn-client[3396]: TUN/TAP device tun0 opened
ovpn-client[3396]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
ovpn-client[3396]: /sbin/ip link set dev tun0 up mtu 1500
NetworkManager[556]: <info> (tun0): carrier is OFF
NetworkManager[556]: <info> (tun0): new Tun device (driver: 'unknown' ifindex: 15)
NetworkManager[556]: <info> (tun0): exported as /org/freedesktop/NetworkManager/Devices/14
ovpn-client[3396]: /sbin/ip addr add dev tun0 local 10.11.12.14 peer 10.11.12.13
NetworkManager[556]: <info> (tun0): link connected
ovpn-client[3396]: ERROR: Linux route add command failed: external program exited with error status: 2
ovpn-client[3396]: GID set to nogroup
ovpn-client[3396]: UID set to nobody
ovpn-client[3396]: Initialization Sequence Completed
NetworkManager[556]: <info> (tun0): device state change: unmanaged -> unavailable (reason 'connection-assumed') [10 20 41]
NetworkManager[556]: <info> (tun0): device state change: unavailable -> disconnected (reason 'connection-assumed') [20 30 41]
NetworkManager[556]: <info> Activation (tun0) starting connection 'tun0'
NetworkManager[556]: <info> Activation (tun0) Stage 1 of 5 (Device Prepare) scheduled...
NetworkManager[556]: <info> devices added (path: /sys/devices/virtual/net/tun0, iface: tun0)
NetworkManager[556]: <info> device added (path: /sys/devices/virtual/net/tun0, iface: tun0): no ifupdown configuration found.
NetworkManager[556]: <info> Activation (tun0) Stage 1 of 5 (Device Prepare) started...
NetworkManager[556]: <info> (tun0): device state change: disconnected -> prepare (reason 'none') [30 40 0]
NetworkManager[556]: <info> Activation (tun0) Stage 2 of 5 (Device Configure) scheduled...
NetworkManager[556]: <info> Activation (tun0) Stage 1 of 5 (Device Prepare) complete.
NetworkManager[556]: <info> Activation (tun0) Stage 2 of 5 (Device Configure) starting...
NetworkManager[556]: <info> (tun0): device state change: prepare -> config (reason 'none') [40 50 0]
NetworkManager[556]: <info> Activation (tun0) Stage 2 of 5 (Device Configure) successful.
NetworkManager[556]: <info> Activation (tun0) Stage 3 of 5 (IP Configure Start) scheduled.
NetworkManager[556]: <info> Activation (tun0) Stage 2 of 5 (Device Configure) complete.
NetworkManager[556]: <info> Activation (tun0) Stage 3 of 5 (IP Configure Start) started...
NetworkManager[556]: <info> (tun0): device state change: config -> ip-config (reason 'none') [50 70 0]
NetworkManager[556]: <info> Activation (tun0) Stage 5 of 5 (IPv4 Configure Commit) scheduled...
NetworkManager[556]: <info> Activation (tun0) Stage 3 of 5 (IP Configure Start) complete.
NetworkManager[556]: <info> Activation (tun0) Stage 5 of 5 (IPv4 Commit) started...
NetworkManager[556]: <info> (tun0): device state change: ip-config -> ip-check (reason 'none') [70 80 0]
NetworkManager[556]: <info> Activation (tun0) Stage 5 of 5 (IPv4 Commit) complete.
NetworkManager[556]: <info> (tun0): device state change: ip-check -> secondaries (reason 'none') [80 90 0]
NetworkManager[556]: <info> (tun0): device state change: secondaries -> activated (reason 'none') [90 100 0]
NetworkManager[556]: <info> Activation (tun0) successful, device activated.

Minhas perguntas são:

  1. A tabela de roteamento está correta? Para mim, parece um pouco estranho devido às duas entradas padrão. Além disso, ao gravar o tráfego no roteador wifi público (usando o tcpdump), nem todo o tráfego é roteado pela VPN.

  2. O que o erro ( ERROR: Linux route add command failed: external program exited with error status: 2 ) no syslog diz? Isso pode ser conectado à primeira pergunta?

Edit: Obrigado pela resposta, Michal. Para reduzir o tráfego multicast / local / ..., estou planejando também usar o iptables para eliminar esse tráfego também.

Estou tentando usar as regras do iptables da seguinte forma:

#!/bin/bash

GATEWAY="192.168.178.1"

iptables -F

# Allow loopback device (internal communication)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow DHCP communication with gateway
iptables -A INPUT -i wlan0 -p udp -s $GATEWAY/32 --dport 67:68 --sport 67:68 -j ACCEPT
iptables -A OUTPUT -o wlan0 -p udp -d $GATEWAY/32 --dport 67:68 --sport 67:68 -j ACCEPT

# Allow ICMP communication with gateway
iptables -A INPUT -i wlan0 -p icmp -s $GATEWAY/32 -j ACCEPT
iptables -A OUTPUT -o wlan0 -p icmp -d $GATEWAY/32 -j ACCEPT

#Allow VPN establishment
iptables -A OUTPUT -p tcp --dport 1194 -j ACCEPT
iptables -A INPUT -p tcp --sport 1194 -j ACCEPT

#Accept all TUN connections (tun = VPN tunnel)
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT

#Set default policies to drop all communication unless specifically allowed
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

IMO, essas regras devem ser suficientes para obter um IP atribuído pelo gateway, estabelecer uma conexão com o servidor OpenVPN e lidar com todo o tráfego nessa conexão. Mas o DNS não funciona, embora também deva usar a conexão VPN. Por que isso não funciona?

Próxima edição: Configure um servidor de nomes local ( dnsmasq ) no servidor VPN. A configuração do servidor mudou para

push "dhcp-option DNS 10.11.12.1"

em vez de

push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

Ao executar dig +short serverfault.com @10.11.12.1 no próprio servidor VPN, o nome do host poderá ser recuperado com êxito. Se o comando for executado em um host diferente que não esteja usando VPN ( dig +short stackoverflow.com @X.X.X.X ), o nome do host também poderá ser recuperado com êxito. No entanto, quando o comando é executado em um cliente conectado à VPN ( dig +short stackoverflow.com @10.11.12.1 ), o comando falha ( ;; connection timed out; no servers could be reached ). Por quê? Iptables são configurados para ACCEPT all.

    
por user236012 17.05.2015 / 00:11

1 resposta

2
  1. A tabela de roteamento parece bem, veja a coluna métrica. A rota com a métrica mais baixa será a preferida. Sua tabela de roteamento contém agora duas rotas padrão e 10.11.12.13 terá preferência sobre 192.168.178.1 devido à menor métrica. Sobre o tráfego na interface física; isso também é normal porque você tem serviços de escuta que respondem pelo tráfego de broadcast / multicast. Esse tráfego não pode passar pela interface VPN. Este é também um sinal de algumas aplicações que usam a rede local para acelerar as coisas, por exemplo: dropbox, teamviewer, upnp, vizinhança da rede microsoft e muitas outras funcionalidades.
  2. O mais provável é que 'cos / sbin / route ou / usr / sbin / route não tenha permissão para fazer algo, porque você usou diretiva em seus arquivos de configuração para descartar privilégios de serviço do openvpn para usuário nobody, depois de reconectar ele pode gritar sobre essas coisas. Especialmente quando você altera a configuração do servidor e não reinicia o cliente manualmente com privilégios totais. Isso também é normal.

PS. Você não precisa resolver-repetir-infinito se você usar remoto com endereço IP, não faz sentido.

EDIT: configuração do iptables Eu presumo que seja a configuração do iptables do cleint.

  1. Você também deve liberar a tabela NAT:

iptables -F -t nat

  1. Você não precisa de regras para comunicação DHCP por dois motivos:
    • Os serviços DHCP geralmente usam os chamados soquetes brutos que não são cobertos pelo iptables (da última vez que eu verifiquei, o dhcpd, o dhcpcd estava usando),
    • O mecanismo DHCP é implementado no protocolo OpenVPN, portanto, não há nenhuma comunicação DHCP real, quer dizer, DHCP Rrequest, oferta DHCP, DHCP ACK, Pacote DHCP.
  2. Usar o OpenVPN no modo TCP é uma má ideia: link
  3. Por favor edite sua pergunta e me diga se:
    • você é capaz de fazer ping no servidor VPN (endereço IP da VPN) do cliente (comunicação de túnel)
    • mostre-me netstat -l -u -n -p do servidor (precisamos saber se seu daemon dnsmasq está escutando na interface tun),
    • você consegue executar o ping 8.8.8.8 depois que a VPN foi estabelecida?
por 17.05.2015 / 01:47