Configuração do namespace de rede; Resultados diferentes entre roteiro e manual

1

Estou tendo problemas para fazer com que um script antigo funcione novamente em 16.04 após uma atualização remota, a instalação anterior era 14.04. Esse script configura um namespace de rede para isolar programas da interface de rede principal.

Descrição rápida do que é suposto acontecer:

  • Crie um namespace de rede chamado ns1 .
  • Crie um par de interfaces veth, nomeadas como veth1 e vpeer1
  • Mover interface vpeer1 para o espaço de nomes de rede ns1
  • Atribuir endereço IP à interface veth1 e trazê-lo para cima
  • Atribuir endereço IP à interface vpeer1 , trazê-lo para cima.
  • Chame a interface lo no namespace da rede ns1
  • Crie uma rota padrão entre os pares veth.
  • Alterar ip_forwarding para 1
  • Altere iptables FORWARD para DROP e liberte, elimine iptables nat.
  • Criar entrada para pós-venda (MASQUERADE) e duas entradas FORWARD são criadas, o que permite o encaminhamento do tráfego entre o exterior e o interior do espaço de nomes da rede.
#!/usr/bin/env bash
set -x

NS="ns1"
VETH="veth1"
VPEER="vpeer1"
VETH_ADDR="10.200.1.1"
VPEER_ADDR="10.200.1.2"

if [[ $EUID -ne 0 ]]; then
echo "You must be root to run this script"
exit 1
fi

# Remove namespace if it exists.
ip netns del $NS &>/dev/null

# Create namespace
ip netns add $NS

# Create veth link.
ip link add ${VETH} type veth peer name ${VPEER}

# Add peer-1 to NS.
ip link set ${VPEER} netns $NS

# Setup IP address of ${VETH}.
ip addr add ${VETH_ADDR}/24 dev ${VETH}
ip link set ${VETH} up

# Setup IP ${VPEER}.
ip netns exec $NS ip addr add ${VPEER_ADDR}/24 dev ${VPEER}
ip netns exec $NS ip link set ${VPEER} up
ip netns exec $NS ip link set lo up
ip netns exec $NS ip route add default via ${VETH_ADDR}

# Enable IP-forwarding.
echo 1 > /proc/sys/net/ipv4/ip_forward

# Flush forward rules.
iptables -P FORWARD DROP
iptables -F FORWARD

# Flush nat rules.
iptables -t nat -F

# Enable masquerading of 10.200.1.0.
iptables -t nat -A POSTROUTING -s ${VPEER_ADDR} -o p119p1 -j MASQUERADE
iptables -A FORWARD -i p119p1 -o ${VETH} -j ACCEPT
iptables -A FORWARD -o p119p1 -i ${VETH} -j ACCEPT

p119p1 é o meu adaptador ethernet, mude para o que for seu para teste.

Para testar essa conexão, quando estiver operacional, ip netns exec ns1 ping 8.8.8.8 se pular, funciona.

Quando executado como um script com yourscript.sh como root, isso não funciona no 16.04. Em 14.04 isso funcionou. Quando digitado manualmente, linha para linha como root (substituindo $ {variables} quando necessário) isso funciona em 16.04.

Tenho certeza de que não tropeço em uma grande falha do sistema e estou fazendo algo errado em comparação com a antiga distro. Meu erro quando executado como script, basicamente, queixa-se "Destination Host Unreachable" por algum motivo, ele pula a atribuição de um IP para veth1 quando executado como um script. Razão desconhecida para mim mesmo.

Quando programas de trabalho podem ser iniciados dentro do namespace. Usando ip netns exec ns1 <command> . Permitir que um deles separe programas individuais em sua própria rede VPN se também estiver usando uma VPN dentro do namespace.

    
por ZizzyDizzyMC 02.02.2017 / 22:24

0 respostas