CentOS

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.com

2. Установка nftables

apt update
apt install nftables tcpdump conntrack
systemctl enable nftables
nft --version

3. Резервная копия текущей сети

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 || true

4. Включение маршрутизации

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_forward

5. Настройка 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 ruleset

6. Настройка 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 eth1

7. Проверка с клиента

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.me

8. Проверка на шлюзе

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.1

9. Диагностика

journalctl -u nftables -b --no-pager
journalctl -u systemd-networkd -b --no-pager
ip route get 1.1.1.1
nft monitor trace
ss -lntup

10. 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 не проходят.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *