iptables实现ADSL拨号条件下的透明代理
作者:platinum
时间:2005-07-10
一. 基本情况:
1. 1台redhat as3up3机器
2. 两块网卡eth0(内网192.168.2.254),eth1(外网,通过ADSL拨号,上面跑ppp0)
3. # echo 1 > /proc/sys/net/ipv4/ip_forward
4. # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
5. 现在内网的192.168.2网段的机器可以共享上网了
6. 使用setup命令来配置防火墙,规则为:完全信任eth0,放开对eth1的80端口的访问
二. 问题所在:
1. 现在需要让公网上的机器访问外网卡的80端口,并转发到192.168.2.252的8080端口
2. # iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.2.252:8080
转发失败
三. 解决方案:
1. # chkconfig iptables off
2. # service iptables stop
3. # more /etc/rc.local
touch /var/lock/subsys/local
/bin/bash /usr/local/sbin/firewall
/bin/bash /usr/local/sbin/DNAT-IP &
4. # more /usr/local/sbin/firewall
#! /bin/bash
WAN=$(ifconfig ppp0|grep "inet"|awk '{print $2}'|awk -F: '{print $2}')
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -F -t nat
iptables -X
iptables -X -t nat
iptables -P INPUT DROP
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
iptables -t nat -A PREROUTING -d $WAN -p tcp --dport 80 -j DNAT --to 192.168.2.252:8080
5. # more /usr/local/sbin/DNAT-IP
#! /bin/bash
while true
do
WAN=$(ifconfig ppp0|grep "inet"|awk '{print $2}'|awk -F: '{print $2}')
iptables -t nat -R PREROUTING 1 -d $WAN -p tcp --dport 80 -j DNAT --to 192.168.2.252:8080
sleep 60
done
6. 将/etc/sysconfig/network-scripts/ifcfg-ppp0中的PPPOE_TIMEOUT=80,改为0,这样不会自动掉线
7. 让192.168.2.252机器的网关指向LINUX
方法是修改/etc/sysconfig/network及/etc/sysconfig/network-scripts/ifcfg-eth0这两个文件
指定GATEWAY=192.168.2.254
然后service network restart
8. 将ifcfg-eth1改为
# Realtek|RTL-8029(AS)
DEVICE=eth1
ONBOOT=no
BOOTPROTO=dhcp
附录:
1. 220.106.0.20是网通的dns,在254服务器上可以设置
方法为:在/etc/resolv.conf中添加nameserver 220.106.0.20
2. iptables -I INPUT -p tcp --dport 22 -j ACCEPT
可以让外网能ssh登录进来
iptables --line-numbers -L INPUT
可以查看上述规则的编号,比如说是2
iptables -D INPUT 2
删除上述规则,让外网无法进入
3. 增加一个nat
iptables -t nat -A PREROUTING -d 221.219.9.163 -p tcp --dport 8080 -j DNAT --to 192.168.2.51:8080
删除某条nat
iptables -t nat -D PREROUTING 6
(完)