Skip to content

Commit

Permalink
network: configure IPv6 when enabled
Browse files Browse the repository at this point in the history
If dom0 expose IPv6 address settings, configure it on the interface.
Both backend and frontend side. If no IPv6 configuration is provided,
block IPv6 as it was before.

Fixes QubesOS/qubes-issues#718
  • Loading branch information
marmarek committed Dec 7, 2017
1 parent aab5a28 commit 44f8cce
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 14 deletions.
60 changes: 51 additions & 9 deletions network/setup-ip
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
have_qubesdb || exit 0

ip=$(/usr/bin/qubesdb-read /qubes-ip 2> /dev/null)
ip6=$(/usr/bin/qubesdb-read /qubes-ip6 2> /dev/null)
if [ "x$ip" != x ]; then
#netmask=$(/usr/bin/qubesdb-read /qubes-netmask)
gateway=$(/usr/bin/qubesdb-read /qubes-gateway)
gateway6=$(/usr/bin/qubesdb-read /qubes-gateway6)
primary_dns=$(/usr/bin/qubesdb-read /qubes-primary-dns 2>/dev/null || echo "$gateway")
secondary_dns=$(/usr/bin/qubesdb-read /qubes-secondary-dns)
/sbin/ethtool -K "$INTERFACE" sg off
Expand All @@ -28,32 +30,72 @@ mac-address=$(ip l show dev "$INTERFACE" |grep link|awk '{print $2}')
id=VM uplink $INTERFACE
uuid=de85f79b-8c3d-405f-a652-cb4c10b4f9ef
type=802-3-ethernet
[ipv6]
method=ignore
__EOF__
ip4_nm_config=""
ip6_nm_config=""
if ! qsvc disable-dns-server ; then
ip4_nm_config="${ip4_nm_config}
dns=${primary_dns};${secondary_dns}"
fi
if ! qsvc disable-default-route ; then
ip4_nm_config="${ip4_nm_config}
addresses1=$ip;32;$gateway"
if [ -n "$ip6" ]; then
ip6_nm_config="${ip6_nm_config}
addresses1=$ip6;128;$gateway6"
fi
else
ip4_nm_config="${ip4_nm_config}
addresses1=$ip;32"
if [ -n "$ip6" ]; then
ip6_nm_config="${ip6_nm_config}
addresses1=$ip6;128"
fi
fi
if [ -n "$ip4_nm_config" ]; then
cat >> "$nm_config" <<__EOF__
[ipv4]
method=manual
may-fail=false
$ip4_nm_config
__EOF__
else
cat >> "$nm_config" <<__EOF__
[ipv4]
method=ignore
__EOF__
if ! qsvc disable-dns-server ; then
echo "dns=$primary_dns;$secondary_dns" >> "$nm_config"
fi
if ! qsvc disable-default-route ; then
echo "addresses1=$ip;32;$gateway" >> "$nm_config"

if [ -n "$ip6_nm_config" ]; then
cat >> "$nm_config" <<__EOF__
[ipv6]
method=manual
may-fail=false
$ip6_nm_config
__EOF__
else
echo "addresses1=$ip;32" >> "$nm_config"
cat >> "$nm_config" <<__EOF__
[ipv6]
method=ignore
__EOF__
fi

chmod 600 "$nm_config"
# reload connection
nmcli connection load "$nm_config" || :
else
# No NetworkManager enabled, configure the network manually
/sbin/ifconfig "$INTERFACE" "$ip" netmask 255.255.255.255
if [ -n "$ip6" ]; then
/sbin/ifconfig "$INTERFACE" add "$ip6"/128
fi
/sbin/ifconfig "$INTERFACE" up
/sbin/route add -host "$gateway" dev "$INTERFACE"
if ! qsvc disable-default-route ; then
/sbin/route add default gw "$gateway"
if [ -n "$gateway6" ]; then
/sbin/route -6 add default gw "$gateway6" dev "$INTERFACE"
fi
fi
if ! is_protected_file /etc/resolv.conf ; then
echo > /etc/resolv.conf
Expand Down
30 changes: 25 additions & 5 deletions network/vif-route-qubes
Original file line number Diff line number Diff line change
Expand Up @@ -29,21 +29,31 @@ lockfile=/var/run/xen-hotplug/vif-lock

# shellcheck disable=SC2154
if [ "${ip}" ]; then
# get first IPv4 and first IPv6
for addr in ${ip}; do
if [ -z "$ip4" ] && [[ "$addr" = *.* ]]; then
ip4="$addr"
elif [ -z "$ip6" ] && [[ "$addr" = *:* ]]; then
ip6="$addr"
fi
done
# IPs as seen by this VM
netvm_ip="$ip"
netvm_ip="$ip4"
netvm_gw_ip=$(qubesdb-read /qubes-netvm-gateway)
netvm_dns1_ip=$(qubesdb-read /qubes-netvm-primary-dns)
netvm_dns2_ip=$(qubesdb-read /qubes-netvm-secondary-dns)

back_ip="$netvm_gw_ip"

# IPs as seen by the VM - if other than $netvm_ip
appvm_gw_ip="$(qubesdb-read "/mapped-ip/$ip/visible-gateway" 2>/dev/null || :)"
appvm_ip="$(qubesdb-read "/mapped-ip/$ip/visible-ip" 2>/dev/null || :)"
appvm_gw_ip="$(qubesdb-read "/mapped-ip/$ip4/visible-gateway" 2>/dev/null || :)"
appvm_ip="$(qubesdb-read "/mapped-ip/$ip4/visible-ip" 2>/dev/null || :)"
fi

# Apply NAT if IP visible from the VM is different than the "real" one
# See vif-qubes-nat.sh for details
# XXX: supported only for the first IPv4 address, IPv6 is dropped if this
# feature is enabled
if [ -n "$appvm_ip" ] && [ -n "$appvm_gw_ip" ] && [ "$appvm_ip" != "$netvm_ip" ]; then
# shellcheck disable=SC2154
if test "$command" == online; then
Expand Down Expand Up @@ -83,9 +93,19 @@ if [ "${ip}" ] ; then
# the guest using those addresses.
for addr in ${ip} ; do
${cmdprefix} ip route "${ipcmd}" "${addr}" dev "${vif}" metric "$metric"
if [[ "$addr" = *:* ]]; then
ipt=ip6tables-restore
else
ipt=iptables-restore
fi
echo -e "*raw\n$iptables_cmd -i ${vif} ! -s ${addr} -j DROP\nCOMMIT" | \
${cmdprefix} flock $lockfile $ipt --noflush
done
echo -e "*raw\n$iptables_cmd -i ${vif} ! -s ${ip} -j DROP\nCOMMIT" | \
${cmdprefix} flock $lockfile iptables-restore --noflush
# if no IPv6 is assigned, block all IPv6 traffic on that interface
if ! [[ "$ip" = *:* ]]; then
echo -e "*raw\n$iptables_cmd -i ${vif} -j DROP\nCOMMIT" | \
${cmdprefix} flock $lockfile ip6tables-restore --noflush
fi
${cmdprefix} ip addr "${ipcmd}" "${back_ip}/32" dev "${vif}"
fi

Expand Down

0 comments on commit 44f8cce

Please sign in to comment.