这是我的/etc/sysconfig/iptables
:
它有两个端口开放 80 apache 和 22 用于 ssh。
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
对于端口 22 ( SSH ),我想确保除了特定的 IP 地址之外没有人可以连接到该端口。
示例 IP:
1.2.3.4
请忽略有关如果我的 IP 发生变化并且我无法再通过 SSH 连接到我的服务器的任何疏忽/担忧。
答案1
如果我以正确的方式得到问题,您希望只能从端口 22 上的特定 IP 地址访问您的服务器,您可以为此更新 Iptables:
iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT
在这种情况下,如果您需要为内部网络打开 DNS,则仅向 YourIP 打开 ssh 端口:
iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT
添加并为这些 IP 打开后,您需要为其余 IP 关闭大门
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP
(确保将规则设置在规则集中的正确位置。会将规则添加到当前的iptables -A INPUT
末尾。)INPUT
或作为乔尔说你可以添加一条规则:
iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP
或者您可以在防火墙上设置默认策略
iptables -P INPUT DROP
简而言之,如这个问题关于SO:
iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
答案2
其他答案在他们的示例中使用iptables -I
,这通常不是您应该使用的。
iptables会执行第一个匹配的规则,所以规则的顺序非常重要。 -I
是“插入”命令,应与索引参数一起使用以指定给定规则在列表中的位置。 -A
是“append”命令,它将把规则添加到列表的末尾。
在某些发行版(也许是所有发行版)中,-I
不使用索引参数会将规则添加到索引,使其成为检查的第一个规则。在这种情况下,如果您运行的最后一个命令是,那么 iptables 将丢弃所有流量,无论您在链后面iptables -I INPUT -s tcp 0.0.0.0/0 -j DROP
是否有任何规则。ACCEPT
以下是设置仅允许来自单个 IP 的 SSH 规则的示例:
无规则开始:
#> 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
添加新的“允许来自 1.2.3.4 的 SSH”规则:
#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT
阻止来自所有其他 IP 的 SSH:
#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
现在你的 INPUT 链将如下所示:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 1.2.3.4 0.0.0.0/0 tcp dpt:22
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
稍后,如果您需要将第二个 IP 列入白名单,您可以使用该-I
参数将其放置在黑名单规则之前。
#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 1.2.3.4 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 4.3.2.1 0.0.0.0/0 tcp dpt:22
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
请注意,使用-I INPUT 2
添加了新规则作为规则 2,并将 DROP 规则增加到规则 3。
答案3
虽然我建议使用 SSH 密钥,但我会给你一个解释。
您不必使用 IPtables 来实现您想要实现的目标,有多种方法。这是 IPtables 的方式:
iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT
[YOUR_HOME_IP]
= 你的家庭IP(非常简单)
[SSH_PORT]
= 您运行 SSH 的端口(默认为 22)
iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT
这可以确保除了您的 IP 之外没有人可以登录 SSH。
还有另一种方法,就是在sshd_config
.
添加以下内容:
AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password
这允许您以用户身份从您的 IP 登录 SSH,root
而无需询问密码。
请记住,一个 cronjob 与
iptables -X
iptables -F
可能很聪明,这样你就不会被 SSH 锁定在你的服务器之外(cronjob 将重置 IPtables,这样你就可以再次访问)。如果您仍然可以访问,您可以删除 cronjob 并重新设置您的 IPtables。
答案4
我在用着乌夫沃(简单的防火墙)为此,因此想贡献我的设置。 Ufw 在后台使用 iptables,但对于此类简单的任务具有更简单的界面。
我只需要发出:
sudo ufw allow from <your-ipv4-here> to any port 22
sudo ufw allow from <your-ipv6-here> to any port 22
就是这样。
当然,您也可以默认拒绝任何其他传入流量并允许传出流量。
sudo ufw default deny incoming
sudo ufw default allow outgoing
希望这对某人有帮助。