Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
Message added by EDACerton,

When requesting support, please include a Tailscale diag package with your request:

 

https://edac.dev/unraid/plugin-diagnostics/usage/

[Plugin] Tailscale

Featured Replies

I can run tailscale on other linuix os with out this issue... I don't lose host dns and its doen't break docker resolv.conf dns...

 

  • Replies 1.7k
  • Views 377.3k
  • Created
  • Last Reply

Top Posters In This Topic

Most Popular Posts

  • EDACerton
    EDACerton

    This topic is not for support of the Tailscale docker integration. Please make a post in the appropriate OS support forum for issues related to the docker integration. Common Issues I

  • 2024.08.28   This update contains an important alert for Unraid Connect users. We recently determined that the Flash Backup feature of Unraid Connect would back up the Tailscale state file.

  • EDACerton
    EDACerton

    2023.05.25b Update Tailscale to 1.42.0 Add Tailscale web interface to Settings page Add page for Tailscale / plugin logs Switch Taildrop implementation to use native Unrai

Posted Images

Small suggestion: add a manual stop/start option to the options in addition to the Restart option so you don't have to go through the terminal.

  • Author
1 minute ago, Alex.b said:

Small suggestion: add a manual stop/start option to the options in addition to the Restart option so you don't have to go through the terminal.

There’s an “enable” option in the advanced settings already… just disable, save, then enable again :) 

Just now, EDACerton said:

There’s an “enable” option in the advanced settings already… just disable, save, then enable again :) 

You're absolutely right, sorry, I didn't see the option, I was focused on the buttons!

On 2/3/2025 at 7:51 PM, bmartino1 said:

The issue is trying to get fqdn / hostname and dns over the tailscale vpn. to do that you need the --accept-dns option

 

News to me. I don't accept DNS - and if I did it would be the exact same IP because that's what I have set in Tailscale as my global DNS.

 

And in not accepting DNS, I have previously had no issues using FQDN/hostnames and DNS queries over the tailnet to/from any machine. I have 4 Unraid servers, my phone which works fine WiFi or 4G/5G, and my Mac which works fine on my LAN or from someone's else LAN, including public or hotel WiFi.

 

On 2/3/2025 at 7:51 PM, bmartino1 said:

the 192 is my dns server, my gateway and a googles public dns IP.

I didn't mean to imply that this had anything to do with this issue, just that it's really (REALLY) strange to include both a private and public DNS server. They're used, at best, randomly. If you don't care about DNS, then why include a private one at all? Just use multiple public ones. If you do care, because you have private addresses to resolve, then you CAN'T be specifying a public DNS at the same level as the provite one. You need to use a forwarder or a local resolver with forwarding.

 

 

10 hours ago, Espressomatic said:

 

News to me. I don't accept DNS - and if I did it would be the exact same IP because that's what I have set in Tailscale as my global DNS.

 

And in not accepting DNS, I have previously had no issues using FQDN/hostnames and DNS queries over the tailnet to/from any machine. I have 4 Unraid servers, my phone which works fine WiFi or 4G/5G, and my Mac which works fine on my LAN or from someone's else LAN, including public or hotel WiFi.

 

I didn't mean to imply that this had anything to do with this issue, just that it's really (REALLY) strange to include both a private and public DNS server. They're used, at best, randomly. If you don't care about DNS, then why include a private one at all? Just use multiple public ones. If you do care, because you have private addresses to resolve, then you CAN'T be specifying a public DNS at the same level as the provite one. You need to use a forwarder or a local resolver with forwarding.

 

 

I understand your confusion. 

It has more to do with how the host is not able to handle its own back end. 

 

And how I'm leveraging the tail scale VPN to do secondary subnetting. 

 

I'm trying to leverage the CG. Nat bypass through funnel a beta system. Using the tailscale magic DNS. And run my own DNS server to help control and maintain certain things through host names. 

 

As I said in the example, this is more because I'm trying to leverage a VPN to handle a secondary site with home assistant. 

 

I found that I require both these options. 

I currently have a solution that I'm not going to share due to how the plug-in is developed for the tail scale health check and doing weird things to the resolve config. 

 

More an issue with CGnat and that and how to bypass

Hey, is anyone else not seeing the 2025.01.30 update as available to install? My Unraid 7.0.0 server thinks I'm up to date with plugin version 2024.12.06.

  • Author
On 2/3/2025 at 7:51 PM, bmartino1 said:

all form the tailscale docs. I've been Very clear in what went wrong where and how to reproduce. The issue is trying to get fqdn / hostname and dns over the tailscale vpn. to do that you need the --accept-dns option ...

the 192 is my dns server, my gateway and a googles public dns IP. this is set in unraid web ui and made by rc.net ...

the issue is that when that setting is called and active the plugin is making a backup of the rc.1 resolv.conf and that unraid makes and this plugin kills the resolv.confg at the host level which cascade into issue as they deleted the host dns network data...

the plugin should not be writing into /etc/resolv.conf or at the very least be echoing back the data from the backup file into the resovl config to no lose host level dns...

the proper use of the resolv.conf should be writing that into the resolf.conf.tail to load at the end and not interfere with unraids resovl.conf AT ALL!

This is entiely the plugin issue...

