我写了以下 iptables 规则。我的主要目的是做这些事情
- 允许 ssh 流量到任何机器
- 允许网络流量(http、https 和一些 ssh)到达选定数量的网站(实际上是白名单)
- 允许所有流量到 192.168.0.x(我的子网中的机器)
- 允许所有使用环回接口的流量
- 不要弄乱当前的连接
- 删除任何不符合上述规则的请求
所以我写了以下一组 iptables 规则。这导致无法再访问任何内容,我搞砸了……:(
我该如何解决这个问题?我对 iptables 一点都不在行,我正在阅读有关它的文档,但还是无法解决这个问题(我从来都不擅长网络)。
顺便说一句,我想在我的本地机器上使用它。
--
#!/bin/bash
#Flush rules(deletes all existing chains)
iptables -F
#allow ssh
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT
#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT
# Allow DNS
iptables -A OUPUT -p udp --dport 53 -j ACCEPT
# Allow local network IN/OUT traffic
iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.1.0/24 -j ACCEPT
# vagrant local IPs (TODO later)
# iptables -A INPUT -i eth0 -s 10.0.1.0/24 -j ACCEPT
# iptables -A OUTPUT -o eth0 -d 10.0.1.0/24 -j ACCEPT
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d serverfault.com --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d google.com --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d google.com --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d wikipedia.com --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d wikipedia.com --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d wikimedia.org --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d wikimedia.org --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d mediawiki.org --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d mediawiki.org --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d mathlinks.ro --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d mathlinks.ro --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d stackoverflow.com --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d stackoverflow.com --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d perlmonks.org --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d perlmonks.org --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d gmail.com --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d gmail.com --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -d cyberciti.biz --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d cyberciti.biz --dport 443 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#drop everything else
iptables -P INPUT DROP
iptables -P OUTPUT DROP
@B14D3 iptables -nL 的输出(运行上述程序之前):
$ sudo iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
@Raj 输出iptables -L
默认规则(不应用我的规则)
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
iptables -nL
@Khaled运行上述脚本后的输出
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 192.168.1.0/24 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
ACCEPT all -- 0.0.0.0/0 192.168.1.0/24
ACCEPT tcp -- 0.0.0.0/0 64.34.119.12 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 64.34.119.12 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.249 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.212 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.214 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.217 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.219 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.222 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.224 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.227 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.229 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.232 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.234 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.237 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.239 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.242 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.244 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.247 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 62.231.75.247 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.249 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.212 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.214 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.217 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.219 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.222 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.224 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.227 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.229 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.232 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.234 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.237 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.239 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.242 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 62.231.75.244 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 208.80.152.201 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 208.80.152.201 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 208.80.152.200 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 208.80.152.200 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 208.80.152.208 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 208.80.152.208 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 76.12.70.149 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 76.12.70.149 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 64.34.119.12 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 64.34.119.12 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 216.92.34.251 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 66.39.54.27 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 209.197.123.153 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 209.197.123.153 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 216.92.34.251 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 66.39.54.27 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 173.194.39.150 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 173.194.39.149 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 173.194.39.149 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 173.194.39.150 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 75.126.153.206 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 75.126.153.206 tcp dpt:443
答案1
以下几点可以考虑并对您有所帮助:
相关/已建立的规则最好位于防火墙规则的顶部,而不是底部。这是因为它大多数时候都会被触发(性能原因)。
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
您没有明确说明是在自己的机器上还是在网络网关上配置防火墙。前一种情况下,在INPUT
/ chains 中添加规则是可以的。但是,后一种情况下OUTPUT
,您需要考虑将ACCEPT
规则添加到链中。FORWARD
此外,在防火墙规则中使用 DNS 名称来允许特定域并不是一个好主意。相反,您可以使用带有黑名单/白名单的代理服务器来拒绝/允许任何域/URL 等的任何内容。Iptables 以后将无法检测到 DNS-IP 更改。
更新:查看规则集时,我看不到链中允许 DNS 流量的任何规则OUTPUT
。您可以添加如下规则:
-A OUTPUT -p udp --dport 53
答案2
@jojo 最好和最简单的方法是首先加载默认策略,它将解决您下面的四个查询。
允许 ssh 流量到任何机器
允许所有使用环回接口的流量
不要弄乱当前的连接
删除任何不符合上述规则的请求
因为默认的 iptable 规则允许所有流量环回并丢弃任何未经特别允许的请求等等。
然后插入 http、https 和其他规则,并将状态作为新规则
例如,对于端口 80 或 http,如下所示
iptables -I 输入 8 -m 状态 --状态新 -p tcp --dport 80 -j 接受