在 iptables 中允许 UPnP 和 NAT-PMP 请求

在 iptables 中允许 UPnP 和 NAT-PMP 请求

我有一个带转发功能的 OpenVPN 网关设置,效果很好。我的另一台机器通过它连接并访问互联网。进行了外部端口扫描,外部 VPN 地址上没有可见的端口。在网关机器上安装了 linux-igd (upnpd)。如果我设置 iptables -P INPUT ACCEPT,它就像 charm 一样工作,端口被打开并转发到客户端。但我想为 UPnP 请求创建实际规则。

我的 iptables 如下:

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

因此我添加了一个日志规则来查看从客户端(192.168.0.6)丢弃的内容:

sudo iptables -A INPUT -i eth0 -s 192.168.0.6 -j LOG --log-prefix "DROPPED: "

重启openvpn服务和客户端,然后日志输出如下内容:

Mar 19 07:32:55 raspberrypi kernel: [ 6954.935598] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b0:b0:40:00:40:11:08:1c SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45232 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:32:55 raspberrypi kernel: [ 6954.939366] DROPPED: IN=eth0 OUT= MAC=01:00:5e:7f:ff:fa:b8:27:eb:6b:f9:a6:08:00:45:00:00:a5:b9:6a:40:00:01:11:0f:35 SRC=192.168.0.6 DST=239.255.255.250 LEN=165 TOS=0x00 PREC=0x00 TTL=1 ID=47466 DF PROTO=UDP SPT=54192 DPT=1900 LEN=145
Mar 19 07:33:03 raspberrypi kernel: [ 6962.293068] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:a0:40:00:40:11:06:2c SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45728 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:03 raspberrypi kernel: [ 6962.626402] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:b6:40:00:40:11:06:16 SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45750 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:03 raspberrypi kernel: [ 6962.959560] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:be:40:00:40:11:06:0e SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45758 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:04 raspberrypi kernel: [ 6963.293411] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:d5:40:00:40:11:05:f7 SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45781 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:04 raspberrypi kernel: [ 6963.627138] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:d6:40:00:40:11:05:f6 SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45782 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:11 raspberrypi kernel: [ 6970.968277] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b3:5f:40:00:40:11:05:6d SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45919 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10

所以我看到它在 UDP 1900 上进行广播,然后尝试连接到 UDP 5351。因此我在日志规则之前插入这两个规则:

sudo iptables -I INPUT 4 -i eth0 -p udp --dport 1900 -j ACCEPT
sudo iptables -I INPUT 4 -i eth0 -p udp --dport 5351 -j ACCEPT

日志规则没有出现任何问题,因此据我所知,没有任何东西被阻止,但 UPnP 不起作用。如果我这样做:

sudo iptables -P 输入接受

一切都很顺利!我也尝试过这个,我几乎可以在所有文档中找到与此相关的所有端口号……

sudo route add -net 239.0.0.0 netmask 255.0.0.0 eth0

sudo iptables -A INPUT -i eth0 -p tcp --dport 2869 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 5000 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 49152:49154 -j ACCEPT

sudo iptables -A INPUT -i eth0 -p udp --dport 1900 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p udp --dport 5351 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p udp --dport 5353 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 2869 -j ACCEPT

有什么想法或建议吗?

答案1

所以我终于弄清楚了哪里出了问题!我将输入链的默认策略设置为接受。

sudo iptables -P INPUT ACCEPT

然后在我的 INPUT 链底部添加以下两行:

iptables -A INPUT -j LOG --log-prefix "INPUT:DROP:" --log-level 6
iptables -A INPUT -j DROP

然后我打开了第二个 SSH 窗口并对日志进行了跟踪:

tail -f /var/log/messages

我注意到的第一件事是来自 127.0.0.1 的 lo 接口的流量被阻止了,完全没有注意到这一点。所以我添加了这个:

iptables -I INPUT 1 -i lo -j ACCEPT

然后,我从内部一遍又一遍地运行 UPnP 请求,以查看被阻止的内容。最终得到了以下两条规则:

sudo iptables -A INPUT -i eth0 -p udp -m multiport --dports 1900,5351,5353 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp -m multiport --dports 49152 -j ACCEPT

希望它能帮助到别人!

相关内容