为什么Ubuntu 16转发不起作用?

为什么Ubuntu 16转发不起作用?

我尝试实现非常简单的 Ubuntu 从一个 IP 到另一个 IP 的转发。我不关心该阶段的安全性(它现在在沙盒中运行),我只需要它能正常工作。

我将FORWARD策略设置为ACCEPT并在 中启用了转发sysctl.conf。接下来,我添加了 TCP 转发规则,因此我有以下内容:

# Filter settings
*filter
# Disallow incoming traffic
:INPUT DROP
# Allow forward traffic
:FORWARD ACCEPT
# Allow outgoing traffic
:OUTPUT ACCEPT

COMMIT


*nat
:PREROUTING ACCEPT
:POSTROUTING ACCEPT
:OUTPUT ACCEPT

# Required to share Internet
-A POSTROUTING -j MASQUERADE

-A PREROUTING -p tcp -d 192.168.0.107 --dport 80 -j DNAT --to-destination 192.168.0.100:80

COMMIT

Ubuntu 电脑 IP 是192.168.0.107。另一台电脑 IP 是192.168.0.100。因此,我想将 Ubuntu 80 端口重定向到另一台电脑地址。另一台电脑运行 HTTP 服务器,因此http://192.168.0.100在 Ubuntu 电脑上打开演示网页。

但是,当我尝试打开时http://192.168.0.107,它失败了。当我运行curl以获取更好的错误消息时,我得到了这个:

curl: (7) Failed to connect to 192.168.0.107 port 80: Connection refused

有人知道这个错误的原因吗?

答案1

这个答案基于这样的假设:您尝试在同一个子网上通过一个网络接口进行端口转发,这是不寻常的。

您没有正确处理返回路径或使用正确的前置和后置路由表。您必须映射返回的数据包,以便发送方认为它来自最初发送请求的原始 IP 地址。这是一个经过测试的示例,但适用于我的 LAN:

#!/bin/sh
#
# 1070028_firewall 2018.08.09 Ver:0.01
#       Basic port forwarding on one interface.
#       Note: this method is unusual.
#       Currently for this question:
#       https://askubuntu.com/questions/1070028/why-does-ubuntu-16-forwarding-not-work
#

# The location of the iptables program
#
IPTABLES=/sbin/iptables

# Set some stuff
#
EXTIF="ens5"
UNIVERSE="0.0.0.0/0"
EXTIP="192.168.111.120"

#
echo Enabling forwarding...
echo "1" > /proc/sys/net/ipv4/ip_forward

# Clearing any previous configuration
# and setting policies as per the question

iptables -P INPUT DROP
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD ACCEPT
iptables -F FORWARD
iptables -t nat -F
iptables -X

# Clear the counters

iptables -Z
iptables -t nat -Z

# loopback interfaces are valid.

$IPTABLES -A INPUT -i lo -s $UNIVERSE -d $UNIVERSE -j ACCEPT

# forward path

$IPTABLES -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to 192.168.111.1:80

# with a default policy of ACCEPT, the following rule is not needed.
# shown here for completeness only.

# $IPTABLES -A FORWARD -p tcp -i $EXTIF -d 192.168.111.1 --dport 80 -j ACCEPT

# return path

$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j SNAT --to-source $EXTIP

您应该可以使用 MASQUERADE 代替 SNAT,但我没有测试过。

相关内容