是否可以使用 Linux 防火墙来阻止(或“丢弃”)来自本地机器的特定端口的所有传入数据包?
理想情况下:我仍然希望允许远程流量访问该端口。
我已经尝试过这个(我通过谷歌找到的):
sudo iptables -I FORWARD 1 -p tcp -m tcp --dport 9000 -j DROP
但这对我来说不起作用;我发现我仍然能够“telnet”(从同一台机器)到端口 9000(再次在同一台机器上)而不会被阻止/丢弃。
这是一个奇怪的请求:但我正在尝试进行诊断测试 - 我需要阻止同一台机器上两个程序之间的通信;而无需真正终止端点服务。
顺便说一句:我正在测试是否可以通过运行一个简单的 Java 程序来阻止传入流量(如下):
import java.net.Socket;
import java.net.ServerSocket;
public class listen {
public static void main(String[] args) throws Exception {
int port=9000;
System.out.println("Listening on port:"+port);
ServerSocket ss=new ServerSocket(port);
while (true) {
Socket s=ss.accept();
System.out.println("Incoming !");
s.close();
}
}
}
使用这个 - 我可以从‘传入!’消息中看到来自‘telnet’(等)的传入请求。
答案1
首先,您需要使用 INPUT 来断开传入连接。
正如@Ulfy 所说
sudo iptables -I INPUT -p tcp --dport 9000 -i lo -j DROP
删除 IPv4 环回。然后,您可能想要删除 IPv6 环回
sudo ip6tables -I INPUT -p tcp --dport 9000 -i lo -j DROP
然后还有其他接口也可以“回环”。例如,如果你在 IP 192.168.10.10 上有 eth0,并且你输入
telnet 192.168.10.10
然后您的 telnet 客户端从 192.168.10.10 连接到 192.168.10.10,并以此方式绕过了本地主机上的防火墙。
sudo iptables -I INPUT -p tcp --dport 9000 -i eth0 -s 192.168.10.10 -j DROP
最后,所有本地接口都可能具有 IPv6 链接本地地址(即使您认为您的 LAN 没有 IPv6),因此您可能也想阻止这些地址。
编辑
在友好网络上(我假设 localhost 在本例中是友好的),使用 REJECT 而不是 DROP 通常更具协作性,因为这会明确拒绝传入连接,而不是忽略它。这允许客户端立即检测到连接已失败,而不是等待超时。
答案2
源自主机的数据包不应进入 FORWARD 链,因此我认为这对您不起作用。
相反,请尝试设置一条规则来阻止进入该端口的流量,并使用环回源和/或您的主机 IP。类似这样的操作...
sudo iptables -I INPUT -p tcp --dport 9000 -i lo -j DROP