iptable做为网络防火墙工作时,其物理设备工作在我们内网的边缘,通常作为路由器与外网连接,经过该防火墙的的数据报文会经由网卡转发,而不再进入其本机内部,于是我们需要先将该网络防火墙的ip_forward功能打开,将其值设置为1,然后在PREROUTING,POSTROUTING链上定义相应的规则。
在这种场景下工作的iptables对应的表为nat,对应的nat表中有3个链:POSTROUTING,PREROUTING和FORWARD,默认FORWARD链的规则也要设置为DROP,然后在此基础之上做相应的规则放行安全的数据连接。
一、内网的服务器对外(服务器与客户端之间还是在一个局域网内或者服务器是在公网上)提供服务,网关防火墙的FORWARD链做相应的设置:
模拟使用的测试用机为三台虚拟机:
TESTVM:192.168.1.129(视为外网主机,真实的应用中是其他外网的主机,网关指向是它所在网络的网关设备,实验中网关指向的是192.168.1.138这台网关设备),网关为192.168.1.138
GATEWAYVM:192.168.1.138,有两块网卡,与外网通信的IP为192.168.1.138,另外有一块内网的网卡,作为内网主机的网关,其IP地址为192.168.3.1。
内网提供服务的主机为:192.168.3.100,网关指向为192.168.3.1
网关防火墙192.168.1.138要达到保护内网服务器安全的目的,过滤数据包的效果,其默认的FORWARD链的规则要定义为DROP,只允许规则匹配的数据报文通过,示例:
# iptables -P FORWARD DROP
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT;作为网关防火墙,其保护的内网服务器可能会不止一台,而状态为已建立连接和RELATED状态的数据报文通常都是安全的数据报文,在转发至相应的服务器时,都设置为允许,如果只有一台服务器,那么可以写上IP地址,如果有多台,那么就不能写具体的转发至哪台服务器。
# iptables -A FORWARD -d 192.168.3.100 -p tcp --dport 80,22 -m state --state NEW -j ACCEPT;放行对应服务器开放的可用服务的端口
特殊应用ftp的端口开放方式:
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80,22,21 -m state --state NEW -j ACCEPT
# modprobe nf_conntrack_ftp;加载对应的nf_conntrack_ftp模块,就能够放行ftp后续的数据连接请求报文,或者编辑配置文件:
# vim /etc/sysconfig/iptables-config,添加iptables开机需要加载的模块:
二、网络地址转换(SNAT),适用于多个主机共享一个公网IP地址上网的情形(snat,发出请求的客户端在私有地址网段内,要访问的资源在公网),用前面3台虚拟机模拟,内网主机192.168.3.100作为客户端,通过防火墙192.168.1.138访问位于外网的服务器192.168.1.129,129这台主机上提供有Web服务。
# iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 192.168.1.138
添加规则后在提供httpd服务的192.168.1.129主机上测试,查看访问日志的结果为:
其效果为防火墙对应的IP地址访问的效果。
有些情况下使用代理的方式代理局域网内多台主机共享一个公网地址上网,而公网地址是不是固定的,方式为:
# iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j MASQUERADE
三、网络地址转换(DNAT)
几台主机的关系为内网的虚拟主机192.168.3.100对外提供web服务,而外网的客户端192.168.1.129要访问到内网的web服务器,而内网的边缘设备即防火墙有一个对外的公网地址为192.168.1.138。要实现访问内网的web服务器,设置方法:
# iptables -t nat -A PREROUTING -d 192.168.1.138 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.100
验证方式:
将192.168.1.129主机指向的网关删除
然后测试能否ping通192.168.3.100:
现在192.168.1.129这台外网主机无法访问到192.168.3.100这台内网的服务器。使用测试工具测试访问192.168.3.100的web服务,效果如下:
用相同的命令测试外网路由设备的IP地址对应的web服务:
从结果上看访问的是一个网络对外提供的公网IP地址,而访问到的web服务是其内网设备提供的web页面。