我正在测试连接到两个数据库的 Web 应用程序。我无法停止它们,但我想模拟其中一个数据库的中断。
因此我打开了一个正在 ping DB 服务器的终端:
ping 172.21.7.188
在第二个终端我执行了以下操作:
sudo iptables -A INPUT -s 172.21.7.188 -j DROP
sudo iptables -A OUTPUT -d 172.21.7.188 -j DROP
但我没有看到任何变化 - ping 仍然返回。我做错了什么?
答案1
虽然您可能正在使用 Ubuntu,但这个问题不是特定于 Ubuntu 的,而是特定于 Linux 的,所以我认为最好在 ServerFault 上提问。
回答原始问题(在 OP 编辑之前)
INPUT 链中的规则是正确的,但 OUTPUT 链中的规则是错误的。您希望丢弃发往所提及 IP 的数据包,而不是来自该 IP 的数据包(这在此链中毫无意义)。
这就是为什么您必须在规则中将-s
( --source
) 更改为-d
( ):--destination
# iptables -A OUTPUT -d 172.21.7.188 -j DROP
但即使您只丢弃了传入的数据包,也可以说这已经足够了。的确,ping 返回了(ICMP 回应回复到达了您的主机),但没有上述行,并且咨询 tcpdump 或 wireshark 会显示与 ping 相关的数据报(即传出和传入),但应用程序ping
没有收到传入的数据报,因为它们被丢弃了。
显然,在大多数情况下仅丢弃传入的数据包是相当不明智的,因为它会导致连接两端(在连接级别或应用程序级别)的状态不同。
对已编辑问题的回答
如果更正后仍然不起作用,那么我怀疑您的防火墙已经有一些规则,使新规则无法访问。您添加规则的方式使它们附加在链的末尾。您应该先删除新规则(与附加命令相同,但更改-A
为-D
)。
现在将你的规则添加到适合的链的开头(即,将它们插入到给定的规则编号 1 处)(与附加命令相同,更改-A
为-I
):
# iptables -I INPUT -s 172.21.7.188 -j DROP
# iptables -I OUTPUT -d 172.21.7.188 -j DROP
现在它应该可以工作了。
答案2
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
这将阻止 Ping
我在我们的服务器上使用这个脚本来管理 Iptables
#!/bin/bash
#This Script was Used for Only Setting up Iptables in ubuntu 12.04 server
#uncomment the Lines With # Which u don't need to use
#if u going to use this script in remote VPS Test it in local systems before applying it in remote VPS .
#final line will be commented with # cos it will save the iptables if its not commented with #
#0. Flush every Rules what ever there already
iptables -F
#1. This enable traffic for (lo) loopback interface(-i)
iptables -A INPUT -i lo -j ACCEPT
#2. This Will Keep the rules for Which service currently Established eg : ssh
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#3. This Will Enable the Port Number 22 for ssh which i we have defined
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
#4.This Will Enable the Port Number 80 for http
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
#5.This Will Enable the Port Number 443 for httpd
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
#6. Allow rsync from a specific network
iptables -A INPUT -i eth0 -p tcp --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
#7. Blow ICMP PING Request
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
#11. This Will Block Other connections
iptables -A INPUT -j DROP
#saving the iptables
#sudo apt-get install iptables-persistent
#sudo service iptables-persistent save
#sudo service iptables-persistent restart