我正在尝试配置服务器的 Iptables,以便仅允许来自特定网络的 SSH 传入连接。
顺便说一句,这是规则链:
# Drop anything we aren't explicitly allowing. All outbound traffic is okay
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type echo-reply -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
# Accept Pings
-A RH-Firewall-1-INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Log anything on eth0 claiming it's from a local or non-routable network
# If you're using one of these local networks, remove it from the list below
-A INPUT -i eth0 -s 10.0.0.0/8 -j LOG --log-prefix "IP DROP SPOOF A: "
-A INPUT -i eth0 -s 172.16.0.0/12 -j LOG --log-prefix "IP DROP SPOOF B: "
-A INPUT -i eth0 -s 192.168.0.0/16 -j LOG --log-prefix "IP DROP SPOOF C: "
-A INPUT -i eth0 -s 224.0.0.0/4 -j LOG --log-prefix "IP DROP MULTICAST D: "
-A INPUT -i eth0 -s 240.0.0.0/5 -j LOG --log-prefix "IP DROP SPOOF E: "
-A INPUT -i eth0 -d 127.0.0.0/8 -j LOG --log-prefix "IP DROP LOOPBACK: "
# Accept any established connections
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept ssh traffic. Restrict this to known ips if possible.
-A INPUT -p tcp -s 88.253.5.38 --dport 22 -j ACCEPT
# Opening port 80 and port 443 in order to allow http and https requests
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
#Log and drop everything else
-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j DROP
COMMIT
使用以下命令保存这些规则似乎可以正确应用它们:
/etc/init.d/iptables 重新启动 && 服务 iptables 保存
# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
25332 17M RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 LOG all -- eth0 * 10.0.0.0/8 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP SPOOF A: '
0 0 LOG all -- eth0 * 172.16.0.0/12 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP SPOOF B: '
0 0 LOG all -- eth0 * 192.168.0.0/16 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP SPOOF C: '
0 0 LOG all -- eth0 * 224.0.0.0/4 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP MULTICAST D: '
0 0 LOG all -- eth0 * 240.0.0.0/5 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP SPOOF E: '
0 0 LOG all -- eth0 * 0.0.0.0/0 127.0.0.0/8 LOG flags 0 level 4 prefix `IP DROP LOOPBACK: '
0 0 ACCEPT tcp -- * * 88.253.5.38 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 25163 packets, 17M bytes)
pkts bytes target prot opt in out source destination
Chain RH-Firewall-1-INPUT (2 references)
pkts bytes target prot opt in out source destination
24175 17M ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 0
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 3
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 11
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8
1052 121K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
94 6016 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
11 440 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4
11 440 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
我遇到困难的关键部分是:
-A INPUT -p tcp -s 88.253.5.38 --dport 22 -j ACCEPT
我想要实现的是只允许来自我所在的 LAN 的连接,为此我已经检查过从这里我的路由器的外部IP(它是静态IP),它返回让我们说88.253.5.38
我的主要疑问是,我使用路由器的外部 IP 做的事情是否正确?或者我应该使用我的机器的内部IP,还是内部IP地址的范围?
或者也许整个链存在一些冲突,不允许我尝试进行的配置?
感谢您的推动,我真的陷入困境
答案1
我使用路由器的外部 IP 做的事情正确吗?或者我应该使用我的机器的内部IP,还是内部IP地址的范围?
TL;DR:如果您的服务器与您自己的计算机“跨互联网”,则您可以在规则中使用路由器的地址iptables
。
更长的答案:
防火墙规则从受防火墙保护的设备的角度起作用。理想情况下,世界上的每台设备都有自己的 IP 地址。但他们没有,而且我们有一种丑陋的黑客技术,称为 NAT。在简单的情况下,这是一个设备或软件,它采用一系列 IP 地址(例如 192.168.1.*)并将它们映射到单个 IP 地址。 192.168.* 地址保证是不可路由的,因此永远无法在真实的 Internet 上找到它们。每个人的网络都隐藏在 NAT 设备后面,因此每个网络都呈现为单个唯一的 IP 地址。因此,许多人可以在其内部网络上使用相同的地址范围 192.168.*,因为其他人无法直接看到它们。
那么,回到问题。
如果您的服务器位于 NAT 网络“外部”,那么它将只能看到单个公共地址。这就是iptables
规则中必须包含的内容。
另一方面,如果您的服务器连接到您自己的网络,并且它们之间没有 NAT 设备,则必须使用实际的内部地址。
这是 IPv4 Internet 寻址的丑陋现实的高度简化版本,但它应该可以帮助您入门。
现在回答您的具体问题,这就是您的iptables
规则无法按预期工作的原因。从链条开始INPUT
并按顺序进行。第一行称为 chain RH-Firewall-1-INPUT
。当您执行此操作时,您将看到一对ACCEPT
在端口 80 和 443 上进行流量的规则。然后还有一条DROP
适用于其他所有内容的规则。在该链的末端,我们返回INPUT
并最终到达您的ACCEPT
端口 22。但是此时所有流量都已被丢弃,因此该规则无关紧要。
ACCEPT
这里的解决方案是将端口 22 的规则移动到RH-Firewall-1-INPUT
链中,紧接在端口 80 和 443 的规则之后,但在 catch-all 之前DROP
。
我怀疑正确的解决方案是学习使用firewalld
,但我不知道它是否在 CentOS 6.x 中可用,或者它是否仅在 CentOS 7 中首次出现。
答案2
所以你的规则是这样说的:
- 追加
INPUT
链 - 对于使用 TCP 且目的地为端口 22 的数据包
- 来自这个源地址
- 我们会接受他们。
有两种方法可以做到这一点,你的问题似乎有点模糊(至少对我来说),所以我将回答所有三种情况:
场景1
您希望来自给定公共 IP 地址的任何人都可以访问此框。
您的规则目前是这样写的。如果我坐在家里并且我的公共 IP 是,88.253.5.38
那么我可以通过 SSH 访问您在工作场所或其他地方的盒子。*
*可能不正确,但为了简单起见,我们将忽略它。例如,如果您的此盒子位于另一个防火墙后面,那么您将需要转发。
场景2
您希望办公室(或内部网络)的某人访问此框。
您的规则只需要稍微改变即可。只有IP会改变。
因此,我位于 10.0.0.0/8 网络上,我的工作站的静态 IP 为 10.0.0.127,那么您可以将规则更改为:
-A INPUT -p tcp -s 10.0.0.127 --dport 22 -j ACCEPT
这意味着工作站 IP 为 10.0.0.128 的 Bob 将无法通过 ssh 访问这台机器。
场景3
您希望办公室(或内部网络)中的任何人都可以访问此框。
你的规则变化最大,但仍然没有那么大。
再一次,我位于 10.0.0.0/8 网络上,我希望 IP 在 10.0.0.1-10.0.0.254 范围内的任何人都可以访问此框。嗯,我知道这是一个 /24 网络,所以:
-A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT
这意味着 IP 为 10.0.0.1.127 的 Charlie 无法通过 SSH 访问此盒子。
希望这能为您解决问题!
答案3
尝试关闭防火墙,然后通过 ssh 连接到您的服务器。最后键入以查看您来自的 IP。使用新的(我期望的)IP 地址重新配置时打开 iptables。