想模拟数据库网络连接失败的情况, 看这时的程序表现是怎样的? 在Ubuntu系统中可以直接使用下面的命令
sudo iptables -A OUTPUT -p tcp -d db.foo.com --dport 3306 -j DROP
但在Mac中执行上述命令时报错
udo: iptables: command not found
google了一下发现Mac可以使用pf
命令来代替iptables
参考了这个文档和这个文档
在/etc/pf.conf
文件中增加了下面的内容
anchor "my.pf"
load anchor "my.pf" from "/etc/pf.anchors/my.pf.rules"
在文件/etc/pf.anchors/my.pf.rules
中添加规则
block drop out quick on en0 proto tcp from localhost to db.foo.com port 3306
然后加载启用规则
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
发觉配置并没生效 仍能成功连接数据库。 不知到底哪里错了? 另外不得不说这种方式相对iptables
来说真的很繁琐。难道Mac中想禁止访问某一服务器的某一端口就只有这一种方式吗?
iptables
是Linux系统的防火墙。
macOS使用的是pf
,也可以用FreeBSD的ipfw
。
使用方法:OS X:关于应用软件防火墙
如果你觉得太麻烦,可以用icefloor
这个图形化的Mac防火墙,它是pf
的GUI前端。
当然,Mac也有其他防火墙,比如tcpblock
、Little Snitch
(收费)、Hands Off!
(收费,注意,不是OS X Yosemite开始自带的Hand Off功能)以及某些带防火墙的杀毒软件都可以。
可以使用下面的命令实现
(sudo pfctl -sr 2>/dev/null; echo "block drop quick on en0 proto tcp from any to db.foo.com port = 3306" ) | sudo pfctl -f - 2>/dev/null
sudo pfctl -e
恢复
➜ ~ sudo pfctl -d
参考文档
As of 10.8 and above you can edit the pf.conf file. I would only do this if you don't have a network firewall in place. You can if need be block from the client side on OSX by editing the above file. OSX has a built in "pfctl" command from terminal. So in your case you could add the following rule and enable the pfctl.
(sudo pfctl -sr 2>/dev/null; echo "block drop quick on en0 proto tcp from any to any port = 3268") | sudo pfctl -f - 2>/dev/null
You would have to change en0 to what every interface you want it blocked on, otherwise I believe (never tested) you can use "! lo0" to block any connections not from loopback.sudo pfctl -s rules
Will show what rules are in place and a
sudo pfctl -e
will enable the rules.