是否有可能使用Linux防火墙阻止(或“丢弃”)所有传入数据包到源于本地计算机的特定端口?
理想情况下:我想仍然允许远程访问端口。
我试过这个(我通过googlefind的):
sudo iptables -I FORWARD 1 -p tcp -m tcp --dport 9000 -j DROP
但是这对我不起作用; 我发现我仍然能够“telnet”(从同一台机器)到端口9000(再次在同一台机器上),而不被阻止/丢弃。
这是一个奇怪的要求:但是我正在尝试组装一个诊断testing – 我需要在同一台机器上阻止两个程序之间的通信; 而实际上并没有终止端点服务。
顺便说一句:我testing是否可以通过运行一个简单的Java程序来阻止传入的stream量(如下):
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(); } } }
使用这个 – 我可以看到来自'Incoming!'的'telnet'(etc)的传入请求。 信息。
首先,您需要使用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,并绕过localhost上的防火墙。
sudo iptables -I INPUT -p tcp --dport 9000 -i eth0 -s 192.168.10.10 -j DROP
最后,所有本地接口可能都有IPv6链接本地地址(即使您认为您的LAN没有IPv6),因此您可能也要阻止这些地址。
编辑
在一个友好的networking上(我假设localhost在这种情况下是友好的),通常使用REJECT而不是DROP来配合,因为这明显地拒绝了传入的连接,而不是忽略它。 这使得客户端可以立即发现连接失败,而不是等待超时。
源于主机的数据包不应该进入FORWARD链,所以我不认为这对你有用。
相反,请尝试设置一个规则来阻止到该端口的传入stream量,并使用回送来源和/或您的主机IP。 像这样的东西…
sudo iptables -I INPUT -p tcp --dport 9000 -i lo -j DROP