"Wi-Fi is a blessing from the gods."
— Darren Shan , Wolf Island (The Demonata, #8)
"Wi-Fi is a blessing from the gods."
出门在外,有时需要流量上网,本文聊聊如何使用 iptables 只允许特定的程序连接网络。
面对这个需求其实第一反应是找找有没有带 GUI 的管理工具。很可惜,在 Linux 下进行应用层的网络管理似乎不容易,目前只找到一个工具 Douane,但是看 issue 貌似不是很稳定,且一个软件拆成几个仓库,编译过程十分繁琐。
后来了解到 iptables 这个内置的包过滤工具,发现配置起来简单多了。
其解决方案是新建一个用户组,让 iptables 默认拦截扔掉所有包,但除了这个用户组中的程序。
新建用户组 internet
sudo addgroup internet
保存以下脚本并运行
#!/bin/sh
# 清理所有规则
sudo iptables -F
# 只允许 internet 组
sudo iptables -A OUTPUT -p all -m owner --gid-owner internet -j ACCEPT
# 允许本地连接
sudo iptables -A OUTPUT -p tcp -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d 192.168.0.1/24 -j ACCEPT
# 拒绝所有包
sudo iptables -A OUTPUT -j REJECT
# 以 internet 为主要用户组打开新的 shell
sudo -g internet -s
现在只有在新 shell 中打开的程序才可以访问网络。
sudo visudo
最后添加 crimx ALL=(ALL:internet) ALL
,代表用户 crimx
允许在 internet
组执行任意命令。crimx
换成你的用户名即可。要恢复正常网络访问,只需重启或者恢复默认
sudo iptables-restore /etc/iptables/empty.rules
评论没有加载,检查你的局域网
Cannot load comments. Check you network.