iptables 规则将网络流量列入白名单

iptables 规则将网络流量列入白名单

我写了以下 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 接受

相关内容