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:
ns1
. veth1
e vpeer1
vpeer1
para o espaço de nomes de rede ns1
veth1
e trazê-lo para cima vpeer1
, trazê-lo para cima. lo
no namespace da rede ns1
ip_forwarding
para 1 FORWARD
para DROP
e liberte, elimine iptables nat. #!/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.