Abra VPN chamando um script: Opção não reconhecida: [AF_INET]

2

Roteador Netgear R7000 Tomate v1.28.0000 -2017.2-kille72-K26ARM USB AIO-64K

Eu poderia fazer alguma ajuda para depurar meu script.

Objetivo: recuperar o número da porta encaminhada do JSON da API da VPN, passar o número da porta para executar o daemon de transmissão usando a transmissão remota.

Minha entrada:

#!/opt/bin/bash
#
# Enable port forwarding when using Private Internet Access
#
# Usage:
#  ./port_forwarding.sh
set -x
exec 5>/etc/openvpn/mylog
BASH_XTRACEFD="5"
PS4='$LINENO: '

TRANSUSER=me
TRANSPASS=mypass
TRANSHOST=192.168.1.251

/bin/echo waiting 20s for vpn to connect and trasmission to start
sleep 20

error( )
{
  /bin/echo "$@" 1>&2
  exit 1
}

error_and_usage( )
{
  /bin/echo "$@" 1>&2
  usage_and_exit 1
}

usage( )
{
  /bin/echo "Usage: 'dirname $0'/$PROGRAM"
}

usage_and_exit( )
{
  usage
  exit $1
}

version( )
{
  /bin/echo "$PROGRAM version $VERSION"
}


port_forward_assignment( )
{
  client_id_file="/etc/openvpn/pia_client_id"
  if [ ! -f "$client_id_file" ]; then
    if hash /opt/bin/shasum 2>/dev/null; then
      /usr/bin/head -n 100 /dev/urandom | /opt/bin/shasum -a 256 | tr -d " -" > "$client_id_file"
    elif hash /opt/bin/sha256sum 2>/dev/null; then
      /usr/bin/head -n 100 /dev/urandom | /opt/bin/sha256sum | tr -d " -" > "$client_id_file"
    else
      /bin/echo "Please install shasum or sha256sum, and make sure it is visible in your \$PATH"
      exit 1
    fi
  fi
  client_id='/bin/cat "$client_id_file"'
  json='/opt/bin/curl "http://209.222.18.222:2000/?client_id=$client_id" 2>/dev/null'
  if [ "$json" == "" ]; then
    json='Port forwarding is already activated on this connection, has expired, or you are not connected to a PIA region that supports port forwarding'
  fi

  /bin/echo server returned message: $json

#trim VPN forwarded port from JSON
PORT=$(echo $json | /usr/bin/awk 'BEGIN{r=1;FS="[{}\":]+"} /port/{r=0; print $3} END{exit r}')
/bin/echo if succesful port is:$PORT  

#change transmission port on the fly

/opt/bin/transmission-remote $TRANSHOST --auth $TRANSUSER:$TRANSPASS -p "$PORT"
/bin/echo your transmission details: $TRANSHOST $TRANSUSER $TRANSPASS
}

/bin/echo remember to reconnect to VPN before running this script. Run no longer than 2 minutes after connection or this will fail!

EXITCODE=0
PROGRAM='basename $0'
VERSION=2.1

while /usr/bin/test $# -gt 0
do
  case $1 in
  --usage | --help | -h )
    usage_and_exit 0
    ;;
  --version | -v )
    version
    exit 0
    ;;
  *)
    error_and_usage "Unrecognised option: $1"
    ;;
  esac
  shift
done

port_forward_assignment

exit 0

Problema: Quando eu executo este script do shell ele funciona bem, mas quando eu chamo o script na minha configuração openvpn eu recebo este resultado:

+ PS4='$LINENO: '
12: TRANSUSER=me
13: TRANSPASS=mypass
14: TRANSHOST=192.168.1.251
16: /bin/echo waiting 20s for vpn to connect and trasmission to start
17: sleep 20
79: /bin/echo remember to reconnect to VPN before running this script. Run no longer than 2 minutes after connection or this will 'fail!'
81: EXITCODE=0
882: basename /etc/openvpn/test.sh
82: PROGRAM=test.sh
83: VERSION=2.1
85: /usr/bin/test 1 -gt 0
87: case $1 in
96: error_and_usage 'Unrecognized option: [AF_INET]45.136.190.211 1198'
27: /bin/echo 'Unrecognized option: [AF_INET]46.136.190.211 1198'
28: usage_and_exit 1
38: usage
333: dirname /etc/openvpn/test.sh
33: /bin/echo 'Usage: /etc/openvpn/test.sh'
39: exit 1

Funciona bem quando executado em shell:

