上面的这行在iptables中仅仅是指任何本网段的机器当目标就是防火墙时被拒绝,但绝不影响NAT和转发包, 这在以前的ipchains中是不可能的。
3. 透明代理和端口转发功能的轻松实现
a. 端口转发
在Linux 2.4内核中,NAT分为 SNAT(源NAT)和DNAT(目的NAT)。我们可以利用SNAT和DNAT轻松地实现透明代理,重定向和端口转发功能。
假定某公司的网络结构如下图:
10.0.0.2 | |
|PC | (10.0.0.1)eth1| |eth0(1.2.3.4), eth0:0(1.2.3.5)
B|___|_ ___________________|防火墙 |---------Internet
(LAN: | 10.0.0.0/24) | A |
| |_______|
|
_____
| |
| C | Linux POP3 server
|_____| IP: 10.0.0.3 gw: 10.0.0.1
当一个包被路由,转发后送出之前进行源地址改写,源地址改为1.2.3.5(防火墙上的别名IP)
iptables -t nat -A POSTROUTING -s 10.0.0.3 -o eth0 -j SNAT --to 1.2.3.5
IP伪装是SNAT的特例,当需要伪装时,其实不需要外界主动对源地址进行请求。而上面的例子是指局域网内部有一台Linux POP3服务器,IP为10.0.0.3, 网关为10.0.0.1,且在防火墙外部网卡上绑定一个IP别名1.2.3.5,作为该POP3服务器对外界联系的出去的源IP地址。对外部用户来说(公司员工在外出差),这个IP 1.2.3.5就是POP3服务器的IP地址,当向这个IP请求时我们用DNAT送到10.0.0.3上从而实现端口转发的功能。
iptables -t nat -A PREROUTING -i eth0 -d 1.2.3.5 -j DNAT --to 10.0.0.3
则这两行规则即可实现端口转发的功能。
b. 透明代理(重定向)
最常见的透明代理的使用是结合开放源代理软件Squid,实现局域网内用户在不用设置任何浏览器代理
的条件下透明地使用代理上网。 如果我们的Squid的HTTP端口运行在 3333,则使用下面的规则:
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 10.0.0.0/24 --dport 80 -j
DNAT --to 10.0.0.1:3333
而且还必须设置Squid 2.3 或者2.4 版本中的squid.conf如下:
http_port 3333
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
这样,局域网内的用户即使不设置任何代理,也同样是利用了Squid的代理上网。
四 常见问题解答
a. 在运行中的防火墙规则如何保存下来,供redhat的ntsysv中的iptables服务使用?
使用 iptables-save和iptables-restore保存为文件/etc/sysconfig/iptables,再用ntsysv启动iptables服务使用
b. 我能同时使用ipchains和iptables吗?
不行。在使用iptalbes之前,你必须停止ipchains及任何内存中的与ipchains相关的模 块,用/sbin/lsmod 检查所有ipchains模块,用/sbin/rmmod逐一删除,最后再运行iptables规则。