我在端口 3000 上运行某些程序,并且希望仅向特定用户(通过 IP 地址)提供端口 3000 上的这项服务。我该怎么做?
这是通过 ufw 还是 iptables 完成的(我对这两者了解甚少)?
答案1
这个答案仅使用 iptables。ufw 只是 iptables 的前端,很多人喜欢它,但我不喜欢。
如果您已经有一些 iptables 规则,则必须以某种方式将此答案中的规则添加到已存在的规则中。将接口名称更改为您的接口名称。
此答案假设您允许的用户列表很小,并且协议是 tcp。数千个 ip 地址的列表应通过 ipsec 扩展进行处理。
sudo iptables -A INPUT -i enp3s0 -p tcp -m tcp --dport 3000 -s 1.2.3.4 -j ACCEPT
sudo iptables -A INPUT -i enp3s0 -p tcp -m tcp --dport 3000 -s 4.3.2.1 -j ACCEPT
sudo iptables -A INPUT -i enp3s0 -p tcp -m tcp --dport 3000 -s 1.2.4.3 -j ACCEPT
sudo iptables -A INPUT -i enp3s0 -p tcp -m tcp --dport 3000 -s 111.222.113.224 -j ACCEPT
sudo iptables -A INPUT -i enp3s0 -p tcp -m tcp --dport 3000 -j DROP
现在,检查生成的规则集:
doug@s18:~$ sudo iptables -v -x -n -L
Chain INPUT (policy ACCEPT 95 packets, 9490 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- enp3s0 * 1.2.3.4 0.0.0.0/0 tcp dpt:3000
0 0 ACCEPT tcp -- enp3s0 * 4.3.2.1 0.0.0.0/0 tcp dpt:3000
0 0 ACCEPT tcp -- enp3s0 * 1.2.4.3 0.0.0.0/0 tcp dpt:3000
0 0 ACCEPT tcp -- enp3s0 * 111.222.113.224 0.0.0.0/0 tcp dpt:3000
0 0 DROP tcp -- enp3s0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3000
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 32 packets, 4916 bytes)
pkts bytes target prot opt in out source destination
现在,从另一台计算机进行测试。我将使用 hping3,但读者可能有其他首选实用程序。我将伪造一个允许的 IP 地址(在我的情况下,没有回复,因为我实际上没有在端口 3000 上监听任何东西,而且因为我伪造了源 IP 地址,所以回复无论如何都不会路由回源计算机)和一个不允许的 IP 地址:
doug@s15:~$ sudo hping3 -c 5 -a 1.2.3.4 --destport 3000 s18
HPING s18 (br0 192.168.111.122): NO FLAGS are set, 40 headers + 0 data bytes
--- s18 hping statistic ---
5 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
doug@s15:~$
doug@s15:~$ sudo hping3 -c 5 -a 4.4.4.4 --destport 3000 s18
HPING s18 (br0 192.168.111.122): NO FLAGS are set, 40 headers + 0 data bytes
--- s18 hping statistic ---
5 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
doug@s15:~$
现在,通过观察 iptables 规则集中的数据包计数器检查所采用的路径(提示:完全符合预期):
doug@s18:~$ sudo iptables -v -x -n -L
Chain INPUT (policy ACCEPT 274 packets, 28567 bytes)
pkts bytes target prot opt in out source destination
5 200 ACCEPT tcp -- enp3s0 * 1.2.3.4 0.0.0.0/0 tcp dpt:3000
0 0 ACCEPT tcp -- enp3s0 * 4.3.2.1 0.0.0.0/0 tcp dpt:3000
0 0 ACCEPT tcp -- enp3s0 * 1.2.4.3 0.0.0.0/0 tcp dpt:3000
0 0 ACCEPT tcp -- enp3s0 * 111.222.113.224 0.0.0.0/0 tcp dpt:3000
5 200 DROP tcp -- enp3s0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3000
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 60 packets, 10628 bytes)
pkts bytes target prot opt in out source destination