场景1

场景1

我正在尝试配置服务器的 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

所以你的规则是这样说的:

  1. 追加INPUT
  2. 对于使用 TCP 且目的地为端口 22 的数据包
  3. 来自这个源地址
  4. 我们会接受他们。

有两种方法可以做到这一点,你的问题似乎有点模糊(至少对我来说),所以我将回答所有三种情况:

场景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。

相关内容