JGrana
Very Senior Member
I'm sure your version would have been much cleaner ;-)It wasn't implemented by me, it was done by either Broadcom or Asus.
I'm sure your version would have been much cleaner ;-)It wasn't implemented by me, it was done by either Broadcom or Asus.
So today my AXE11000 has returned to poor speeds, even with flow cache disabled.I thought you would have better speeds with this router, atleast 400-600Mb/s. You're not running the speed-test on the router, right?
Sorry, no good solution to this one. Wireguard is not compatible with our router hw-accelleration, so it needs to be disabled one way or the other.
1. Convince @RMerlin to add the 0x01/0x7 fwmark to disable hw-accelleration on newer ax model firmwares, just as AC86U and AX88U has (only when TrendMicro is not used?).
2. Run wireguard on rpi instead.
3. Use openVPN instead
Did you upgrade firmware or anything that could have caused this? Do you see a ton of blog mcast error in the log when speed is low and fc disabled?It was working well up until today
Nope, did not upgrade firmware nor many any significant changes. Went to bed with it working and woke up to it not working and been battling it all day. It was working great.Did you upgrade firmware or anything that could have caused this? Do you see a ton of blog mcast error in the log when speed is low and fc disabled?
Hmm, doesnt appear that Asus has any special treatment for this router:Nope, did not upgrade firmware nor many any significant changes. Went to bed with it working and woke up to it not working and been battling it all day. It was working great.
I do not see anything about blog or mcast errors
heres the last 5 minutes of logs after I connected to the VPN
Side question, where do the logs live on the disk?
fc status
fc disable
top
and see if something is hogging your resources.Hmm, doesnt appear that Asus has any special treatment for this router:
https://github.com/RMerl/asuswrt-merlin.ng/blob/master/release/src/router/rc/wireguard.c
however, maybee for some reason something is resetting the flow cache on your system. Check flow cache status by executing at the prompt (not in wgm):
Code:fc status
and to turn it off manually
Code:fc disable
test to turn it off manually and see if it makes a difference and if your speed drops again check the syslog if anything got restarted.
Also check your processor usage, is it constantly at 100% check withtop
and see if something is hogging your resources.
Disconnect all clients to make sure there is nothing saturating your line (virus, malware or just some persistent app)
fc status
Flow Timer Interval = 10000 millisecs
Pkt-HW Activate Deferral rate = 1
Pkt-HW Idle Deactivate = 0
Pkt-SW Activate Deferral count = 0
Flow Low Pkt Rate = 10
Acceleration Mode: <L2 & L3>
MCast Learning <Disabled>
MCast Acceleration IPv4<Enabled> IPv6<Enabled>
IPv6 Learning <Enabled>
GRE Learning <Enabled>
4o6 Fragmentation <Enabled>
TCP Ack Prioritization <Enabled>
HW Acceleration <Enabled>
Notify Processing Mode <Hybrid>
OVS Flow Learning <Disabled>
Flow Learning Disabled : Max<16383>, Active<11>, Cummulative [ 383 - 372 ]
fc disable
Broadcom Packet Flow Cache learning via BLOG disabled.
#!/bin/bash
# -e option instructs bash to immediately exit if any command [1] has a non-zero exit status
# we don't want to continue execution of the script if something is broken. This may potentially
# complicate IP routing table entries which may require manual intervention to fix thereafter.
set -e
# Declare global variables here
# Modify the variables in this section in conformity with the naming convention of your Mullvad
# configuration files in /etc/wireguard
mullvadVpnInterfaceRegex="wg.*"
wireguardConfigurationDirectory="/opt/etc/wireguard.d/"
connectedWireguardConfiguration=""
# A method to retrieve the current connected Mullvad interface.
checkMullvadConnectivity() {
# Check if Mullvad VPN is already connected.
connectedWireguardConfiguration=$(wg| grep wg | grep -v wg21 | cut -c 12-16)
# Return an arbitrary integer value | This value is not checked right now
return 0
}
case $1 in
stop)
STOP="true"
;;
status)
curl -sS https://am.i.mullvad.net/connected
exit
;;
checkIP)
# This shell script is used to keep a track of which server the VPN is current connected to
# in a format that is easily readable. Let's face it, mullvad-lv1 isn\'t very descriptive.
# This script on its own is a little useless but particularly useful when queried from an
# external system.
# A good use case to use this script with is in the shortcuts iOS application or with IFTTT to query the
# client that runs the VPN to check which server it is connected to. My previous implementation
# was to keep this logic on the shortcuts application but realised that executing all curl commands
# may take sometime and I did not always have the patience to wait for a response.
# Retrieve the current status of the VPN client. The general output of this is
# You are connected to Mullvad (server us107-wireguard). Your IP address is 86.106.121.248
# We strip out the sections we don't require and use the rest.
connectedStatus=$(curl --silent https://am.i.mullvad.net/connected)
if [[ "$connectedStatus" == *"("* ]]; then
status=$(echo $connectedStatus | cut -d "(" -f 1 | sed 's/ *$//g')
ip=$(echo $connectedStatus | cut -d "." -f 2-5 | sed 's/ *$//g')
# This returns a country name.
country=$(curl --silent https://am.i.mullvad.net/country | sed 's/ *$//g')
# This returns a city name
city=$(curl --silent https://am.i.mullvad.net/city | sed 's/ *$//g')
echo "$status server in $city, $country.$ip" #1> /tmp/.checkip
else
echo "$(echo $connectedStatus | cut -d "." -f 1 | sed 's/ *$//g')." #1> /tmp/.checkip
fi
exit
;;
start)
STOP="false"
;;
restart)
STOP="false"
;;
*)
echo "Usage: $0 {status|stop|start [policy]|restart [policy]}"
exit
;;
esac
checkMullvadConnectivity
# Debug log
# echo " ip addr command returned $connectedWireguardConfiguration"
# Extract the wireguard configuration list that is available in /etc/wireguard
# newWireguardConfigurationList=$(ls $wireguardConfigurationDirectory | grep --word-regexp "$mullvadVpnInterfaceRegex")
if [ -z "$(ls $wireguardConfigurationDirectory | grep $mullvadVpnInterfaceRegex | grep .conf$ | grep -v "wg21.conf")" ]; then
echo "Wireguard Configuration files are missing. Expecting filed matching regex $mullvadVpnInterfaceRegex in $wireguardConfigurationDirectory. Exiting."
fi
if [ "$STOP" == "true" ];then
if [[ -n "$connectedWireguardConfiguration" ]]; then
echo "Disconnecting from $connectedWireguardConfiguration"
echo "Stopping $connectedWireguardConfiguration"
/opt/bin/wg_manager stop $interface
# Satisfies this condition if a connected interface was not found.
#elif [[ -z "$connectedWireguardConfiguration" ]]; then
#echo "Not currently connected to any VPN."
fi
curl -sS https://am.i.mullvad.net/connected
exit
else
while : ; do
if [[ -n "$connectedWireguardConfiguration" ]]; then
fileCount=$(ls $wireguardConfigurationDirectory | grep -v "$connectedWireguardConfiguration".conf$ | grep .conf$ | grep -v "wg21.conf" | grep $mullvadVpnInterfaceRegex | wc -l)
if [ "$fileCount" == 0 ];then
echo "Not enough config files to randomize. Reconnecting to $connectedWireguardConfiguration"
else
newWireguardConfigurationList=$(ls $wireguardConfigurationDirectory | grep -v "$connectedWireguardConfiguration".conf$ | grep .conf$ | grep -v "wg21.conf" | grep $mullvadVpnInterfaceRegex)
newWireguardConfigurationListCount=$(ls $wireguardConfigurationDirectory | grep -v "$connectedWireguardConfiguration".conf$ | grep .conf$ | grep -v "wg21.conf" | grep $mullvadVpnInterfaceRegex | wc -l)
fi
elif [[ -z "$connectedWireguardConfiguration" ]]; then
newWireguardConfigurationList=$(ls $wireguardConfigurationDirectory | grep $mullvadVpnInterfaceRegex | grep .conf$ | grep -v "wg21.conf")
newWireguardConfigurationListCount=$(ls $wireguardConfigurationDirectory | grep $mullvadVpnInterfaceRegex | grep .conf$ | grep -v "wg21.conf" | wc -l)
fi
# Pick a wireguard interface at random to connect to next
if [ "$fileCount" == 0 ]; then
newWireguardConfiguration=$connectedWireguardConfiguration
else
random=$(awk -v count="$newWireguardConfigurationListCount" 'BEGIN { srand(); print int( rand() * (count-1)+1);}')
newWireguardConfiguration=$(echo "$newWireguardConfigurationList" | awk -v random="$random" 'FNR==random {print $1}' | grep -oE 'wg[0-9]{2,3}')
fi
# Satisfies this condition if a connected interface was found.
if [[ -n "$connectedWireguardConfiguration" ]]; then
echo "System is currently connected to $connectedWireguardConfiguration and will reconnect to $newWireguardConfiguration"
echo "Stopping $connectedWireguardConfiguration"
/opt/bin/wg_manager stop $connectedWireguardConfiguration
sleep 5
/opt/bin/wg_manager start $newWireguardConfiguration $2
# Satisfies this condition if a connected interface was not found.
elif [[ -z "$connectedWireguardConfiguration" ]]; then
echo "System will attempt to connect to $newWireguardConfiguration"
/opt/bin/wg_manager start $newWireguardConfiguration $2
fi
sleep 2
checkMullvadConnectivity
if [[ -n "$connectedWireguardConfiguration" ]]; then
echo "Connected to $connectedWireguardConfiguration"
elif [[ -z "$connectedWireguardConfiguration" ]]; then
echo "You are not connected."
fi
IP=$(curl -sS https://am.i.mullvad.net/connected)
DELIMITER=':'
if [[ "$IP" == *"$DELIMITER"* ]]; then
echo "$IP"
echo "Connected to IPV6. Reconnecting."
checkMullvadConnectivity
# Debug log
# echo " ip addr command returned $connectedWireguardConfiguration"
# Extract the wireguard configuration list that is available in /etc/wireguard
# newWireguardConfigurationList=$(ls $wireguardConfigurationDirectory | grep --word-regexp "$mullvadVpnInterfaceRegex")
#if [[ -n "$connectedWireguardConfiguration" ]]; then
# newWireguardConfigurationList=$(ls $wireguardConfigurationDirectory | grep -v "$connectedWireguardConfiguration".conf$ | grep --word-regexp "$mullvadVpnInterfaceRegex" | grep conf$)
#elif [[ -z "$connectedWireguardConfiguration" ]]; then
# newWireguardConfigurationList=$(ls $wireguardConfigurationDirectory | grep --word-regexp "$mullvadVpnInterfaceRegex" | grep conf$)
#fi
else
curl -sS https://am.i.mullvad.net/connected
exit
fi
[[ "$IP" == *"$DELIMITER"* ]] || break
done
fi
I think this sounds like the most reasonable cause. you could also check your connection speed to your LAN via your server to see if it is really your router affected by Wireguard or if it is simply an external issue.Edit: I am currently investigating whether its an issue with the Mullvad servers in my city Toronto, as it seems to happen also on the Android and Windows app- but only in Toronto. Seems like other cities like Montreal are working faster in Windows and Android. However Ive been battling this for about 12 hours today so will try it again tomorrow.
Can you please elaborate how to test that? ThanksI think this sounds like the most reasonable cause. you could also check your connection speed to your LAN via your server to see if it is really your router affected by Wireguard or if it is simply an external issue.
Ive never done it since I'm not running any active server (Im behind CGNAT). but as we are not really interested in exact full speed, we could make it easier, like any of:Can you please elaborate how to test that? Thanks
Whoho!!! And it's not even Christmas.Not sure if any of this will affect you, but just in case:
- MASQUERADE support for IPv6 should be now available on all router models that Asus includes Wireguard or OpenVPN support, starting with 386.7
- I have backported IPV6 DNAT support for all HND models. This will be included in 386.7, and will allow me to also implement DNSFilter on the IPv6 side of things.
The MASQUERADE backport is from Asus (they use it for both their OpenVPN and Wireguard implementation). The DNAT backport is mine (I needed it for DNSFilter).Whoho!!! And it's not even Christmas.
Great work, cant wait for the stable release to try it out!
Really appreciate your work on this! We (Wireguard/wgm community) have been enjoying ipv6 MASQUARADE from ASUS since 386.4 where it first appeared but have sorely been missing the ipv6 DNAT for dns redirecting policy clients (altough some of us have felt adventurous and installed Entware iptables and used ipv6 DNAT despite the risks). Now I can finally kick out Entware iptables and benefit from a more integrated system.The MASQUERADE backport is from Asus (they use it for both their OpenVPN and Wireguard implementation). The DNAT backport is mine (I needed it for DNSFilter).
Simple way to determine if the target system support it or not (without having to check both the platform and the firmware version):Really appreciate your work on this! We (Wireguard/wgm community) have been enjoying ipv6 MASQUARADE from ASUS since 386.4 where it first appeared but have sorely been missing the ipv6 DNAT for dns redirecting policy clients (altough some of us have felt adventurous and installed Entware iptables and used ipv6 DNAT despite the risks). Now I can finally kick out Entware iptables and benefit from a more integrated system.
cat /proc/net/ip6_tables_targets | grep DNAT
I'm guessing your entire network will all use OVPN public DNS server 46.227.67.134? but your device PC will use it via WAN and the rest will use it via VPN.Heya!
Running
View attachment 41880
View attachment 41879
My PC is getting IP and DNS from ISP. All other devices get IP from VPN provider but the DNS is still from ISP. DNS on devices is set to router 192.168.1.1. Suggestions?
E:Option ==> peer wg11 rule add vpn 192.168.1.1/24 comment All LAN to VPN
E:Option ==> peer wg11 rule add wan 192.168.1.38 comment Except This Computer
E:Option ==> peer wg11 rule add vpn 192.168.1.128/25 comment 128-255
E:Option ==> peer wg11 rule add vpn 192.168.1.64/26 comment 64-127
E:Option ==> peer wg11 rule add vpn 192.168.1.32/27 comment 32-63
E:Option ==> peer wg11 dns=<Your wg11 .conf DNS here>
But the issue is tht my VPN clients doesn't get the DNS from my VPN provider. Instead they DNS from ISP. Doesn't matter what I put in peer wg11 dns=I'm guessing your entire network will all use OVPN public DNS server 46.227.67.134? but your device PC will use it via WAN and the rest will use it via VPN.
This is natural behaviour as wgm is redirecting DNS for VPN policy clients (192.168.1.0/24) but not for WAN policy clients. as your rule "RestUseVPN" includes your "PC" rule this will be the outcome.
your problem, and a proposed solution, is found half way down this section:
https://github.com/ZebMcKayhan/WireguardManager#create-rules-in-wgm
A typical use case could be that we want the entire network to go out VPN except a single computer:
Code:E:Option ==> peer wg11 rule add vpn 192.168.1.1/24 comment All LAN to VPN E:Option ==> peer wg11 rule add wan 192.168.1.38 comment Except This Computer
this works just fine, with one exception. sadly this computer will still use wg DNS (because vpn rules gets a dns redirection rule but wan rules does not). So in this case it could be better to divide your network in 2 parts, like restrict the DHCP to only give out ip adresses 192.168.1.32 - 192.168.1.255 and manually assign the numbers below 32 and create rules for these ranges separately: 192.168.1.0/27 #0 - 31 (no rule needed for this) 192.168.1.32/27 #32-63 (wgm VPN rule) 192.168.1.64/26 #64-127 (wgm VPN rule) 192.168.1.128/25 #128-255 (wgm VPN rule)
so in wgm:
Code:E:Option ==> peer wg11 rule add vpn 192.168.1.128/25 comment 128-255 E:Option ==> peer wg11 rule add vpn 192.168.1.64/26 comment 64-127 E:Option ==> peer wg11 rule add vpn 192.168.1.32/27 comment 32-63
no rules are needed for the 0-31 range since the above rules dont cover them so it will naturally go out WAN. now, every computer you manually assign an ip in the range 192.168.1.2 - 192.168.1.31 will go out WAN and the rest will go out VPN.
Then you could change wg11 DNS to something more private, like the one from your Wireguard Config file:
Code:E:Option ==> peer wg11 dns=<Your wg11 .conf DNS here>
After this your WAN clients will use DNS from routers WAN setting via dnsmasq, via WAN just as without Wireguard but your VPN clients will be redirected to the dns you put in wgm wg11 via VPN.
hope this answers your question.
ok, hmm. what firmware are you on? have this been working differently before? Have you been changing the DNSFilter in the GUI and the rules in the iptables ended up in the wrong order maybe?But the issue is tht my VPN clients doesn't get the DNS from my VPN provider. Instead they DNS from ISP. Doesn't matter what I put in peer wg11 dns=
Running dnsleaktest on a VPN client I have DNS 217.215.65.141 and that is from my ISP.
iptables -nvL PREROUTING -t nat
iptables -nvL WGDNS1 -t nat
FW 386.5_2ok, hmm. what firmware are you on? have this been working differently before? Have you been changing the DNSFilter in the GUI and the rules in the iptables ended up in the wrong order maybe?
whats your output of:
Code:iptables -nvL PREROUTING -t nat
and
Code:iptables -nvL WGDNS1 -t nat
mask any sensitive data if there should be any.
Welcome To SNBForums
SNBForums is a community for anyone who wants to learn about or discuss the latest in wireless routers, network storage and the ins and outs of building and maintaining a small network.
If you'd like to post a question, simply register and have at it!
While you're at it, please check out SmallNetBuilder for product reviews and our famous Router Charts, Ranker and plenty more!