我正在寻找一个完整的示例,说明如何使用 nftables 执行此操作。它应该是上游接口上的 DHCP 客户端,在另一个接口上有一个 192.168.0.0/24 LAN,并且还充当防火墙。
在上游接口上打开 ssh 端口并将端口 80 流量转发到 LAN 上的其他服务器可获得额外奖励。
nftables wiki 留下了一些未解答的问题。例如,伪装部分没有描述如何将伪装规则附加到一个接口而不是另一个接口。
答案1
这是我正在使用的,假设它lan0
连接到您的内部网络和wan0
您的 ISP。
我不确定您所说的“上游接口上的 DHCP 客户端”是什么意思,因为这是通过 DHCP 客户端而不是 nftables 完成的。下面的设置不限制传出流量,因此 DHCP 请求将通过。
#!/usr/bin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# allow established/related connections
ct state {established, related} accept
# early drop of invalid connections
ct state invalid drop
# allow from loopback
iifname lo accept
# Allow from internal network
iifname lan0 accept
# allow icmp
ip protocol icmp accept
# allow ssh
tcp dport 22 accept comment "SSH in"
reject
}
chain forward {
type filter hook forward priority 0;
# Allow outgoing via wan0
oifname wan0 accept
# Allow incoming on wan0 for related & established connections
iifname wan0 ct state related, established accept
# Drop any other incoming traffic on wan0
iifname wan0 drop
}
chain output {
type filter hook output priority 0;
}
}
table ip nat {
chain prerouting {
type nat hook prerouting priority 0;
# Forward traffic from wan0 to a LAN server
iifname wan0 tcp dport 80 dnat 192.168.0.8 comment "Port forwarding to web server"
}
chain postrouting {
type nat hook postrouting priority 0;
# Masquerade outgoing traffic
oifname wan0 masquerade
}
}
答案2
伪装是 SNAT 的一个特例。如果你想将流量附加到输出接口或输出地址(内部 IP 的源地址),请使用 SNAT