实现SNAT
此实验内网服务器访问外网服务器的80端口,因为内网与外网不在同一个网段,所以内网服务器网关需要指向防火墙内网IP,防火墙公网IP与外网服务器在同一个网段,他们两个之间是直连,所以外网服务器不需要配置网关;
防火墙配置iptables规则
情景一:源地址转换为防火墙固定公网IP
地址转换的规则需要添加在nat表 1、iptables -A FORWARD -j REJECT
#添加此规则,拒绝内网访问外网,外网访问内网 2、iptables -I FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已经建立连接的报文通过防火墙 3、iptables -I FORWARD 2 -p tcp --dport 80 -j ACCEPT #允许内网服务器访问公网服务器80端口的报文通过防火墙 4、iptables -t nat -A POSTROUTING -s 192.168.39.0/24 -j SNAT --to-source 192.168.1.101 #源地址转换的规则需要添加在nat表的postrouting链上,指定内网192.168.39.0/24网段的地址访问公网IP,把源地址转换为192.168.1.101防火墙公网IP地址,指定目标为SNAT;不管是局域网内服务器报文出去,还是防火墙本机报文出去,都需要汇总到postrouting链才可以把报文发送出去
情景二:家庭拨号上网,每次拨号上网的IP地址都不同
1、iptables -t nat -A POSTROUTING -s 192.168.39.0/24 -j MASQUERADE #通过MASQUERADE动作,把与互联网相连的拨号网络的公有IP地址伪装出去,即把每次拨号获取到的公网IP都一直伪装成一个拨号获取到的IP
实现DNAT
公网IP访问防火墙公网IP的80端口时,防火墙进行目标地址转换,把访问防火墙公网IP地址的请求转换成内网IP地址; 1、iptables -A FORWARD -j REJECT
#添加此规则,拒绝内网访问外网,外网访问内网 2、iptables -I FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已经建立连接的报文通过防火墙 3、iptables -I FORWARD 2 -p tcp --dport 8080 -j ACCEPT #防火墙可以做端口映射,把访问防火墙公网IP80端口的请求转换成内网IP的8080端口,防火墙需要允许转发8080端口的请求 4、iptables -t nat -A PREROUTING -d 192.168.1.101 -p tcp --dport 80 -j DNAT --to-destination 192.168.39.100:8080 #在防火墙的nat表的prerouting链上添加规则,当访问防火墙公网IP的192.168.1.101:80端口时,把目标地址做转换,转换成内网地址192.168.39.100:8080端口,防火墙可以做端口映射;此规则必须添加在prerouting链,客户端访问的是防火墙本机的公网IP,如果不添加在prerouting,则报文经过路由表检查,发现是发给本机的,报文会通过input链到应用程序,但是本机并没有监听80端口的应用,会造成访问拒绝,所以规则需要添加在prerouting链上
扩展:端口重定向
端口重定向规则只能用于重定向本机的不同端口,不能跨主机重定向端口; 1、iptables -t nat -A PREROUTING -d 192.168.39.100 -p tcp --dport 80 -j REDIRECT --to-ports 8080 #此规则也需要添加在nat表的prerouting链,本机并没有监听80端口的应用,所以需要设置在prerouting链;把访问本机192.168.39.100的80端口的请求重定向到本机的8080端口(会在内核中进行端口转换)