我在 Raspberry Pi 上运行 WireGuard 服务器,使用https://github.com/linuxserver/docker-wireguard图像。我想允许同龄人做两件事:
- 通过 SMB 连接到单个 NAS
- ping 同一 NAS
我编写了以下 iptables 规则来存档此内容(wg0
是 WireGuard 接口,eth0
即“朝向”我的网络的接口):
# Reset (flush) rules
iptables -t nat -F
iptables -F
# Allow WireGuard traffic
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
# Deny any forward traffic by default
iptables --policy FORWARD DROP
# Allow SAMBA traffic to NAS
NAS="192.168.178.23/32"
iptables -A FORWARD -i wg0 -p tcp --dport 445 -d "$NAS" -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Allow ICMP echo request
iptables -A FORWARD -i wg0 -p icmp --icmp-type 8 -d "$NAS" -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o wg0 -p icmp --icmp-type 0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# NAT tunnel IP to internal IP
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
这些都可以工作,所以当通过 WireGuard 连接时,我可以通过 SMB ping 并挂载 NAS,但我无法 ping 网络中的任何其他服务或访问 NAS 的 HTTP 接口。
不过,我确实有几个问题需要弄清楚我到底做了什么:
INPUT
当将/OUTPUT
策略设置为 时DROP
,什么都不起作用。我的假设是,这是因为 上接收的 WireGuard UDP 数据包wg0
被策略丢弃了?- 如果我无论如何都要设置策略并添加
ALLOW
来自/到 的流量规则wg0
,那么效果就是容器无法通过 连接到任何东西,eth0
而只能FORWARD
连接来自 的流量wg0
? RELATED,ESTABLISHED
允许流量通过的规则wg0
应该只匹配响应 TCP:445 或 ICMP:echo-request 的流量。无需在其中更具体(例如匹配端口/协议),对吗?ALLOW
不需要规则echo-responses,因为允许RELATED,ESTABLISHED
其上方流量的不太具体的规则将在它之前匹配,对吗?- 由于链上的所有过滤
FORWARD
,我的假设是我不需要在表链上进行过滤nat
,POSTROUTING
因为 TCP:445 或 ICM:echo-request 上任何不属于 NAS 的流量无论如何都不会“到达这么远”。这是正确的吗?
答案1
简要回答您的问题:
- 是的
INPUT
/链OUTPUT
用于连接全部接口(lo
、eth0
、wg0
等)。通常,默认情况下,您不希望阻止所有出站流量,因为您最终会花时间排除通常认为理所当然的故障(DNS、DHCP、NTP、使用环回连接的其他进程等)- 是的。通常情况下,只需允许所有连接
RELATED,ESTABLISHED
而无需任何附加条件即可(如果您已经允许通过一种方式建立连接,则以另一种方式进行对称响应也应该没问题) - 是的
- 是的
我认为这iptables处理流程图也会帮助你更好地理解这是如何工作的:
我这样写规则:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# INPUT chain of filter table:
# drop known bad packets
iptables -A INPUT -m state --state INVALID -j DROP
# accept responses to established connections
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# accept ICMP packets
iptables -A INPUT -p icmp -J ACCEPT
# accept loopback connections
iptables -A INPUT -i lo -J ACCEPT
# accept connections to WireGuard listen port
iptables -A INPUT -p udp --dport 51820 -J ACCEPT
# FORWARD chain of filter table:
# drop known bad packets
iptables -A FORWARD -m state --state INVALID -j DROP
# forward responses to established connections
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# forward ICMP packets from WireGuard network to NAS
iptables -A FORWARD -i wg0 -d 192.168.178.23 -p icmp -J ACCEPT
# forward SMB connections from WireGuard network to NAS
iptables -A FORWARD -i wg0 -d 192.168.178.23 -p tcp --dport 445 -J ACCEPT
# POSTROUTING chain of nat table:
# masquerade all packets forwarded to LAN
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE