我正在服务器上工作,应该对其进行配置,以便仅允许来自特定 IP 的端口 8080 上的请求。(在其他 http(s) 端口上,没有任何内容在监听。)
其余一切均不受限制。
在研究了/etc/host
iptables 之后,我编写了这个脚本来激活(和停用)该规则:
#!/bin/bash
if ["$1" != 'restrict'] && ["$1" != 'restore']
then
echo "Usage:"
echo "'${0##*/} restrict' to activate rules."
echo "'${0##*/} restore' to deactivate rules."
echo "'${0##*/}' to show this help."
exit 0
fi
# Set default policies for INPUT, FORWARD and OUTPUT chains
# Allowing everything else.
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# Flush all current rules from iptables
iptables -F
if [$1 == "restrict"]
then
# Allow HTTP connections on tcp port 8080 from X.X.X.X
# [I]nserting the rules as first in the chain.
iptables -I INPUT -p tcp --dport 8080 -s X.X.X.X -j ACCEPT
# Denying all other connections on tcp port 8080
# [A]ppending the rule as last in the chain.
iptables -A INPUT -p tcp --dport 8080 -j DROP
fi
# Save settings
/sbin/service iptables save
# List rules
iptables -L -v
由于我只能通过 SSH 访问该机器,我不想搞砸并把自己锁在外面。因此我想问一下这个脚本
- 作品?
- 会做期望的事情吗?
- 不会做其他事吗?
- 保持非挥发性?
答案1
虽然这可行,但这不是最佳做法。最佳做法不是允许所有内容并仅丢弃特定内容,而是丢弃所有内容,然后仅允许您真正想要通过的内容。
一个“正常”的 IP 表规则集通常以如下方式开始:
# Flush rules
iptables -F
# Policy drop
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Permit loopback device
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Permit new outgoing connections, and packets that belong to
# an existing connection. You might actually not want to allow
# all new connections from the inside if you want to restrict
# this, you will have to allow DNS, updates, etc.. manually
iptables -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# Same for input
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
# Custom rules
# ...
iptables -A INPUT -p tcp --dport 8080 -s 5.35.252.105 -j ACCEPT
此外,在设置新防火墙时,不要自动运行脚本,也不要使更改永久生效。这样,如果您搞砸了,重新启动服务器即可恢复连接。
答案2
您的规则是正确的(如果您修复了前面评论中提到的 shell 脚本中的语法错误)对于 IPv4。 对于 IPv6,你的机器可能完全开放。
未来建议:
防止锁定:如果您
iptables-save
直接以样式编写规则,您可能会喜欢iptables-apply
恢复先前规则的命令,以防新规则将您锁定。使规则持久:在 ubuntu 上,应该有一个
iptables-persistent
软件包来确保您的规则在重启后仍然有效。只需设置您的规则并apt-get install iptables-persistent
按照交互式对话框进行操作即可。改进风格和安全性:mzhaase 给出了一个非常好的教程,教你如何编写白名单规则。
答案3
这是防止锁定的简单方法。原则上,它可以在任何 *nix 系统上工作,而不仅仅是 Ubuntu。
假设你的脚本被调用/usr/local/bin/start-iptables.sh
,并且你使用以下命令完全禁用 iptables/usr/local/bin/stop-iptables.sh
/usr/local/bin/start-iptables.sh ; sleep 30 ; /usr/local/bin/stop-iptables.sh
如果您像这样在一行中运行这些命令,shell 将按顺序运行它们。如果您按 Control-c,整个命令字符串将被中止 - 它不会只是取消正在运行的命令并转到下一个命令。
因此,shell 将运行您的启动脚本,然后休眠 30 秒。在这 30 秒内,验证您是否仍可以访问服务器。建立新连接,有多种方法可以建立新连接,但保持现有连接处于活动状态。一旦您确定,control-c 和 sleep 和 stop-iptables 脚本将被中止。
如果你做将自己锁在外面,30 秒后,停止脚本将运行,然后您就可以回来了。