我正在尝试允许另一个子网中的计算机通过 ssh 访问防火墙后面的计算机。防火墙后面的计算机位于 10.66.1.1/255.255.0.0,而另一台计算机位于 10.99.1.1/255.0.0.0。
我尝试向 iptables 添加以下规则,但仍然无法访问受防火墙保护的计算机。
iptables --append INPUT --match tcp --protocol tcp --src 10.99.1.1 --sport 22 --dst 10.66.1.1 --dport 22 --jump ACCEPT
答案1
消除--sport 22
源端口是随机的。
答案2
解决方案 :
删除规则中的源端口,您将得到如下规则:
iptables -A INPUT -p tcp -s 10.99.1.1 -d 10.66.1.1 -m tcp --dport 22 -j ACCEPT
解释:
首先,我们假设没有路由问题,只有防火墙配置。
计算机 10.99.1.1(客户端)想要在 10.66.1.1(服务器)上打开 SSH 会话。
服务器必须:
- 拥有一个可操作且配置好的 ssh 服务器
- 让防火墙打开 SSH 端口(默认为 22):
iptables -A INPUT -p tcp -s 10.99.1.1 -m tcp --dport 22 -j ACCEPT
中间防火墙应该有一个 iptable 规则,例如:
iptables -A INPUT -p tcp -s 10.99.1.1 -d 10.66.1.1 -m tcp --dport 22 -j ACCEPT
你所犯的错误是指定源端口。服务器上只需要指定目标端口。
客户端不使用 22 端口作为 SSH 连接的源端口。客户端向服务器请求在端口 22 上建立新的 ssh 会话,但使用本地随机端口。
您可以使用来检查netstat -taupenl|grep ':22'
,您至少应该看到:
tcp 0 0 0.0.0.0:22 0.0.0.0:* 侦听 0 11242 540/sshd tcp 0 0 ip.服务器:22 ip.客户端:35332 已建立 0 570915 12917/0
第一行匹配ssh服务器的监听端口,第二行匹配当前与客户端的ssh连接,你可以看到使用的端口,服务器的端口是22,客户端的端口是35332。
[Client]:35332 <----> [Server]:22
由于客户端端口是根据客户端的可用性随机使用的,因此您不应指定源端口。
答案3
如果子网掩码确实像您在帖子中描述的那样,尤其是10.99.1.1/255.0.0.0
,那么您无法使用 IPTables 对此做任何事情。
的子网掩码255.0.0.0
告诉计算机,以 开头的每个 IP 地址都10.
与计算机本身位于同一个 L2 广播域中。这意味着10.99.1.1
将尝试将所有发往 的数据包10.66.1.1
直接发送到同一个网络,而不尝试任何路由。
同时,由于10.66.1.1
具有网络掩码255.255.0.0
,来自该计算机的数据包将被路由到10.99.1.1
。
您需要先修复您的路线。
答案4
您必须定义掩码位:
iptables --append INPUT --match tcp --protocol tcp --src 10.99.1.0/8 --dport 22 --jump ACCEPT