NAT或网络地址转换是用于处理数据包以便将其重定向到备用地址的通用术语。通常,这用于允许流量超越网络边界。实现NAT的主机通常可以访问两个或多个网络,并配置为在它们之间路由流量。
端口转发是将对特定端口的请求转发到另一个主机,网络或端口的过程。由于此过程在运行中修改了数据包的目的地,因此被认为是NAT操作的一种。
在本指南中,我们将演示如何iptables使用NAT技术将端口转发到防火墙后面的主机。如果您已经配置了专用网络,但仍希望允许特定网关内部的某些流量通过,则这很有用。我们将使用两个Ubuntu 14.04主机进行演示。
先决条件和目标
要遵循本指南,您将需要在同一数据中心中启用了专用网络的两个Ubuntu 14.04主机。在每台计算机上,您将需要设置一个具有sudo特权的非root用户帐户。您可以sudo按照我们的Ubuntu 14.04初始服务器设置指南学习如何创建具有特权的用户。
第一台主机将充当我们专用网络的防火墙和路由器。出于演示目的,将为第二台主机配置一个Web服务器,该Web服务器只能使用其专用接口进行访问。我们将配置防火墙计算机,以将在其公共接口上收到的请求转发到Web服务器,该Web服务器将在其私有接口上到达该服务器。
主机详情
在开始之前,我们需要知道两个服务器都在使用什么接口和地址。
要获取您自己的系统的详细信息,请先找到您的网络接口。您可以通过键入以下内容来找到计算机上的接口以及与它们关联的地址:
ip -4 addr show scope global
Sample Output
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever
上面突出显示的输出显示了两个接口(eth0和eth1)以及分配给每个接口的地址(192.51.100.45和192.168.1.5)。要找出这些接口中的哪个是您的公共接口,请输入:
ip route show | grep default
Output
default via 111.111.111.111 dev eth0
显示的接口(eth0在此示例中)将是连接到默认网关的接口。这几乎可以肯定是您的公共界面。
在每台机器上找到这些值,并使用它们正确遵循本指南。
本指南的样本数据
为了使后续操作更容易,我们将在本教程中使用以下虚拟地址和接口分配。请用您自己的值替换您在下面看到的值:
Web服务器网络详细信息:
公用IP地址:203.0.113.2
专用IP地址:192.0.2.2
公共接口:eth0
专用接口:eth1
防火墙网络详细信息:
公用IP地址:203.0.113.15
专用IP地址:192.0.2.15
公共接口:eth0
专用接口:eth1
设置Web服务器
我们将从Web服务器主机开始。与您的登录sudo用户开始。
安装Nginx
我们将完成的第一个过程是Nginx在Web服务器主机上安装并锁定它,使其仅侦听其专用接口。这将确保只有正确设置端口转发后,我们的Web服务器才可用。
首先,更新本地程序包缓存,并apt用于下载和安装软件:
sudo apt-get update
sudo apt-get install nginx
将Nginx限制为专用网络
安装Nginx之后,我们将打开默认的服务器块配置文件,以确保它仅侦听私有接口。立即打开文件:
sudo nano /etc/nginx/sites-enabled/default
在内部,找到listen指令。您应该在配置顶部连续两次找到它:
/ etc / nginx / sites-enabled / default
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; . . . }
在第一个listen指令中,在前面添加Web服务器的私有IP地址和冒号,80以告知Nginx仅在私有接口上侦听。我们仅在本指南中演示IPv4转发,因此我们可以删除为IPv6配置的第二个监听指令。
在我们的示例中,我们将修改listen指令看起来像这样:
/ etc / nginx / sites-enabled / default
server { listen 192.0.2.2:80 default_server; . . . }
完成后保存并关闭文件。通过键入以下内容来测试文件中的语法错误:
sudo nginx -t
如果未显示任何错误,请重新启动Nginx以启用新配置:
sudo service nginx restart
验证网络限制
此时,验证我们对Web服务器的访问级别非常有用。
从我们的防火墙服务器,如果我们尝试从私有接口访问我们的Web服务器,它将正常工作:
curl --connect-timeout 5 192.0.2.2
Output
Welcome to nginx!
Welcome to nginx!
. . .如果尝试使用公共接口,我们将看到无法连接:
curl --connect-timeout 5 203.0.113.2
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused
这正是我们期望发生的事情。
配置防火墙以转发端口80
现在,我们可以在防火墙计算机上实施端口转发。
在内核中启用转发
我们需要做的第一件事是在内核级别启用流量转发。默认情况下,大多数系统都关闭了转发功能。
要仅为此会话打开端口转发,请输入:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
要永久打开端口转发,您必须编辑/etc/sysctl.conf文件。sudo通过键入以下特权来打开文件:
sudo nano /etc/sysctl.conf
在内部,找到并取消注释如下所示的行:
/etc/sysctl.conf
net.ipv4.ip_forward=1
完成后保存并关闭文件。通过键入以下内容来应用此文件中的设置:
sudo sysctl -p
sudo sysctl --system
设置基本防火墙
我们将本指南中的防火墙用作本教程中规则的基本框架。现在,请在您的防火墙计算机上仔细阅读指南以进行设置。完成后,您将具有:
已安装iptables-persistent
将默认规则集保存到/etc/iptables/rules.v4
了解了如何通过编辑规则文件或使用iptables命令来添加或调整规则
设置基本防火墙后,请继续以下操作,以便我们为端口转发进行调整。
添加转发规则
我们要配置防火墙,以便eth0在端口80上流入我们的公共接口()的流量将被转发到我们的私有接口(eth1)。
我们的基本防火墙默认情况下将我们的FORWARD链设置为DROP流量。我们需要添加规则,以允许我们将连接转发到Web服务器。为了安全起见,我们将对此进行相当严格的锁定,以便仅允许我们希望转发的连接。
在此FORWARD链中,我们将接受发往端口80的新连接,这些连接来自我们的公共接口,并已进入我们的私有接口。新连接由conntrack扩展名标识,并将具体由TCP SYN数据包表示:
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
这将使第一个要建立连接的数据包通过防火墙。我们还需要允许该连接产生的双向双向流量。为了让ESTABLISHED和RLEATED我们的公共和私有接口,类型之间的流量:
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
我们可以通过输入以下内容FORWARD再次检查我们对链的策略是否设置为DROP:
sudo iptables -P FORWARD DROP
在这一点上,我们已经允许我们的公共接口和私有接口之间的某些流量通过防火墙进行。但是,我们尚未配置规则,这些规则实际上将告诉您iptables如何转换和定向流量。
将NAT规则正确添加到直接数据包
接下来,我们将添加规则,这些规则将告诉您iptables如何路由流量。我们需要执行两个单独的操作,以便iptables正确更改数据包,以便客户端可以与Web服务器通信。
第一个操作称为DNAT,将PREROUTING在nat表的链中进行。DNAT是一种更改数据包目的地址的操作,以使其在网络之间传递时能够正确路由。公共网络上的客户端将连接到我们的防火墙服务器,并且不了解我们的私有网络拓扑。我们需要更改每个数据包的目标地址,以便在通过专用网络发送数据包时知道如何正确访问我们的Web服务器。
由于我们仅配置端口转发,而不对到达防火墙的每个数据包都执行NAT,因此我们希望根据规则匹配端口80。我们将针对端口80的数据包与Web服务器的专用IP地址进行匹配(192.0.2.2在我们的示例中):
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2
这将处理一半的图片。该数据包应正确路由到我们的Web服务器。但是,现在,数据包仍将客户端的原始地址作为源地址。服务器将尝试直接将回复发送到该地址,这将导致无法建立合法的TCP连接。
要配置适当的路由,我们还需要修改数据包的源地址,因为它会在离开防火墙的途中到达Web服务器。我们需要将源地址修改为防火墙服务器的专用IP地址(192.0.2.15在我们的示例中)。然后,答复将发送回防火墙,然后防火墙可以按预期将其转发回客户端。
为了启用此功能,我们将在POSTROUTING表链中添加一条规则,该规则将nat在数据包通过网络发送出去之前立即进行评估。我们将按IP地址和端口匹配发往Web服务器的数据包:
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15
一旦制定了此规则,就可以通过将我们的Web浏览器指向防火墙计算机的公共地址来访问我们的Web服务器:
curl 203.0.113.15
Output
Welcome to nginx!
Welcome to nginx!
. . .我们的端口转发设置已完成。