If you're configuring --accept-dns, Tailscale is doing exactly what you're asking it to by overwriting resolv.conf. This is not a failure on the part of the plugin or of Tailscale (since actually it's Tailscale that manages that file, not the plugin itself).

 

Writing files into resolv.conf.tail would be ineffective, as Unraid has a much simpler network architecture than other Linux distributions. There's no resolvconf or systemd-resolved, all that Unraid has is resolv.conf. Therefore, when you ask Tailscale to handle DNS, the only option that it has is to overwrite resolv.conf.

 

If you want for Tailscale to use other local DNS servers, you can make those available on the tailnet and then configure split DNS in the Tailscale admin console: https://tailscale.com/kb/1054/dns

 

If you want to have the host accept DNS (and therefore use the Tailscale), but want containers to use other DNS servers, you can tell Docker to use different DNS settings by adding a --dns option in extra parameters for the containers: https://docs.docker.com/engine/network/#dns-services

2 hours ago, EDACerton said:

If you're configuring --accept-dns, Tailscale is doing exactly what you're asking it to by overwriting resolv.conf. This is not a failure on the part of the plugin or of Tailscale (since actually it's Tailscale that manages that file, not the plugin itself).

 

Writing files into resolv.conf.tail would be ineffective, as Unraid has a much simpler network architecture than other Linux distributions. There's no resolvconf or systemd-resolved, all that Unraid has is resolv.conf. Therefore, when you ask Tailscale to handle DNS, the only option that it has is to overwrite resolv.conf.

 

If you want for Tailscale to use other local DNS servers, you can make those available on the tailnet and then configure split DNS in the Tailscale admin console: https://tailscale.com/kb/1054/dns

 

If you want to have the host accept DNS (and therefore use the Tailscale), but want containers to use other DNS servers, you can tell Docker to use different DNS settings by adding a --dns option in extra parameters for the containers: https://docs.docker.com/engine/network/#dns-services

 

I understand what your saying per the doc:
https://tailscale.com/kb/1235/resolv-conf
 

I would love to turn off magic dns but that breaks other funnel stuff...

 

as the docs and override the config as they want tailscale dns to resolve some item... again I run this on Debian same command and I don't lose host dns setting cat the resolve on those I have my dns setting and tailscale...

I have found that your health check is overwriting the resolve...
image.png.d5a2c35a2f2b4328b29d85ba000281ef.png

as I have it set and non change... tailscle nor the plugin can touch it after i run xyz script... but giving how I do it I can see you adding the command to undo my edits... so I won't share how I'm doing it... Only that the resolv.conf is as I want it and not breaking...

image.png.6559674d1652ce92670a81d18fcfbf86.png

 

ATM my script workaround is working, the resolve and my host is better for it and the dockers no longer have a dns issue and magic dns and private dns are working as they should...

Through recent pull of attention for these issues either you or limetech have a patch or setup the resolv.conf.head (as that should have been used when tailscale attempts to overwrite...) as resolv.conf.head did't get rc1.net in testing and I had to rewrite my script multiple times to get to a working solution...  As finally unraid is setting the proper dns via rc1 net config... Therefore, is getting host resolv.conf data from rc1.net again to not break other cores systems...

I have found that it's this plugins health check that keeps trying to overwrite and break the resolv.conf...


unraid/ slackware uses reslov.conf generated via the rc1 net conf and its more a Slackware rcnet conf option keepresolv yes issues on unriad modification for slackware...

Regardless, I have it set and have a working workaround where the health check is upset but not breaking the pluginm, tailscale vpn is up and my wanted resolv.conf and my setting how I want them are configured... 

as Again this is not a issues other linux os it was found to only be a problem with unraid only... 

limetech rc net conf is a mess and I have checked with some other testing with it....
(as there is a weird issues with vhost and shimbr that is made due to these yes know in unraids rc net...

Due to these issues I'm working on a different network rewrite and interaction as i'm also running unraid as a VM and can have proxmox run tailscale and settings isolated with a vmbr network... Thats a future project... (as I rather this be contained within unraid...

The isseu was a recent update and  before the edit and changes for the exit node, as this was not a problem and working in the v7 beta...

it is only due to a recent change to how the plugins health check does things... that is what I have found...

Edited by bmartino1
typo - Data

as one should be able to set static unraid to 100.100.100.100 for a dns sertver and run acept-dns withouot a resolv.conf override oin the host this is tested on debain and other platforms... It is not what i'm seing... even the doc for tail scale only want to add teh data not replace the reoslv.conf!

  • Author
9 minutes ago, bmartino1 said:

as one should be able to set static unraid to 100.100.100.100 for a dns sertver and run acept-dns withouot a resolv.conf override oin the host this is tested on debain and other platforms... It is not what i'm seing... even the doc for tail scale only want to add teh data not replace the reoslv.conf!

You can do this... 100.100.100.100 will respond to DNS even if --accept-dns is false.

15 minutes ago, EDACerton said:

You can do this... 100.100.100.100 will respond to DNS even if --accept-dns is false.

As that was what I had before a recent tailscale update and before the resolv.conf broke broke..

image.png.d01e928b4accf13ae0556f2d8443dd28.png
 My issues is that even with the resolv.conf being overwritten per tailscale and unraid rcnet1 conf is writing to resolv.conf.head as it should... head is not being respected when resolv.conf is being called by other services.

This is a bigger underlying issues that started at the plugins health check and how the health check would flag tasilscale and shut down or atempt to restart and at the restart a process over causing a loop of overwrites...

as example with limetech unraids edit of slackwares netwokring in general:

 

root@Docker:~# cat /etc/rc.d/rc.inet1
#!/bin/bash
#
# script: rc.inet1
#
# This script is used to bring up the various network interfaces.
#
# @(#)/etc/rc.d/rc.inet1 10.2  Sun Jul 24 12:45:56 PDT 2005 (pjv)

# LimeTech - modified for Unraid OS

# Adapted by Bergware for use in Unraid OS - April 2016
# - improved interface configuration
# - added VLAN (sub-interface) support
# - removed wireless (unsupported)
# - updated shell syntax
# - used 'iproute2' utilities for network settings

# Adapted by Bergware for use in Unraid OS - April 2017
# - added IPv6 support
# - added multi bonding ports support
# - added multi bridging groups support
# - added multi default gateway support
# - added default route metrics support
# - added static route add/del command

# Adapted by Bergware for use in Unraid OS - November 2017
# - added independent DHCP & DNS settings for IPv4 and IPv6
# - improved delete all assigned IPv4 and IPv6 addresses

# Adapted by Bergware for use in Unraid OS - February 2018
# - fixed multi default gateway with different metrics & protocols
# - fixed route_up & route_down functions

# Adapted by Bergware for use in Unraid OS - December 2019
# - added disable IPv6 SLAAC per interface

# Adapted by Bergware for use in Unraid OS - February 2020
# - added delay to allow bond initialization

# Adapted by Bergware for use in Unraid OS - July 2021
# - improved ipv4 address removal
# - improved ipv6 address removal
# - fixed jumbo frame settings

# Adapted by Bergware for use in Unraid OS - February 2023
# - revised bond interface creation for linux kernel 6.1
# - added primary slave setting to bond interface

# Adapted by Bergware for use in Unraid OS - May 2023
# - added iptables and ip6tables and arp-tables inclusion to bridge interfaces
# - fixed ipv4 and ipv6 DNS assignment
# - suppress errors

# Adapted by Bergware for use in Unraid OS - July 2023
# - reverted iptables and ip6tables and arp-tables inclusion to bridge interfaces
# - removed promiscuous mode setting for bridge interfaces
# - added persistent option to dhcpcd

# Adapted by Bergware for use in Unraid OS - August 2023
# - added macvtap network creation
# - removed unnecessary error output redirection for 'run' command
# - added error logging to syslog
# - replace logging for generic add-in module

# Adapted by Bergware for use in Unraid OS - October 2023
# - added interface carrier check before assigning IP address (DHCP or static)
# - added "status" command

# Adapted by Bergware for use in Unraid OS - December 2023
# - remove leading zeros in IPv4 and IPv6 addresses

# Adapted by Bergware for use in Unraid OS - February 2024
# - revised bond interface creation for linux kernel 6.6.14 and later point releases

# Bergware - modified for Unraid OS, February 2024

###########
# LOGGING #
###########

# run & log functions
. /etc/rc.d/rc.runlog

############################
# READ NETWORK CONFIG FILE #
############################

# get the configuration information from rc.inet1.conf
. /etc/rc.d/rc.inet1.conf

# system network references
SYSTEM=/sys/class/net
CONF6=/proc/sys/net/ipv6/conf

############################
# DETERMINE INTERFACE LIST #
############################

# compose a list of interfaces from /etc/rc.d/rc.inet1.conf with a default
# maximum of 6 interfaces, but you can easily enlarge the interface limit
# if a value for IFNAME[n] is not set, we assume it is an eth'n' interface.
# this way, the new script is compatible with older rc.inet1.conf files.
# the IFNAME array is used to determine which interfaces to bring up/down.

MAXNICS=${MAXNICS:-6}
i=0
while [[ $i -lt $MAXNICS ]]; do
  IFNAME[$i]=${IFNAME[$i]:-eth$i}
  ((i++))
done

[[ $DEBUG_ETH_UP == yes ]] && log "List of interfaces: ${IFNAME[@]}"

######################
# LOOPBACK FUNCTIONS #
######################

# function to bring up loopback interface
lo_up(){
  if [[ -e $SYSTEM/lo ]]; then
    if ! ip -4 addr show lo | grep -qw 'inet'; then
      run ip -4 addr add 127.0.0.1/8 dev lo
    fi
    if ! ip -6 addr show lo | grep -qw 'inet6'; then
      run ip -6 addr add ::1/128 dev lo
    fi
    run ip link set lo up
  else
    [[ $DEBUG_ETH_UP == yes ]] && log "interface lo not present, can't bring up"
  fi
}

# function to take down loopback interface
lo_down(){
  if [[ -e $SYSTEM/lo ]]; then
    run ip link set lo down
  else
    [[ $DEBUG_ETH_UP == yes ]] && log "interface lo not present, can't take down"
  fi
}

#######################
# INTERFACE FUNCTIONS #
#######################

# function to get link mtu size
get_mtu(){
  ip link show $1 | grep -Po 'mtu \K\d+'
}

# function to set/reset link mtu size
set_mtu(){
  if [[ -n ${MTU[$i]} ]]; then
    # set MTU to specified value
    run ip link set $1 mtu ${MTU[$i]}
  else
    # reset MTU to default value
    [[ $(get_mtu $1) -ne 1500 ]] && run ip link set $1 mtu 1500
  fi
}

# function to wait for carrier of interface
carrier_up(){
  local n
  for n in {1..10}; do
    [[ $(cat $SYSTEM/$1/carrier 2>/dev/null) == 1 ]] && return 0 || sleep 1
  done
  return 1
}

# function to create bond interface
bond_up(){
  [[ -d /proc/net/bonding ]] || modprobe bonding mode=${BONDING_MODE[$i]} miimon=${BONDING_MIIMON[$i]}
  run ip link add name ${BONDNAME[$i]} type bond mode ${BONDING_MODE[$i]} miimon ${BONDING_MIIMON[$i]}
  set_mtu ${BONDNAME[$i]}
  PRIMARY=;
  # loop thru assigned interfaces in bond
  for BONDIF in ${BONDNICS[$i]}; do
    if [[ -e $SYSTEM/$BONDIF ]]; then
      [[ -z $PRIMARY ]] && PRIMARY=$BONDIF
      run ip link set $BONDIF up
      run ip link set $BONDIF master ${BONDNAME[$i]} down type bond_slave
    else
      [[ $DEBUG_ETH_UP == yes ]] && log "interface $BONDIF not present, can't add to ${BONDNAME[$i]}"
    fi
  done
  [[ -n $PRIMARY ]] && run ip link set name ${BONDNAME[$i]} type bond primary $PRIMARY
}

# function to delete bond interface
bond_down(){
  if [[ -e $SYSTEM/${BONDNAME[$i]} ]]; then
    # loop thru attached interfaces in bond
    for BONDIF in $(cat $SYSTEM/${BONDNAME[$i]}/bonding/slaves); do
      run ip link set $BONDIF nomaster
    done
    run ip link set ${BONDNAME[$i]} down
    run ip link del ${BONDNAME[$i]}
  else
    [[ $DEBUG_ETH_UP == yes ]] && log "interface ${BONDNAME[$i]} not present, can't take down"
  fi
}

# function to create bridge interface
br_up(){
  for ((j=0;j<${VLANS[$i]:-1};j++)); do
    [[ $j -eq 0 ]] && BRIDGE=${BRNAME[$i]} || BRIDGE=${BRNAME[$i]}.${VLANID[$i,$j]}
    [[ $j -eq 0 ]] && IP=${PROTOCOL[$i]:-ipv4} || IP=${PROTOCOL[$i,$j]:-ipv4}
    # convert legacy no/yes
    BRSTP[$i]=${BRSTP[$i]/no/0}
    BRSTP[$i]=${BRSTP[$i]/yes/1}
    run ip link add name $BRIDGE type bridge stp_state ${BRSTP[$i]} forward_delay ${BRFD[$i]}
    # loop thru assigned interfaces in bridge
    for BRNIC in ${BRNICS[$i]}; do
      [[ $j -eq 0 ]] && BRIF=$BRNIC || BRIF=$BRNIC.${VLANID[$i,$j]}
      [[ $j -eq 0 && -n ${HWADDR[$i]} ]] && run ip link set $BRIF addr ${HWADDR[$i]}
      if [[ -e $SYSTEM/$BRIF ]]; then
        [[ ${BRIF:0:3} == eth ]] && set_mtu $BRIF
        [[ ${BRIF:0:4} == bond ]] && set_mtu ${BRIF/bond/eth}
        run ip link set $BRIF down
        [[ $IP != ipv6 ]] && run ip -4 addr flush dev $BRIF
        [[ $IP != ipv4 ]] && run ip -6 addr flush dev $BRIF
        run ip link set $BRIF master $BRIDGE up
      else
        [[ $DEBUG_ETH_UP == yes ]] && log "interface $BRIF not present, can't add to $BRIDGE"
      fi
    done
  done
}

# function to delete bridge interface
br_down(){
  for ((j=0;j<${VLANS[$i]:-1};j++)); do
    # loop thru main bridge and bridge VLAN interfaces
    [[ $j -eq 0 ]] && BRIDGE=${BRNAME[$i]} || BRIDGE=${BRNAME[$i]}.${VLANID[$i,$j]}
    if [[ -e $SYSTEM/$BRIDGE ]]; then
      # loop thru attached interfaces in bridge
      for BRIF in $(ls --indicator-style=none $SYSTEM/$BRIDGE/brif); do
        run ip link set $BRIF nomaster
      done
      run ip link set $BRIDGE down
      run ip link del $BRIDGE
    else
      [[ $DEBUG_ETH_UP == yes ]] && log "interface $BRIDGE not present, can't take down"
    fi
  done
}

# function to create VLAN interfaces
vlan_up(){
  for PORT in ${BRNICS[$i]:-${IFNAME[$i]}}; do
    for ((j=1;j<${VLANS[$i]};j++)); do
      VLAN=${VLANID[$i,$j]}
      run ip link add link $PORT name $PORT.$VLAN type vlan id $VLAN
      [[ ${PORT:0:3} == eth ]] && set_mtu $PORT.$VLAN
      run ip link set $PORT.$VLAN up
    done
  done
}

# function to delete VLAN interfaces
vlan_down(){
  for PORT in ${BRNICS[$i]:-${IFNAME[$i]}}; do
    for VLAN in $(ls --indicator-style=none $SYSTEM | grep -Po "$PORT\.\d+"); do
      run ip link set $VLAN down
      run ip link del $VLAN
    done
  done
}

# function to create macvtap interfaces
macvtap_up(){
  PARENT=${IFNAME[$i]}
  [[ -n ${BONDNICS[$i]} ]] && PARENT=${BONDNAME[$i]}
  VTAP=vhost${PARENT//[^0-9]/}
  MAC=$(echo $(hostname)-$VTAP | md5sum | sed -r 's/^(..)(..)(..)(..)(..).*$/02:\1:\2:\3:\4:\5/')
  run ip link add link $PARENT name $VTAP address $MAC type macvtap mode bridge
  set_mtu $VTAP
  run ip link set $VTAP up
  for ((j=1;j<${VLANS[$i]:-0};j++)); do
    VLAN=${VLANID[$i,$j]}
    run ip link add link $PARENT.$VLAN name $VTAP.$VLAN address $MAC type macvtap mode bridge
    set_mtu $VTAP.$VLAN
    run ip link set $VTAP.$VLAN up
  done
}

# function to delete macvtap interfaces
macvtap_down(){
  PARENT=${IFNAME[$i]}
  [[ -n ${BONDNICS[$i]} ]] && PARENT=${BONDNAME[$i]}
  VTAP=vhost${PARENT//[^0-9]/}
  for ((j=1;j<${VLANS[$i]:-0};j++)); do
    VLAN=${VLANID[$i,$j]}
    run ip addr flush dev $VTAP.$VLAN
    run ip link set $VTAP.$VLAN down
    run ip link del $VTAP.$VLAN
  done
  run ip addr flush dev $VTAP
  run ip link set $VTAP down
  run ip link del $VTAP
}

# function to enable/disable ipv6 protocol per interface
ipv6_up(){
  [[ -d $CONF6/${IFACE/$1/$2} ]] && echo $4 >$CONF6/${IFACE/$1/$2}/disable_ipv6
  [[ -d $CONF6/${IFACE/$1/$3} ]] && echo $4 >$CONF6/${IFACE/$1/$3}/disable_ipv6
}

# function to enable/disable ipv6 assignment per interface
ipv6_ra(){
  echo $2 >$CONF6/$1/accept_ra
  echo $2 >$CONF6/$1/accept_ra_defrtr
  echo $3 >$CONF6/$1/autoconf
}

# function to enable/disable ipv6 assignment per interface
ipv6_conf(){
  [[ -d $CONF6/${IFACE/$1/$2} ]] && ipv6_ra ${IFACE/$1/$2} $4 $5
  [[ -d $CONF6/${IFACE/$1/$3} ]] && ipv6_ra ${IFACE/$1/$3} $4 $5
}

# function to enable/disable ipv6 assignment per interface
ipv6_addr(){
  [[ -d $CONF6/$IFACE ]] && ipv6_ra $IFACE $1 $2
  [[ -d $CONF6/$VHOST ]] && ipv6_ra $VHOST $1 $2
  # repeat action on related interfaces
  if [[ ${IFACE:0:4} == bond ]]; then
    ipv6_conf bond br eth $1 $2
  elif [[ ${IFACE:0:2} == br ]]; then
    ipv6_conf br bond eth $1 $2
  else
    ipv6_conf eth bond br $1 $2
  fi
  sleep 1
}

# function to assign IP address
ipaddr_up(){
  # disable IPv6 per interface when IPv4 only
  [[ $IP == ipv4 ]] && DISABLE6=1 || DISABLE6=0
  [[ -d $CONF6/$IFACE ]] && echo $DISABLE6 >$CONF6/$IFACE/disable_ipv6
  [[ -d $CONF6/$VHOST ]] && echo $DISABLE6 >$CONF6/$VHOST/disable_ipv6
  # repeat action on related interfaces
  if [[ ${IFACE:0:4} == bond ]]; then
    ipv6_up bond br eth $DISABLE6
  elif [[ ${IFACE:0:2} == br ]]; then
    ipv6_up br bond eth $DISABLE6
  else
    ipv6_up eth bond br $DISABLE6
  fi
  if [[ $DHCP == yes ]]; then
    # bring up interface using DHCP/SLAAC
    ipv6_addr 1 1
    DHCP_OPTIONS="-q -n -p -t ${DHCP_TIMEOUT[$i]:-10}"
    [[ -n $DHCP_HOSTNAME ]] && DHCP_OPTIONS="$DHCP_OPTIONS -h $DHCP_HOSTNAME"
    [[ $DHCP_KEEP_RESOLV == yes ]] && DHCP_OPTIONS="$DHCP_OPTIONS -C resolv.conf"
    [[ $DHCP_DEBUG == yes ]] && DHCP_OPTIONS="$DHCP_OPTIONS -d"
    [[ $DHCP_NOIPV4LL == yes ]] && DHCP_OPTIONS="$DHCP_OPTIONS -L"
    [[ -n $DHCP_METRIC && $DHCP_METRIC -eq 0 ]] && DHCP_OPTIONS="$DHCP_OPTIONS -G"
    [[ -n $DHCP_METRIC && $DHCP_METRIC -gt 0 ]] && DHCP_OPTIONS="$DHCP_OPTIONS -m $DHCP_METRIC"
    [[ $IP == ipv4 ]] && DHCP_OPTIONS="$DHCP_OPTIONS -4"
    [[ $IP == ipv6 ]] && DHCP_OPTIONS="$DHCP_OPTIONS -6"
    [[ $IP != ipv4 && -n $PRIV6 && -d $CONF6/$IFACE ]] && echo $PRIV6 >$CONF6/$IFACE/use_tempaddr
    if carrier_up $IFACE; then
      # interface is UP
      log "interface $IFACE is UP, polling up to 60 sec for DHCP $IP server"
      if ! run timeout 60 dhcpcd -w $DHCP_OPTIONS $IFACE; then
        log "can't obtain IP address, continue polling in background on interface $IFACE"
        run dhcpcd -b $DHCP_OPTIONS $IFACE
      fi
    else
      # interface is DOWN
      log "interface $IFACE is DOWN, polling DHCP $IP server in background"
      run dhcpcd -b $DHCP_OPTIONS $IFACE
    fi
  elif [[ $DHCP == no ]]; then
    # bring up interface using static IP address
    if carrier_up $IFACE; then STATE="UP"; else STATE="DOWN"; fi
    log "interface $IFACE is $STATE, setting static $IP address"
    ipv6_addr 0 1
    if [[ $IP != ipv6 ]]; then
      [[ $j -eq 0 ]] && ADDR=${IPADDR[$i]} || ADDR=${IPADDR[$i,$j]}
      if [[ -n $ADDR ]]; then
        [[ $j -eq 0 ]] && MASK=${NETMASK[$i]} || MASK=${NETMASK[$i,$j]}
        [[ -n $MASK ]] && run ip -4 addr add $(unzero $ADDR)/$MASK dev $IFACE metric 1
      fi
    fi
    if [[ $IP != ipv4 ]]; then
      [[ $j -eq 0 ]] && ADDR6=${IPADDR6[$i]} || ADDR6=${IPADDR6[$i,$j]}
      if [[ -n $ADDR6 ]]; then
        [[ $j -eq 0 ]] && MASK6=${NETMASK6[$i]} || MASK6=${NETMASK6[$i,$j]}
        [[ -n $MASK6 ]] && run ip -6 addr add $(unzero6 $ADDR6)/$MASK6 dev $IFACE metric 1
        [[ -n $PRIV6 && -d $CONF6/$IFACE ]] && echo 0 >$CONF6/$IFACE/use_tempaddr
      fi
    fi
  else
    # bring up interface without IP address
    ipv6_addr 0 0
    ipaddr_down
  fi
}

# function to release IP addresses and routes
ipaddr_conf(){
  if [[ -e $SYSTEM/${IFACE/$1/$2} ]]; then
    run ip -$4 addr flush dev ${IFACE/$1/$2}
    run ip -$4 route flush dev ${IFACE/$1/$2}
  fi
  if [[ -e $SYSTEM/${IFACE/$1/$3} ]]; then
    run ip -$4 addr flush dev ${IFACE/$1/$3}
    run ip -$4 route flush dev ${IFACE/$1/$3}
  fi
}

# function to release IP addresses and routes
ipaddr_flush(){
  run ip -$1 addr flush dev $IFACE
  run ip -$1 route flush dev $IFACE
  [[ -e $SYSTEM/$VHOST ]] && run ip -$1 addr flush dev $VHOST
  if [[ ${IFACE:0:4} == bond ]]; then
    ipaddr_conf bond br eth $1
  elif [[ ${IFACE:0:2} == br ]]; then
    ipaddr_conf br bond eth $1
  else
    ipaddr_conf eth bond br $1
  fi
}

# function to release IP addresses and routes
ipaddr_down(){
  if [[ $DHCP == yes ]]; then
    DHCP_OPTIONS="-q -k"
    [[ $DHCP_KEEP_RESOLV == yes ]] && DHCP_OPTIONS="$DHCP_OPTIONS -C resolv.conf"
    [[ $IP == ipv4 ]] && DHCP_OPTIONS="$DHCP_OPTIONS -4"
    [[ $IP == ipv6 ]] && DHCP_OPTIONS="$DHCP_OPTIONS -6"
    # release DHCP assigned addresses
    run dhcpcd $DHCP_OPTIONS $IFACE
    sleep 1
  fi
  # release assigned addresses and routes
  [[ $IP != ipv6 ]] && ipaddr_flush 4
  [[ $IP != ipv4 ]] && ipaddr_flush 6
}

# function to bring up network interface
if_up(){
  # set index of INTERFACE in array
  i=0
  while [[ $i -lt $MAXNICS ]]; do
    [[ ${IFNAME[$i]} == $1 ]] && break || ((i++))
  done
  # exit when interface is not found
  [[ $i -eq $MAXNICS ]] && break
  [[ -n ${BONDNICS[$i]} ]] && bond_up    # create interface as bond
  [[ -n ${VLANS[$i]} ]] && vlan_up       # create interface VLANs
  [[ -n ${BRNICS[$i]} ]] && br_up        # create interface as bridge
  [[ -z ${BRNICS[$i]} ]] && macvtap_up   # create macvtap interfaces
  # if the interface isn't in the kernel yet
  # but there's an alias for it in modules.conf
  # then it should be loaded first
  if [[ ! -e $SYSTEM/$1 ]]; then
    if modprobe -c | grep -v "^#" | grep -w "alias $1" | grep -qvw "alias $1 off"; then
      run modprobe $1
    else
      [[ $DEBUG_ETH_UP == yes ]] && log "interface $1 not present nor aliased, can't create"
    fi
  fi
  # loop thru main and VLAN interfaces
  for ((j=0;j<${VLANS[$i]:-1};j++)); do
    [[ $j -eq 0 ]] && IFACE=$1 || IFACE=$1.${VLANID[$i,$j]}
    [[ $j -eq 0 ]] && IP=${PROTOCOL[$i]:-ipv4} || IP=${PROTOCOL[$i,$j]:-ipv4}
    [[ $j -eq 0 ]] && PRIV6=${PRIVACY6[$i]} || PRIV6=${PRIVACY6[$i,$j]}
    if [[ ! -e $SYSTEM/$IFACE ]]; then
      [[ $DEBUG_ETH_UP == yes ]] && log "interface $IFACE does not exist (yet)"
      continue
    fi
    # macvtap interface name
    VHOST=vhost${IFACE//[^0-9.]}
    # set main interface
    if [[ $j -eq 0 ]]; then
      # set hardware address before interface goes up
      [[ -n ${HWADDR[$i]} ]] && run ip link set $1 addr ${HWADDR[$i]}
      set_mtu $1
    fi
    run ip link set $IFACE up
    # set interface address
    [[ $i -eq 0 && $j -eq 0 ]] && MAIN=1 || MAIN=
    if [[ $IP == ipv4 ]]; then
      [[ $j -eq 0 ]] && DHCP=${USE_DHCP[$i]} || DHCP=${USE_DHCP[$i,$j]}
      [[ $j -eq 0 ]] && DHCP_METRIC=${METRIC[$i]} || DHCP_METRIC=${METRIC[$i,$j]}
      [[ -n $MAIN ]] && DHCP_KEEP_RESOLV=$DHCP_KEEPRESOLV || DHCP_KEEP_RESOLV=yes
      ipaddr_up
    elif [[ $IP == ipv6 ]]; then
      [[ $j -eq 0 ]] && DHCP=${USE_DHCP6[$i]} || DHCP=${USE_DHCP6[$i,$j]}
      [[ $j -eq 0 ]] && DHCP_METRIC=${METRIC6[$i]} || DHCP_METRIC=${METRIC6[$i,$j]}
      [[ -n $MAIN ]] && DHCP_KEEP_RESOLV=$DHCP6_KEEPRESOLV || DHCP_KEEP_RESOLV=yes
      ipaddr_up
    else
      [[ $j -eq 0 ]] && DHCP=${USE_DHCP[$i]} || DHCP=${USE_DHCP[$i,$j]}
      [[ $j -eq 0 ]] && DHCP6=${USE_DHCP6[$i]} || DHCP6=${USE_DHCP6[$i,$j]}
      [[ $j -eq 0 ]] && DHCP_METRIC=${METRIC[$i]} || DHCP_METRIC=${METRIC[$i,$j]}
      [[ $j -eq 0 ]] && DHCP6_METRIC=${METRIC6[$i]} || DHCP6_METRIC=${METRIC6[$i,$j]}
      [[ -n $MAIN ]] && DHCP_KEEP_RESOLV=$DHCP_KEEPRESOLV || DHCP_KEEP_RESOLV=yes
      [[ -n $MAIN ]] && DHCP6_KEEP_RESOLV=$DHCP6_KEEPRESOLV || DHCP6_KEEP_RESOLV=yes
      [[ -n $DHCP_METRIC ]] && METRIC_VALUE=$DHCP_METRIC || METRIC_VALUE=0
      [[ -n $DHCP6_METRIC ]] && METRIC6_VALUE=$DHCP6_METRIC || METRIC6_VALUE=0
      IP=ipv4
      ipaddr_up
      IP=ipv6
      DHCP=$DHCP6
      DHCP_METRIC=$DHCP6_METRIC
      DHCP_KEEP_RESOLV=$DHCP6_KEEP_RESOLV
      ipaddr_up
    fi
  done
}

# function to take down network interface
if_down(){
  # set index of INTERFACE in array
  i=0
  while [[ $i -lt $MAXNICS ]]; do
    [[ ${IFNAME[$i]} == $1 ]] && break
    ((i++))
  done
  # exit when interface is not found
  [[ $i -eq $MAXNICS ]] && break
  # loop thru main and VLAN interfaces
  for ((j=0;j<${VLANS[$i]:-1};j++)); do
    [[ $j -eq 0 ]] && IFACE=$1 || IFACE=$1.${VLANID[$i,$j]}
    [[ $j -eq 0 ]] && IP=${PROTOCOL[$i]:-ipv4} || IP=${PROTOCOL[$i,$j]:-ipv4}
    # macvtap interface name
    VHOST=vhost${IFACE//[^0-9.]}
    if [[ -e $SYSTEM/$IFACE ]]; then
      # take down interface
      if [[ $IP == ipv4 ]]; then
        [[ $j -eq 0 ]] && DHCP=${USE_DHCP[$i]} || DHCP=${USE_DHCP[$i,$j]}
        [[ $j -eq 0 ]] && DHCP_KEEP_RESOLV=$DHCP_KEEPRESOLV || DHCP_KEEP_RESOLV=yes
        ipaddr_down
      elif [[ $IP == ipv6 ]]; then
        [[ $j -eq 0 ]] && DHCP=${USE_DHCP6[$i]} || DHCP=${USE_DHCP6[$i,$j]}
        [[ $j -eq 0 ]] && DHCP_KEEP_RESOLV=$DHCP6_KEEPRESOLV || DHCP_KEEP_RESOLV=yes
        ipaddr_down
      else
        [[ $j -eq 0 ]] && DHCP=${USE_DHCP[$i]} || DHCP=${USE_DHCP[$i,$j]}
        [[ $j -eq 0 ]] && DHCP6=${USE_DHCP6[$i]} || DHCP6=${USE_DHCP6[$i,$j]}
        [[ $j -eq 0 ]] && DHCP_KEEP_RESOLV=$DHCP_KEEPRESOLV || DHCP_KEEP_RESOLV=yes
        IP=ipv4
        ipaddr_down
        IP=ipv6
        DHCP=$DHCP6
        [[ $j -eq 0 ]] && DHCP_KEEP_RESOLV=$DHCP6_KEEPRESOLV || DHCP_KEEP_RESOLV=yes
        ipaddr_down
      fi
      run ip link set $IFACE down
    else
      [[ $DEBUG_ETH_UP == yes ]] && log "interface $IFACE not present, can't take down"
    fi
  done
  [[ -z ${BRNICS[$i]} ]] && macvtap_down   # delete macvtap interfaces
  [[ -n ${BRNICS[$i]} ]] && br_down        # delete interface as bridge
  [[ -n ${VLANS[$i]} ]] && vlan_down       # delete interface VLANs
  [[ -n ${BONDNICS[$i]} ]] && bond_down    # delete interface as bond
}

#####################
# GATEWAY FUNCTIONS #
#####################

# function to add default gateway per interface
gateway_up(){
  for GW in ${GATEWAY[@]}; do
    [[ -z $GW ]] && continue
    # get corresponding interface
    for x in ${!GATEWAY[@]}; do if [[ ${GATEWAY[$x]} == $GW ]]; then break; fi; done
    i=(${x/,/ })
    [[ -z ${i[1]} ]] && DEV=${IFNAME[$i]} || DEV=${IFNAME[$i]}.${VLANID[$x]}
    IP=${PROTOCOL[$x]:-ipv4}
    AD=${METRIC[$x]}
    [[ -n $AD ]] && AD="metric $AD"
    EXIST=$(ip -4 route show default via $(unzero $GW) dev $DEV | grep "$AD ")
    [[ $IP != ipv6 && -z $EXIST ]] && run ip -4 route add default via $(unzero $GW) dev $DEV $AD
  done
  for GW6 in ${GATEWAY6[@]}; do
    [[ -z $GW6 ]] && continue
    # get corresponding interface
    for x in ${!GATEWAY6[@]}; do if [[ ${GATEWAY6[$x]} == $GW6 ]]; then break; fi; done
    i=(${x/,/ })
    [[ -z ${i[1]} ]] && DEV=${IFNAME[$i]} || DEV=${IFNAME[$i]}.${VLANID[$x]}
    IP=${PROTOCOL[$x]:-ipv4}
    AD6=${METRIC6[$x]}
    [[ -n $AD6 ]] && AD6="metric $AD6"
    EXIST=$(ip -6 route show default via $(unzero6 $GW6) dev $DEV | grep "$AD6 ")
    [[ $IP != ipv4 && -z $EXIST ]] && run ip -6 route add default via $(unzero6 $GW6) dev $DEV $AD6
  done
}

# function to delete default gateway per interface
gateway_down(){
  for GW in ${GATEWAY[@]}; do
    [[ -z $GW ]] && continue
    # get corresponding interface
    for x in ${!GATEWAY[@]}; do if [[ ${GATEWAY[$x]} == $GW ]]; then break; fi; done
    i=(${x/,/ })
    [[ -z ${i[1]} ]] && DEV=${IFNAME[$i]} || DEV=${IFNAME[$i]}.${VLANID[$x]}
    IP=${PROTOCOL[$x]:-ipv4}
    EXIST=$(ip -4 route show default dev $DEV)
    [[ $IP != ipv6 && -n $EXIST ]] && run ip -4 route flush default dev $DEV
  done
  for GW6 in ${GATEWAY6[@]}; do
    [[ -z $GW6 ]] && continue
    # get corresponding interface
    for x in ${!GATEWAY6[@]}; do if [[ ${GATEWAY6[$x]} == $GW6 ]]; then break; fi; done
    i=(${x/,/ })
    [[ -z ${i[1]} ]] && DEV=${IFNAME[$i]} || DEV=${IFNAME[$i]}.${VLANID[$x]}
    IP=${PROTOCOL[$x]:-ipv4}
    EXIST=$(ip -6 route show default dev $DEV)
    [[ $IP != ipv4 && -n $EXIST ]] && run ip -6 route flush default dev $DEV
  done
}

# function to start network
start(){
  lo_up
  for INTERFACE in ${IFNAME[@]}; do
    if_up $INTERFACE
  done
  gateway_up
}

# function to stop network
stop(){
  gateway_down
  for INTERFACE in ${IFNAME[@]}; do
    if_down $INTERFACE
  done
  lo_down
}

# function to show network status
status(){
  echo "INTERFACE        STATE          INFORMATION"
  echo "========================================================================"
  [[ $1 == ip ]] && ip -brief addr || ip -brief link
}

##########################
# STATIC ROUTE FUNCTIONS #
##########################

# function to add static route
route_up(){
  [[ -n $3 ]] && METRIC="metric $3" || METRIC=
  if [[ $2 == default ]]; then
    # determine IP protocol & optional device
    [[ -n ${1##*:*} ]] && IP=-4 || IP=-6
    [[ -z ${1##*-*} ]] && DEV="dev ${1#*-}" || DEV=
    EXIST=$(ip $IP route show default via ${1%-*} $DEV | grep "$METRIC ")
    [[ -z $EXIST ]] && run ip $IP route add default via ${1%-*} $DEV $METRIC
  elif [[ -n $2 ]]; then
    # determine IP protocol & gateway syntax
    [[ -n ${2##*:*} ]] && IP=-4 || IP=-6
    [[ -e $SYSTEM/$1 ]] && GW="dev $1" || GW="via $1"
    EXIST=$(ip $IP route show $2 $GW | grep "$METRIC ")
    [[ -z $EXIST ]] && run ip $IP route add $2 $GW $METRIC
  fi
}

# function to delete static route
route_down(){
  [[ -n $3 ]] && METRIC="metric $3" || METRIC=
  if [[ $2 == default ]]; then
    # determine IP protocol & optional device
    [[ -n ${1##*:*} ]] && IP=-4 || IP=-6
    [[ -z ${1##*-*} ]] && DEV="dev ${1#*-}" || DEV=
    EXIST=$(ip $IP route show default via ${1%-*} $DEV)
    [[ -n $EXIST ]] && run ip $IP route del default via ${1%-*} $DEV $METRIC
  elif [[ -n $2 ]]; then
    # determine IP protocol & gateway syntax
    [[ -n ${2##*:*} ]] && IP=-4 || IP=-6
    [[ -e $SYSTEM/$1 ]] && GW="dev $1" || GW="via $1"
    EXIST=$(ip $IP route show $2 $GW)
    [[ -n $EXIST ]] && run ip $IP route del $2 $GW $METRIC
  fi
}

############
### MAIN ###
############

case "$1" in
start|up)
  start
  ;;
stop|down)
  stop
  ;;
restart)
  stop
  sleep 1
  start
  ;;
*_start|*_up)
  INTERFACE=$(echo $1 | cut -d_ -f1)
  if_up $INTERFACE
  gateway_up
  ;;
*_stop|*_down)
  INTERFACE=$(echo $1 | cut -d_ -f1)
  if_down $INTERFACE
  ;;
*_restart)
  INTERFACE=$(echo $1 | cut -d_ -f1)
  if_down $INTERFACE
  sleep 1
  if_up $INTERFACE
  gateway_up
  ;;
*_add)
  INTERFACE=$(echo $1 | cut -d_ -f1)
  ROUTE=$(echo $1 | cut -d_ -f2)
  METRIC=$(echo $1 | cut -d_ -f3)
  [[ $METRIC == add ]] && METRIC=
  route_up $INTERFACE $ROUTE $METRIC
  ;;
*_del)
  INTERFACE=$(echo $1 | cut -d_ -f1)
  ROUTE=$(echo $1 | cut -d_ -f2)
  METRIC=$(echo $1 | cut -d_ -f3)
  [[ $METRIC == del ]] && METRIC=
  route_down $INTERFACE $ROUTE $METRIC
  ;;
  # default is to bring up the entire network
status)
  status $2
  ;;
*)
  start
esac
exit 0

# Command examples
# rc.inet1 start                      bring up the entire network
# rc.inet1 up                         bring up the entire network
# rc.inet1 stop                       take down the entire network
# rc.inet1 down                       take down the entire network
# rc.inet1 restart                    restart the entire network
# rc.inet1 eth0_up                    bring up selected interface eth0 only
# rc.inet1 eth0_down                  take down selected interface eth0 only
# rc.inet1 eth0_restart               restart selected interface eth0 only
# rc.inet1 eth0_10.0.0.0/24_10_add    add specific route with metric 10 to interface eth0
# rc.inet1 10.0.0.1_default_add       add default route to gateway 10.0.0.1 with metric 1
# rc.inet1 eth0_10.0.0.0/24_1_del     delete specific route & metric from interface eth0
# rc.inet1 10.0.0.1_default_del       delete default route from gateway 10.0.0.1
# rc.inet1 status                     show link status
# rc.inet1 status ip                  show ip status
root@Docker:~# 


as a rewrite/re flash my vhost0 becoem shime-br0 and its intresting on how unraid is doing werid thing like just adding kepresolv yes removes shimbr0 and vhost0 but breks other netwrok as no there is no sysctl made etc etc...

/etc/rc.d/rc.inet1.conf
 

Edited by bmartino1
Data

  • Author
5 minutes ago, bmartino1 said:

As that was what I had before a recent tailscale update and before the resolv.conf broke broke..

image.png.d01e928b4accf13ae0556f2d8443dd28.png
 My issues is that even with the resolv.conf being overwritten per tailscale and unraid rcnet1 conf is writing to resolv.conf.head as it should... head is not being respected when resolv.conf is being called by other services.

This is a bigger underlying issues that started at the plugins health check and how the health check would flag tasilscale and shut down or atempt to restart and at the restart a process over causing a loop of overwrites...

resolv.conf.head/tail means nothing to the actual DNS resolution. It's just used by the network scripts to help control when DHCP is providing DNS vs. when they're defined in the config.

 

resolv.conf is authoritative. It always has been.

Edited by EDACerton

5 minutes ago, EDACerton said:

resolv.conf.head/tail means nothing to the actual DNS resolution. It's just used by the network scripts to help control when DHCP is providing DNS vs. when they're defined in the config.

 

resolv.conf is authoritative. It always has been.

unless you have the kepresolv yes option then it wil regenerate the resolv.conf at a rc network restart pulling head and tail together...

resolv.conf.head > resolv.conf > resolv.conf.tail

become resolv.conf

I went deep into slackware and uraids configuration over this...
http://www.slackware.com/config/network.php

However, No I did not eidt this config file... I had a simpler script and setup to fix this...

Edited by bmartino1
typo - Data

  • Author
1 minute ago, bmartino1 said:

unless you have the kepresolv yes option then it wil regenerate the resolv.conf at a rc network restart pulling head and tail togeter...

 

I'm not going to keep discussing it.

 

The behavior of the plugin is correct. So is the behavior of Tailscale. If you choose to create a complicated setup, then you're responsible to understand the implications of those design choices.

 

If you think there is a better way to make the system behave, you're welcome to submit a pull request on Github :)

Just now, EDACerton said:

I'm not going to keep discussing it.

 

The behavior of the plugin is correct. So is the behavior of Tailscale. If you choose to create a complicated setup, then you're responsible to understand the implications of those design choices.

 

If you think there is a better way to make the system behave, you're welcome to submit a pull request on Github :)

Please PM me the Github as I have poked around and may have one to assist.

IMO, I still maintain misconfiguration is present here. What's going on is outside the scope of the plugin and this thread, IMO.

 

As they say, you're out over your skis.

 

This is not a knock whatsoever on your experience nor expertise, which is surely greater than mine, but it's not insignificant that no one else seems to be seeing such behavior, at the very least not complaining about issues that can be traced back to what you're seeing being the root cause.

 

Hopefully by communicating through code on Github what you're seeing, or rather expecting, can be better described. I've been trying to follow along out of sheer curiosity.

 

In the meantime:

 

Tailscale plugin github: https://github.com/dkaser/unraid-tailscale

 

Tailscale open source code base github: https://github.com/tailscale/tailscale

 

My approach to Tailscale is KIS - keep it simple. And thus far it's working well with different machines spread across different subnets and locations, all behaving harmoniously. Not withstanding some hiccups with updates that necessitated resetting and re-establishing the tailnet.

 

 

I have a relatively simple question that might have a deeper complicated answer - but starting with the minimum here in case there's something silly I'm missing in configuration.

Basically - I'm facing a problem when trying to use the plugin integration for certain VMs running on Unraid. To be specific - I have some game servers running in containers that I connect to a VPS that reverse proxies traffic to them (through Tailscale). These all work great for the most part. Now, I'm trying to turn on an exit node for these as well so the source IP starts to show as the VPS instead of my home IP network and so it fixes some issues with server browsers not working but direct connection working. But when I configure the containers to actually use the exit node, suddenly they are unable to communicate with the Steam API and certain parts of the internet (though the gameplay itself still works on some of these servers). My early reading indicates there might be some MTU issues at play here - but I'm not really sure. What would cause the containers routed through an exit node to be unable to communicate with Steam APIs? It's as if they are losing some internet connectivity when routed through the exit node.

In Terms of steam:

-this is a issues of tcp vs udp over the vpn. steams api uses udp muticast.

 

Quote

There aren't any really significant differences from an end-user perspective. Steam usually defaults to UDP mostly for kinda historical reasons; games use UDP because the TCP protocol adds latency, and Steam ended up using the same protocol as Valve's games.

The only real difference technically is that UDP is connectionless and TCP has connections, so in UDP mode Steam implements connections itself on top of UDP, and with TCP they're built-in. If there's a difference in your ability to login it implies some sort of networking problem between you and Steam that's treating TCP and UDP traffic differently, which is not too unlikely; TCP is a lot more common (HTTP is over TCP, for instance) so you might not ordinarily notice bad handling of UDP datagrams.

you can try running steam witht the -tcp option (this can increas lag and cause higher ping though...

Windwos Example
"C:\Program Files (x86)\Steam\Steam.exe -tcp"

 

image.thumb.png.1e83e0057c03064734314ee87e0ef81b.png

Edited by bmartino1
Data

  • Author
3 hours ago, noideas4thisname said:

I have a relatively simple question that might have a deeper complicated answer - but starting with the minimum here in case there's something silly I'm missing in configuration.

Basically - I'm facing a problem when trying to use the plugin integration for certain VMs running on Unraid. To be specific - I have some game servers running in containers that I connect to a VPS that reverse proxies traffic to them (through Tailscale). These all work great for the most part. Now, I'm trying to turn on an exit node for these as well so the source IP starts to show as the VPS instead of my home IP network and so it fixes some issues with server browsers not working but direct connection working. But when I configure the containers to actually use the exit node, suddenly they are unable to communicate with the Steam API and certain parts of the internet (though the gameplay itself still works on some of these servers). My early reading indicates there might be some MTU issues at play here - but I'm not really sure. What would cause the containers routed through an exit node to be unable to communicate with Steam APIs? It's as if they are losing some internet connectivity when routed through the exit node.

Ignore everything about TCP/UDP above, exit nodes can handle UDP just fine (and I don't know where the idea "TCP is a lot more common... so you might not ordinarily notice bad handling of UDP datagrams." came from... there's lots of things wrong with that statement).

 

It's hard to say for certain what's causing the issue in your setup. My initial hunch would be that it's related to DNS -- if your containers are set to use a local DNS server, but you turn on exit node, they won't be able to access the server. This could be remedied by adding something like this to the container's extra params:

 

--dns=8.8.8.8

 

Hi!

 

I am trying out the Tailscale-route to see if it would fit my needs but I cant have it work the way I want it to:

- Single Unraid-host with Tailscale-plugin.

- Tailscale-account with Mullvad-plugin activated.

 

I would like to have Mullvad as exit node for the entire Unraid-platform. My intention is this helping my services on the Unraid server communicating with eachother while all outbound traffic is routed through Mullvad for privacy.

 

Am I thinking about this the right way? Because what I fail to do is activating Mullvad as exit node in the Tailscale plugin? The "Exit Node" part is not clickable so None is the only choice?

  • Author
12 hours ago, raeserfisk said:

Hi!

 

I am trying out the Tailscale-route to see if it would fit my needs but I cant have it work the way I want it to:

- Single Unraid-host with Tailscale-plugin.

- Tailscale-account with Mullvad-plugin activated.

 

I would like to have Mullvad as exit node for the entire Unraid-platform. My intention is this helping my services on the Unraid server communicating with eachother while all outbound traffic is routed through Mullvad for privacy.

 

Am I thinking about this the right way? Because what I fail to do is activating Mullvad as exit node in the Tailscale plugin? The "Exit Node" part is not clickable so None is the only choice?

Make sure that you're switching to edit mode for the GUI:

https://selfhosters.net/remote/tailscale/advanced/#advanced-tailscale-settings

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.