diff --git a/src/network.sh b/src/network.sh index 166b877..2f90705 100644 --- a/src/network.sh +++ b/src/network.sh @@ -6,7 +6,7 @@ set -Eeuo pipefail : "${MAC:=""}" : "${MAC_2:=""}" : "${DHCP:="N"}" -: "${NETWORK:="Y"}" +: "${NETWORK:="bridge"}" : "${USER_PORTS:=""}" : "${HOST_PORTS:=""}" : "${ADAPTER:="virtio-net-pci"}" @@ -20,8 +20,8 @@ set -Eeuo pipefail : "${VM_NET_MAC_2:="$MAC_2"}" : "${VM_NET_HOST:="QEMU"}" : "${VM_NET_HOST_2:="QEMU_2"}" -: "${VM_NET_IP:="20.20.20.21"}" -: "${VM_NET_IP_2:="20.20.21.21"}" +: "${VM_NET_IP:="192.168.0.101"}" +: "${VM_NET_IP_2:="192.168.1.101"}" : "${DNSMASQ_OPTS:=""}" : "${DNSMASQ:="/usr/sbin/dnsmasq"}" @@ -277,7 +277,157 @@ configureNAT() { configureDNS || return 1 + return 0/ +} + + +configureBridge() { + + local tuntap="TUN device is missing. $ADD_ERR --device /dev/net/tun" + local tables="The 'ip_tables' kernel module is not loaded. Try this command: sudo modprobe ip_tables iptable_nat" + + # Create the necessary file structure for /dev/net/tun + if [ ! -c /dev/net/tun ]; then + [ ! -d /dev/net ] && mkdir -m 755 /dev/net + if mknod /dev/net/tun c 10 200; then + chmod 666 /dev/net/tun + fi + fi + + if [ ! -c /dev/net/tun ]; then + error "$tuntap" && return 1 + fi + + # Check port forwarding flag + if [[ $(/dev/null + rc=$? + } || : + if ((rc != 0)) || [[ $(>/dev/vhost-net + rc=$? + } 2>/dev/null || : + ((rc == 0)) && NET_OPTS+=",vhost=on,vhostfd=40" + fi + + NET_OPTS+=",script=no,downscript=no" + + NET_OPTS+=" -netdev tap,id=hostnet1,ifname=$VM_NET_TAP_2" + + if [ -c /dev/vhost-net ]; then + { + exec 41>>/dev/vhost-net + rc=$? + } 2>/dev/null || : + ((rc == 0)) && NET_OPTS+=",vhost=on,vhostfd=41" + fi + + NET_OPTS+=",script=no,downscript=no" + return 0 + } closeNetwork() { @@ -434,13 +584,18 @@ if [[ "$IP" != "172."* ]] && [[ "$IP" != "10.8"* ]] && [[ "$IP" != "10.9"* ]]; t checkOS fi -if [[ "${NETWORK,,}" != "user"* ]]; then +if [[ "${NETWORK,,}" == "user"* ]]; then - # Configure for tap interface - if ! configureNAT; then + # Configure for usermode networking (slirp) + configureUser || exit 24 - NETWORK="user" - warn "falling back to usermode networking! Performance will be bad and port mapping will not work." +elif [[ "${NETWORK,,}" == "bridge"* ]]; then + # CONFIGURE Bridge + html "Configuring bridged network" + + if ! configureBridge; then + + error "Failed to setup bridge networking" ip link set "$VM_NET_TAP" down promisc off &>null || true ip link delete "$VM_NET_TAP" &>null || true @@ -452,14 +607,29 @@ if [[ "${NETWORK,,}" != "user"* ]]; then ip link set dockerbridge_2 down &>null || true ip link delete dockerbridge_2 &>null || true + exit 25 fi -fi +else -if [[ "${NETWORK,,}" == "user"* ]]; then + # Configure for tap interface + if ! configureNAT; then - # Configure for usermode networking (slirp) - configureUser || exit 24 + error "Failed to setup NAT networking" + + ip link set "$VM_NET_TAP" down promisc off &>null || true + ip link delete "$VM_NET_TAP" &>null || true + ip link set "$VM_NET_TAP_2" down promisc off &>null || true + ip link delete "$VM_NET_TAP_2" &>null || true + + ip link set dockerbridge down &>null || true + ip link delete dockerbridge &>null || true + ip link set dockerbridge_2 down &>null || true + ip link delete dockerbridge_2 &>null || true + + exit 25 + + fi fi