У меня есть ПК-1 с двумя аплинками (модем1 и модем2) и LAN на интерфейсе eth0:
# ip -c -brief addr
lo UNKNOWN 127.0.0.1/8
eth0 UP 192.168.0.7/24
modem2 UNKNOWN 10.73.15.79/27
modem1 UNKNOWN 10.176.229.31/26
(состояние «неизвестно» для модема 1 и модема 2 кажется нормальным).
Я настроил маршрутизацию следующим образом:
# ip -c rule
0: from all lookup local
32764: from 10.73.15.79 lookup 2
32765: from 10.176.229.31 lookup 1
32766: from all lookup main
32767: from all lookup default
# ip -c route ls table main
default
nexthop via 10.176.229.32 dev modem1 weight 1
nexthop via 10.73.15.80 dev modem2 weight 1
10.73.15.64/27 dev modem2 proto kernel scope link src 10.73.15.79
10.176.229.0/26 dev modem1 proto kernel scope link src 10.176.229.31
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.7
# ip -c route ls table 1
default via 10.176.229.32 dev modem1
10.73.15.64/27 dev modem2 scope link
10.176.229.0/26 dev modem1 scope link src 10.176.229.31
127.0.0.0/8 dev lo scope link
192.168.0.0/24 dev eth0 scope link
# ip -c route ls table 2
default via 10.73.15.80 dev modem2
10.73.15.64/27 dev modem2 scope link src 10.73.15.79
10.176.229.0/26 dev modem1 scope link
127.0.0.0/8 dev lo scope link
192.168.0.0/24 dev eth0 scope link
Итак, локально на ПК-1 у меня есть доступ в Интернет.
У меня также есть ПК-2 в локальной сети, и я хотел бы настроить маскарад на ПК-1, чтобы обеспечить Интернет для ПК-2.
Я пробую следующую конфигурацию nftables:
# nft list ruleset
table ip filter {
chain input {
type filter hook input priority 0; policy accept;
}
chain forward {
type filter hook forward priority 0; policy accept;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
table ip nat {
chain input {
type nat hook input priority 0; policy accept;
ip protocol icmp accept
}
chain prerouting {
type nat hook prerouting priority 0; policy accept;
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
ip saddr 192.168.0.0/24 oifname "modem*" masquerade
}
chain output {
type nat hook output priority 0; policy accept;
}
}
Но это не работает. Я пробовал несколько разных версий конфига, но безуспешно. Как я могу настроить nftables для маскарада?
Я также настраиваю:
# sysctl -w net.ipv4.ip_forward="1"
net.ipv4.ip_forward = 1
Ядро Linux 4.19.0
Редактировать:
Я успешно настроил маскарад с nftables на другом ПК. Замеченная мной разница (не знаю, имеет ли это смысл):
На ПК-1:
# sudo iptables -S
iptables: No chain/target/match by that name.
На другом ПК:
# sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
Итак, проблема - IPV4_DEVCONF_FORWARDING
не был настроен на eth0
интерфейс. Я установил это с помощью libnl
- метод rtnl_link_inet_set_conf
.
Редактировать:
Это тот же вариант sysctl net.ipv4.conf.eth0.forwarding
. Спасибо за @ A.B.