In the interest of reducing variables to debug, I went with a straight static IP and ran these commands:
sudo nmcli connection add type ethernet ifname enp41s0 con-name testing ipv4.method manual ipv4.addresses 10.11.1.3/24
sudo nmcli connection modify testing ipv4.gateway 10.11.1.1
sudo nmcli connection up testing
Both flavours of ping succeed:
ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=111 time=20.7 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=111 time=20.6 ms
and
ping -I 10.11.1.3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.11.1.3 : 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=111 time=20.6 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=111 time=19.8 ms
This just hangs:
traceroute 8.8.8.8 -s 10.11.1.3
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 _gateway (10.11.1.1) 0.144 ms 0.091 ms 0.101 ms
The IP address does show up running ip a:
inet 10.11.1.3/24 brd 10.11.1.255 scope global noprefixroute enp41s0
Running dig @8.8.8.8 google.com just hangs.
The only NAT masquerade rule I have is this:
38 ;;; WAN Outbound
chain=srcnat action=masquerade out-interface=sfp28-1 log=no
log-prefix=""
These are my filter rules:
Flags: X - DISABLED, I - INVALID; D - DYNAMIC
0 chain=forward action=accept connection-state=established,related
1 chain=forward action=accept in-interface=wg-coretransit log=no
log-prefix=""
2 chain=forward action=accept in-interface=bridge1
out-interface=wg-coretransit log=no log-prefix=""
3 ;;; accept established,related,untracked
chain=input action=accept
connection-state=established,related,untracked
4 ;;; drop invalid
chain=input action=drop connection-state=invalid
5 ;;; accept ICMP
chain=input action=accept protocol=icmp in-interface=sfp28-1
6 ;;; drop webfig
chain=input action=drop protocol=tcp dst-port=80,443 log=no
log-prefix=""
7 ;;; block everything else
chain=input action=drop in-interface=sfp28-1
Why would manually/statically assigning an IP address fail to make it out to the internet when DHCP works correctly?