iptables:转发 ssh 端口

iptables:转发 ssh 端口

我有一台带有两个 NIC 的服务器:eth4 - 监听外部网络。eth1 - 与机器 Y 位于同一网络上。

我希望能够通过以下步骤ssh server -p 1234从外部网络 ssh 进入机器 Y:

我制定了以下规则:

iptables -A PREROUTING -i eth4 -t nat -p tcp --dport 1234 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to-destination $MACHINE_Y_IP:22

iptables -A FORWARD -i eth4 -o eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

当我尝试 ssh 时,连接不会立即被拒绝,但感觉 iptables 没有转发数据包。我可能做错了什么,有什么线索吗?操作系统是 SLES,如果这对语法很重要的话。

编辑: sysctl net.ipv4.ip_forward报告net.ipv4.ip_forward = 1

iptables-save产生:

`# Generated by iptables-save v1.4.2-rc1 on Fri Nov 12 10:28:26 2010
*mangle
:PREROUTING ACCEPT [48787:5748712]
:INPUT ACCEPT [48725:5742333]
:FORWARD ACCEPT [29:1740]
:OUTPUT ACCEPT [25938:4009532]
:POSTROUTING ACCEPT [25967:4011272]
COMMIT
# Completed on Fri Nov 12 10:28:26 2010
# Generated by iptables-save v1.4.2-rc1 on Fri Nov 12 10:28:26 2010
*nat
:PREROUTING ACCEPT [68959:12817029]
:POSTROUTING ACCEPT [19579:1207747]
:OUTPUT ACCEPT [19566:1206967]
-A PREROUTING -i eth4 -p tcp -m tcp --dport 1234 -m state --state NEW,RELATED,ESTABLISHED -j DNAT --to-destination x.x.x.x:22 
COMMIT
# Completed on Fri Nov 12 10:28:26 2010
# Generated by iptables-save v1.4.2-rc1 on Fri Nov 12 10:28:26 2010
*filter
:INPUT ACCEPT [60982622:59727981305]
:FORWARD ACCEPT [10:600]
:OUTPUT ACCEPT [32438834:64059260511]
-A FORWARD -i eth4 -o eth1 -p tcp -m tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Fri Nov 12 10:28:26 2010`

答案1

规则应该是这样的。

iptables -t nat -I PREROUTING -p tcp -i eth4 --dport 1234 -j DNAT --to server:22
iptables -A FORWARD -i eth4 -o eth1 -p tcp --dport 22 -j ACCEPT

不要费心混入状态模块。这很可能是导致问题的原因。NAT 模块将保留您需要的状态。

哦,请确保您也打开了 ip_forwarding ;)

答案2

以下是我的工作规则 - 但我使用状态模块:

*nat
:PREROUTING ACCEPT [101:9081]
:POSTROUTING ACCEPT [89:5340]
:OUTPUT ACCEPT [209:13346]

# DNAT to local ip
#-A PREROUTING -p tcp --dport $FW_EXTERNAL_PORT -d $FW_EXTERNAL_IP -j DNAT --to-destination $INTERNAL_MACHINE_IP:$INTERNAL_MACHINE_PORT

# ssh to server 192.168.0.3
-A PREROUTING -p tcp --dport 1234 -d 10.10.10.10 -j DNAT --to-destination 192.168.0.3:22
...
COMMIT

*filter
:INPUT ACCEPT [5583:2021142]
:FORWARD DROP [24:2378]
:OUTPUT ACCEPT [6291:2229990]

#rules for DNAT
#-A FORWARD -p tcp --dport $INTERNAL_MACHINE_PORT -d $INTERNAL_MACHINE_IP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# SSH to 192.168.0.3
-A FORWARD -p tcp --sport 22 -s 192.168.0.3 -j ACCEPT
-A FORWARD -p tcp --dport 22 -d 192.168.0.3 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
... 
COMMIT

答案3

我希望您的 iptables 配置比您向我们展示的更多。在 *filter 表中,INPUT 默认设置为接受。对于 iptables 新手,他们可能会接受并运行它,从而使他们的系统暴露在外。您可能希望将过滤器中的默认链设置为 DROP,然后仅打开您想要访问您的盒子的端口,否则您将拥有一个“链环围栏”而不是防火墙。使用您的 POSTROUTING 规则,它会起作用,但您必须为每个打开的端口创建类似的规则。类似这样的 [iptables -A POSTROUTING -t nat -o eth4 -j SNAT --to pu.bl.ic.ip] 适用于所有通往外部接口的端口。在 FORWARD 链中,使用“双保险”来保护您的盒子是个好主意。您可以添加 -s yo.ur.ext.ip,这样如果其他人试图访问该端口,他们将被丢弃。我希望这对某些人有帮助。

相关内容