Скрипт для автоустановки AmneziaWG 2.0 на Ubuntu

@bivlked, спасибо за скрипт. Поставил вместо стандартной установки amneziaVPN, с конфигом из которой почему-то не хотел работать throne. С вашим завелось.
Так как у меня уже стоит настроенный xray для VLESS с маршрутизацией и нужными настройками DNS, то решил не дублировать всё это для AWG, а сделать проброс трафика из интерфейса AWG в xray через механизм tproxy, и рулить всем в конфиге xray. Поделюсь конфигурацией, может кому-то пригодится:

  1. Создать файл /etc/nftables.conf:
#!/usr/sbin/nft -f
define RESERVED_IP = {
    10.0.0.0/8,
    100.64.0.0/10,
    127.0.0.0/8,
    169.254.0.0/16,
    172.16.0.0/12,
    192.0.0.0/24,
    224.0.0.0/4,
    240.0.0.0/4,
    255.255.255.255/32
}

table ip xray {
    chain prerouting {
        type filter hook prerouting priority mangle; policy accept;
        iifname != "awg0" return
        fib daddr type local return
        ip daddr $RESERVED_IP return
        ip protocol tcp tproxy to 127.0.0.1:44444 meta mark set 1
        ip protocol udp tproxy to 127.0.0.1:44444 meta mark set 1
    }
}
  1. В файле /etc/amnezia/amneziawg/awg0.conf заменить PostUp и PostDown на строки ниже (также заменить eth0 на свой интерфейс):
...
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -t mangle -A FORWARD -o %i -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1240; iptables -t mangle -A FORWARD -i %i -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1240
PostUp = nft -f /etc/nftables.conf
PostUp = ip rule add fwmark 1 table 100
PostUp = ip route add local default dev lo table 100
...
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -t mangle -D FORWARD -o %i -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1240; iptables -t mangle -D FORWARD -i %i -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1240
PostDown = nft delete table ip xray
PostDown = ip rule del fwmark 1 table 100
PostDown = ip route del local default dev lo table 100
...
  1. В xray создать inbound:
{
	"tag": "tproxy-in",
	"port": 44444,
	"protocol": "dokodemo-door",
	"settings": {
		"network": "tcp,udp",
		"followRedirect": true
	},
	"streamSettings": {
		"sockopt": {
			"tproxy": "tproxy"
		}
	}
}

Опционально: для перехвата DNS добавить:

  • в routing.rules:
        {
          "type": "field",
          "inboundTag": ["tproxy-in"],
          "port": 53,
          "outboundTag": "dns-out"
        }
  • в outbounds:
      {
        "tag": "dns-out",
        "protocol": "dns"
      }
  1. Если используется ufw, то добавить в файл /etc/ufw/before.rules после строки # End required lines:
-A ufw-before-input -i awg0 -m mark --mark 0x1 -j ACCEPT

Применить:

ufw reload
systemctl restart xray
systemctl restart awg-quick@awg0

Опционально можно теперь почистить правила и настройки, связанные с форвардингом, но они вроде и не мешают.
Проверял на окружении: Ubuntu 26.04, amneziawg-installer v5.18.3, Xray 26.3.27

parfit, спасибо на добром слове, и что всё целиком расписали. Схема логичная: раз xray уже стоит и держит на себе маршрутизацию с DNS, дублировать это на стороне AWG незачем - проще завернуть в него весь клиентский трафик через tproxy и держать правила в одном месте. MSS-кламп, смотрю, оставили - он тут и нужен, трафик всё равно идёт через туннель.

Про throne: установщик отдаёт обычный конфиг AmneziaWG 2.0, .conf и vpn:// ссылку, без обёртки под приложение Amnezia. Поэтому его понимают и сторонние клиенты, тот же throne, а не только родное приложение. Почему конфиг из самого приложения у вас не пошёл, точно не скажу, но с обычным конфигом сюрпризов меньше.

У меня в установщике деление трафика сделано на самом сервере (каскад), у вас через xray - обе схемы рабочие, просто под разные ситуации. Спасибо, что поделились - у кого xray уже настроен, точно пригодится.