Linux-шлюз на Debian/Ubuntu: маршрутизация, NAT и nftables
Практический пример Linux-шлюза на Debian/Ubuntu. Схема: WAN-интерфейс eth0, LAN-интерфейс eth1, LAN 192.168.10.0/24, адрес шлюза 192.168.10.1.
1. Проверка интерфейсов и маршрутов
ip -br addr
ip route
resolvectl status 2>/dev/null || cat /etc/resolv.conf
ping -c 3 1.1.1.1
getent hosts example.com2. Установка nftables
apt update
apt install nftables tcpdump conntrack
systemctl enable nftables
nft --version3. Резервная копия текущей сети
mkdir -p /root/gateway-backup
ip addr show > /root/gateway-backup/ip-addr.txt
ip route show table all > /root/gateway-backup/ip-route.txt
nft list ruleset > /root/gateway-backup/nftables-before.conf 2>/dev/null || true
cp -a /etc/network /root/gateway-backup/ 2>/dev/null || true
cp -a /etc/netplan /root/gateway-backup/ 2>/dev/null || true4. Включение маршрутизации
cat > /etc/sysctl.d/99-gateway.conf <<'EOF'
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
EOF
sysctl --system
sysctl net.ipv4.ip_forward5. Настройка nftables и NAT
cat > /etc/nftables.conf <<'EOF'
flush ruleset
define WAN = eth0
define LAN = eth1
define LAN_NET = 192.168.10.0/24
table inet filter {
chain input {
type filter hook input priority 0;
policy drop;
ct state established,related accept
iifname "lo" accept
iifname $LAN ip saddr $LAN_NET tcp dport 22 accept
iifname $LAN ip saddr $LAN_NET icmp type echo-request accept
}
chain forward {
type filter hook forward priority 0;
policy drop;
ct state established,related accept
iifname $LAN oifname $WAN ip saddr $LAN_NET accept
}
chain output {
type filter hook output priority 0;
policy accept;
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority 100;
oifname $WAN ip saddr $LAN_NET masquerade
}
}
EOF
nft -c -f /etc/nftables.conf
systemctl restart nftables
nft list ruleset6. Настройка LAN-адреса
Пример для systemd-networkd:
cat > /etc/systemd/network/20-lan.network <<'EOF'
[Match]
Name=eth1
[Network]
Address=192.168.10.1/24
EOF
systemctl restart systemd-networkd
ip -br addr show eth17. Проверка с клиента
ip addr
ip route
ping -c 3 192.168.10.1
ping -c 3 1.1.1.1
getent hosts example.com
curl -4 https://ifconfig.me8. Проверка на шлюзе
sysctl net.ipv4.ip_forward
nft list ruleset
conntrack -L | head
tcpdump -ni eth1 host 192.168.10.100
tcpdump -ni eth0 host 1.1.1.19. Диагностика
journalctl -u nftables -b --no-pager
journalctl -u systemd-networkd -b --no-pager
ip route get 1.1.1.1
nft monitor trace
ss -lntup10. Rollback
systemctl stop nftables
nft flush ruleset
rm -f /etc/sysctl.d/99-gateway.conf
sysctl --system
cp /root/gateway-backup/nftables-before.conf /etc/nftables.conf
nft -f /etc/nftables.confКритерий успеха: клиент получает адрес из LAN, видит шлюз 192.168.10.1, выходит в интернет по IP и DNS, а незапрошенные соединения с WAN не проходят.