LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1397|回复: 11

[原创] adsl上网,使用iptables设置端口映射

[复制链接]
发表于 2006-9-7 11:51:01 | 显示全部楼层 |阅读模式
今天一时高兴写了个|简单的小脚本用来设置ADSL端口映射。
大家都知道ADSL的IP是经常变化的,做端口映射的时候会比较为难,希望这个脚本能对大家有点小作用。

[PHP]
#!/bin/bash
WAN_IP=`ifconfig ppp0 | grep inet | awk '{print $2}' | cut -c 6-` //取出上网用的ADSL外网IP
SVR_IP="192.168.0.123" //需要映射的目标服务器
PORTS="21 25 80 8000" //需要映射的端口

iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING  //完成清理工作
iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE  //上一步清理了透明nat,现在加上,有其他的规则记得也要在这里加上

for PORT in $PORTS
do
  iptables -t nat -A PREROUTING -p tcp -m tcp -d $WAN_IP --dport $PORT -j DNAT --to-destination $SVR_IPPORT
  iptables -t nat -A POSTROUTING -p tcp -m tcp -d $SVR_IP --dport $PORT -j SNAT --to-source $WAN_IP
done
[/PHP]

最后别忘记保存这个脚本,然后 chmod+x

运行之后,访问外网IP的 21 25 80 8000 四个端口就直接跳转到 192.168.0.123 相应的端口上了。
发表于 2006-9-7 22:45:01 | 显示全部楼层
iptables -t nat -A POSTROUTING -p tcp -m tcp -d $SVR_IP --dport $PORT -j SNAT --to-source $WAN_IP

不知道老兄的这条规则有什么意义呢?
回复 支持 反对

使用道具 举报

发表于 2006-9-7 23:39:09 | 显示全部楼层
也许是考虑,,需要进去,就需要出来吧。Linux 的 DNAT 是自动搞定这个的。

直接用端口设置不就好了,不用IP 的啊。。。。
回复 支持 反对

使用道具 举报

发表于 2006-9-7 23:55:50 | 显示全部楼层
iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
这条规则就够了啊。
如果内网不需要主动访问外网的话,这条都不需要。
DNAT过得数据包,在返回时会自动进行un-DNAT操作的。
回复 支持 反对

使用道具 举报

发表于 2006-9-8 10:32:09 | 显示全部楼层

大家帮忙看一下我些的iptables规则~~~

*filter
-P INPUT DROP
-P OUTPUT ACCEPT
-P FORWARD ACCEPT
-A INPUT -i eth0 -p tcp ! --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m multiport --dports 4662,18491 --syn -j ACCEPT
-A INPUT -i eth0 -p udp -m multiport --dports 4666,18491 -j ACCEPT
-A INPUT -i eth0 -p tcp --dport 4080 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP
-A INPUT -i eth0 -p udp -m udp --dport 161 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 199 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
===============================


现在的问题是,用了它之后,我的机器就不能取得DNS服务了,所有域名都解析不了,汗
请问是什么问题???我好像没有限制啊。。。
回复 支持 反对

使用道具 举报

发表于 2006-9-8 11:29:38 | 显示全部楼层
DNS使用的是UDP的53端口,没有打开。
回复 支持 反对

使用道具 举报

发表于 2006-9-8 13:18:39 | 显示全部楼层
Post by orphen
DNS使用的是UDP的53端口,没有打开。

不是,你理解错我的意思了,我本身不提供dns服务
我是不能得到dns服务器
当我应用以上的规则后,我ping www.google.com
是没有响应的,不能抓到ip
回复 支持 反对

使用道具 举报

发表于 2006-9-8 14:02:55 | 显示全部楼层
Post by ibearz
不是,你理解错我的意思了,我本身不提供dns服务
我是不能得到dns服务器
当我应用以上的规则后,我ping www.google.com
是没有响应的,不能抓到ip

我说的就是你无法获取IP。
INPUT默认规则都DROP了,又没有允许DNS服务器的返回信息进入。
还说什么“我好像没有限制啊。。。”
  1. -A INPUT -p udp -m udp --sport 53 -j ACCEPT
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-9-8 14:41:27 | 显示全部楼层
Post by orphen
我说的就是你无法获取IP。
INPUT默认规则都DROP了,又没有允许DNS服务器的返回信息进入。
还说什么“我好像没有限制啊。。。”
  1. -A INPUT -p udp -m udp --sport 53 -j ACCEPT
复制代码

我照你这么写了,不过没感觉。。汗
回复 支持 反对

使用道具 举报

发表于 2006-9-8 15:02:15 | 显示全部楼层
我的服务器上就是这么写的,否则就无法解析DNS。
没有问题的。
改写后有没有重载iptables的规则文件?
另外,你将INPUT的默认规则设定为ACCEPT看看能否解析,确定一下是不是iptables的问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表