+ PS4='$LINENO: '
12: TRANSUSER=me
13: TRANSPASS=mypass
14: TRANSHOST=192.168.1.251
16: /bin/echo waiting 20s for vpn to connect and trasmission to start
17: sleep 20
79: /bin/echo remember to reconnect to VPN before running this script. Run no longer than 2 minutes after connection or this will 'fail!'
81: EXITCODE=0
882: basename ./test.sh
82: PROGRAM=test.sh
83: VERSION=2.1
85: /usr/bin/test 0 -gt 0
102: port_forward_assignment
50: client_id_file=/etc/openvpn/pia_client_id
51: '[' '!' -f /etc/openvpn/pia_client_id ']'
661: /bin/cat /etc/openvpn/pia_client_id
61: client_id=080db0a6e936918d405683447a78bf426223e9a1ea2ecce744722ac3241d4232
662: /opt/bin/curl 'http://209.222.18.222:2000/?client_id=080db0a6e936918d405683447a78bf426273e9a1ea2ecce744722ac3241d4232'
62: json='{"port":44257}'
63: '[' '{"port":44257}' == '' ']'
67: /bin/echo server returned message: '{"port":44257}'
770: echo '{"port":44257}'
770: /usr/bin/awk 'BEGIN{r=1;FS="[{}\":]+"} /port/{r=0; print $3} END{exit r}'
70: PORT=44257
71: /bin/echo if successful port is:44257
75: /opt/bin/transmission-remote 192.168.1.251 --auth me:mypass -p 44257
76: /bin/echo your transmission details: 192.168.1.251 me mypass
104: exit 0

Onde estou indo errado? Por que isso falha quando o script é chamado pelo OpenVPN e não quando eu executo o shell? Como posso descobrir o que o AF_INET aponta também? Estranhamente, o endereço IP no erro é meu servidor e porta VPN cliente, não o número de porta encaminhado retornado do JSON.

Minha configuração do OpenVPN:

# Automatically generated configuration
daemon
client
dev tun11
proto udp
remote nl.privateinternetaccess.com 1198
resolv-retry 30
nobind
persist-key
persist-tun
comp-lzo adaptive
ncp-ciphers AES-128-GCM:AES-256-GCM:AES-128-CBC:AES-256-CBC
cipher AES-128-CBC
redirect-gateway def1
verb 3
script-security 2
up updown.sh
down updown.sh
ca ca.crt
status-version 2
status status

# Custom Configuration
syslog [progname]
persist-key
persist-tun
tls-client
auth-user-pass /tmp/password.txt
comp-lzo
verb 3
reneg-sec 0
ipchange "/etc/openvpn/test.sh"
script-security 3

EDIT #

Graças ao Ipor Sircer, consegui evitar o erro não definindo o argumento 1. Minha entrada agora é assim (para simplificar), mas minha saída quando chamada pelo OpenVPN é muito diferente de quando eu executo o script diretamente.

Minha entrada:

#!/opt/bin/bash
#
# Enable port forwarding when using Private Internet Access
#
# Usage:
#  ./port_forwarding.sh
set -x
exec 5>/etc/openvpn/mylog
BASH_XTRACEFD="5"
PS4='$LINENO: '

TRANSUSER=me
TRANSPASS=mypass
TRANSHOST=192.168.1.251

  client_id_file="/etc/openvpn/pia_client_id"
  if [ ! -f "$client_id_file" ]; then
    if hash /opt/bin/shasum 2>/dev/null; then
      /usr/bin/head -n 100 /dev/urandom | /opt/bin/shasum -a 256 | tr -d " -" > "$client_id_file"
    elif hash /opt/bin/sha256sum 2>/dev/null; then
      /usr/bin/head -n 100 /dev/urandom | /opt/bin/sha256sum | tr -d " -" > "$client_id_file"
    else
      /bin/echo "Please install shasum or sha256sum, and make sure it is visible in your \$PATH"
      exit 1
    fi
  fi
  client_id='/bin/cat "$client_id_file"'
  json='/opt/bin/curl "http://209.222.18.222:2000/?client_id=$client_id" 2>/dev/null'
  if [ "$json" == "" ]; then
    json='Port forwarding is already activated on this connection, has expired, or you are not connected to a PIA region that supports port forwarding'
  fi

  /bin/echo server returned message: $json

#trim VPN forwarded port from JSON
PORT=$(echo $json | /usr/bin/awk 'BEGIN{r=1;FS="[{}\":]+"} /port/{r=0; print $3} END{exit r}')
/bin/echo if successful port is:$PORT  

