我目前有一个 NAS 盒子在端口 80 下运行。为了从外部访问 NAS,我将端口 8080 映射到 NAS 上的端口 80,如下所示:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.32.25.2:80
这就像一个魅力。但是,只有当我从网络外部(在工作中、在不同的房子等)访问该网站时,这才有效。因此,当我输入 时mywebsite.com:8080
,IPTables 会正确完成工作,并且一切正常。
现在,我遇到的问题是,如何从网络内部重定向此端口?我的域名mywebsite.com
从内部(10.32.25.1)指向我的路由器(我的linux服务器),但我想从内部将端口8080重定向到10.32.25.2上的端口80。
有什么线索吗?
编辑#1
为了帮助解决这个问题,我将这张图放在一起。如果它不正确或歪曲了您要查找的内容,请随时更新。
iptables
| .---------------.
.-,( ),-. v port 80 |
.-( )-. port 8080________ | |
( internet )------------>[_...__...°]------------->| NAS |
'-( ).-' 10.32.25.2 ^ 10.32.25.1 | |
'-.( ).-' | | |
| '---------------'
|
|
__ _
[__]|=|
/::/|_|
答案1
我终于找到了方法。首先,我必须添加-i eth1
我的“外部”规则(eth1 是我的 WAN 连接)。我还需要添加另外两条规则。最后我得到了什么:
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A POSTROUTING -p tcp -d 10.32.25.2 --dport 80 -j MASQUERADE
答案2
您还忘记提及应启用包转发才能执行目标 NAT。默认情况下,它通常是关闭的,因此 iptables 规则将不起作用。可以通过发出以下命令来启用它:
echo 1 > /proc/sys/net/ipv4/ip_forward
答案3
首先允许转发
echo 1 > /proc/sys/net/ipv4/ip_forward
然后设置 iptable 规则
IF=eth1
PORT_FROM=8080
PORT_TO=80
DEST=10.32.25.2
iptables -t nat -A PREROUTING -i $IF -p tcp --dport $PORT_FROM -j DNAT --to $DEST:$PORT_TO
iptables -t nat -A POSTROUTING -p tcp -d $DEST --dport $PORT_TO -j MASQUERADE
您可以将这些行放入/etc/rc.local
例如。注意:由于 Debian jessie 使其可执行并通过以下方式启用了 rc.local 服务
systemctl enable rc-local.service
答案4
首先,您需要验证您是否已激活转发:
cat /proc/sys/net/ipv4/ip_forward
如果没有1
,就跑echo 1 > /proc/sys/net/ipv4/ip_forward
。
如果您希望将到达 10.32.25.1 端口 80 和 443 的流量转发到 10.32.25.2 的 80 端口,那么您应该使用以下规则:
iptables -t nat -A PREROUTING -d 10.32.25.1 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.32.25.2:80