我有几个公共网络服务器和一些家用 Ubuntu 机器。我维护了几个专门用于监控 MySQL 和 Memcache 等内容的域。理想情况下,我可以从家用机器连接到 MySQL、Memcache 等,同时拒绝其他所有人访问。
所以我的 iptables 当前是:
ACCEPT tcp -- home ip 0.0.0.0/0 tcp dpt:3306
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
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:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT all -- server 1 ip 0.0.0.0/0
ACCEPT all -- server 2 ip 0.0.0.0/0
ACCEPT all -- server 3 ip 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我想扩展我的 iptables,这样我就可以在家里访问所有内容。我认为最好为每个端口添加一行我的家庭 IP,而不是让我的家庭 IP 访问每个端口。但也许这并不重要。此外,我想运行 phpMemcachedAdmin 之类的东西而不需要密码。
因此,我使用 Google 搜索了几次如何拒绝全世界访问某个域。我认为,我在拒绝全世界访问该域的行上方添加了一行允许我的 IP 访问端口 80,这样(祈祷)我应该可以阻止除我之外的所有人。
-m string "Host: domain.com"
我在 Google 搜索中看到的帖子说你可以通过或 通过 来阻止域名--string "domain.com"
。 这两种方法似乎都不起作用。 以下是我尝试过的方法:
sudo iptables -I 9 -p tcp --dport 80 -m string "Host: domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 -m string "domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 --string "domain.com" --algo bm -j DROP
前两个错误是由于错误的参数‘Host:...’而产生的,最后一个错误是由于未知的选项“--string”而产生的。
让事情变得更复杂一点的是,我的家庭 IP 是动态的,而不是静态的。因此,如果能够通过我设置的 DynDNS 域允许我的家庭 IP,那就太好了(但不是必需的)。我有一个用于停止和启动 iptables 的脚本,因此如果需要,我可以随时停止并重新启动它以强制更新 IP。(我在几个地方读到,iptables 仅在启动时检查域的 IP。)
我也欢迎任何有关在标准网络服务器上使用 iptables 的安全相关建议。
谢谢
2014 年 3 月 17 日补充:我发现我的 iptables 行中有语法错误 - 应该-m string
是-m string --string
。现在看来,我的 iptables 可以识别我想要阻止人们访问的域。然而,问题变成了 iptables 规则的顺序。
我的新 iptables 变成:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_for_matching" ALGO name bm TO 65535
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
这个想法是在匹配字符串的 DROP 之前捕获我的 IP。如果 DROP 是第一行,那么它会捕获它,然后我会收到 502 错误。但是,如果 iptables 和我列出的一样,那么请求就会通过 - 我的本地 IP 尚未出现在规则表中。
有效的方法如下:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
ACCEPT all -- My Home IP 0.0.0.0/0
ACCEPT all -- My Laptop IP 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_to_match" ALGO name bm TO 65535
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我只需使用他们的 DynDNS 域名而不是 IP 就可以包含我的动态 IP。
我可能可以以此作为答案,但我希望得到一些关于这个问题的最佳实践的建议。