#change transmission port on the fly

/opt/bin/transmission-remote $TRANSHOST --auth $TRANSUSER:$TRANSPASS -p "$PORT"
/bin/echo your transmission details: $TRANSHOST $TRANSUSER $TRANSPASS

Saída com o OpenVPN:

+ PS4='$LINENO: '
12: TRANSUSER=me
13: TRANSPASS=pass
14: TRANSHOST=192.168.1.251
16: client_id_file=/etc/openvpn/pia_client_id
17: '[' '!' -f /etc/openvpn/pia_client_id ']'
227: /bin/cat /etc/openvpn/pia_client_id
27: client_id=080db0a6e936918d405683447a78bf426273e9a1ea2ecce744722ac3241d4232
228: /opt/bin/curl 'http://209.222.18.222:2000/?client_id=080db0a6e936918d405683447a78bf426273e9a1ea2ecce744722ac3241d4232'
28: json=
29: '[' '' == '' ']'
30: json='Port forwarding is already activated on this connection, has expired, or you are not connected to a PIA region that supports port forwarding'
33: /bin/echo server returned message: Port forwarding is already activated on this connection, has expired, or you are not connected to a PIA region that supports port forwarding
336: echo Port forwarding is already activated on this connection, has expired, or you are not connected to a PIA region that supports port forwarding
336: /usr/bin/awk 'BEGIN{r=1;FS="[{}\":]+"} /port/{r=0; print $3} END{exit r}'
36: PORT=
37: /bin/echo if successful port is:
41: /opt/bin/transmission-remote 192.168.1.251 --auth me:pass -p ''
42: /bin/echo your transmission details: 192.168.1.251 me pass

Sem o OpenVPN:

16: client_id_file=/etc/openvpn/pia_client_id
17: '[' '!' -f /etc/openvpn/pia_client_id ']'
227: /bin/cat /etc/openvpn/pia_client_id
27: client_id=080db0a6e936918d405683447a78bf426273e9a1ea2ecce744722ac3241d4232
228: /opt/bin/curl 'http://209.222.18.222:2000/?client_id=080db0a6e936918d405683447a78bf426273e9a1ea2ecce744722ac3241d4232'
28: json='{"port":44257}'
29: '[' '{"port":44257}' == '' ']'
33: /bin/echo server returned message: '{"port":44257}'
336: echo '{"port":44257}'
336: /usr/bin/awk 'BEGIN{r=1;FS="[{}\":]+"} /port/{r=0; print $3} END{exit r}'
36: PORT=44257
37: /bin/echo if successful port is:44257
    
por Dodgexander 27.10.2017 / 17:59

2 respostas

2

O Openvpn chama seu script com 2 parâmetros que você definiu como opção não reconhecida.

man openvpn:

"- ipchange cmd

Execute o comando cmd quando nosso endereço IP remoto for inicialmente autenticado.               ou alterações.

cmd consiste em um caminho para o script (ou programa executável),               opcionalmente seguido por argumentos. O caminho e os argumentos podem ser               citação simples ou dupla e / ou de escape usando uma barra invertida e               deve ser separado por um ou mais espaços.

Quando cmd é executado dois argumentos são anexados após qualquer argumento especificado em cmd , como segue:

cmd ip_address port_number "

    
por 27.10.2017 / 18:18
0

O motivo pelo qual json está vazio é porque curl falha.

A razão pela qual curl falha é porque; como uma medida de segurança (portanto por design ), o OpenVPN não permitirá que nenhum pacote atravesse o encapsulamento enquanto qualquer script que foi iniciado pelo binário openvpn ainda está sendo executado.

Você precisará encontrar outro método para invocar seu script.

É por isso que esta é a resposta correta e por que essa resposta não deve ser excluída:

O cliente está se conectando a remote nl.privateinternetaccess.com 1198

Os servidores do provedor de serviços VPN normalmente redirecionam o tráfego all pela VPN.

No --ipchange script , encontramos este comando: json='/opt/bin/curl "http://209.222.18.222:2000/?client_id=$client_id" 2>/dev/null'

Portanto: curl http://209.222.18.222:2000 etc está tentando usar a VPN para se conectar a IP 209.222.18.222 e o openvpn não permitirá que nenhum pacote passe pela VPN até que todos tenham scripts concluído.

Isso também foi solicitado e respondido @a link

Observação: Fiz um grande esforço para verificar se essa resposta é precisa, embora o link não tenha respondido qualquer uma das respostas recebidas aqui ou no openvpn.net

    
por 31.10.2017 / 12:09