一.端口转发:
在详述端口转发之前,先讲一下我日前遇到的一件事情。本人是搞测试的,有一厂家拿了一个服务器软件叫我测试。基于win2k的,端口号为881,服务器直接连接外部网络,客户端通过服器ip来访问,而他们没有基于linux的服务器软件,照他们意思就必须将服务器换成windows的。作为一个linux爱好者,我想大家明白这种痛苦。我翻了一下资料,发现iptables的端口转发功能可以解决,折腾了一下午,终于完成任务。下面将我的方法讲一下:思想:利用端口转发,当服务器接收到881端口请求以后,将其转到 10.10.2.200:881上,10.10.2.200再将数据返回给请求连接
Eth0:连接ADSL,即ppp0接口
Eth1:连接内部网络,ip为10.10.1.1
10.10.2.200为win2k服务器,其端口881提供网络服务。
iptbles脚本:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 881 -j DNAT --to-destination 10.10.2.200:881 ;将881请求发至10.10.2.00:881端口
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.200 -p tcp -m tcp --dport 881 -j SNAT --to-source 10.10.1.1 ;返回a.b.b.d时数据源来自同一子网,就将其源地址更改为10.10.1.1,从eth0发出,并在连接跟踪表中查出a.b.c.d 从ppp0进来的,又由ppp0将此数据发出。
当然不要忘了加一条允许881端口访问的语句。 iptables ?A INPUT ?p tcp ?dport 881 ?i ppp0 ?j ACCEPT
可不可把服务器放在局域内,用端口转发来实现呢?答案当然是肯定的,既然能把881端口转发,那么21,80这些个端口更不在话,而且很多服务器软件都可以自定义端口,那就在得玩了,只要有合适的端口,即使给局域网每一个用户开一个ftp服务器也是可的。你想要实现什么服务都可以,当然是基于端口转发的。
局域网内10.10.2.101是win2k,提供www服务,端口为800
通过服务器http://serverip:800 进行访问。
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 800 -j DNAT --to-destination 10.10.2.101:800
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.101 -p tcp -m tcp --dport 800 -j SNAT --to-source 10.10.1.1
iptables ?A INPUT ?p tcp ?dport 800 ?i ppp0 ?j ACCEPT
由于是基于端口转发实现的,所以服务器上只需装个iptables来转发数据就行了,一切服务由内部服务器完成,这样的话,我 linux服务器才真正的算是个防火墙。
二.IPTABLES防火墙使用经验一谈
最近架设了一台LINUX的小型服务器 因为需要把LINUX的机子作为软路由器来使用 所以把使用的一些经验谈一下。
iptables的功能十分的强大 例如IP转发和伪装 防御DoS,扫描和嗅探试的攻击等等 在这里就不阐述了
我的系统环境: redhat 7.2, adsl 2m, 8139fast 网卡
1:linux如何所以软路由功能:
说到这里 大家可能会想 只要在/etc/rc.d/rc.local加上cat 1 > /proc/sys/net/ipv4/ip_forward就可以了 让linux具 ip_forward的功能 但你会发现 就算这样设置你局域网内的其他电脑还是不能共享上网 这是为什么 因为当你只有一个公网的ip 候 你就必须用到iptables的IP伪装功能 把IP的伪装成你公网的IP 那怎么实现呢 你可以这样 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 这样就可以把你所以出去的IP地址伪装成ppp0的IP地址(因为我 ADSL 如有不同可以修改)
2:我不想开放我的端口 但我要在我的电脑上启用http服务 并对外服务:
因为你不想开放除了80以外的端口 你可以这样 iptables ?P INPUT ?j DROP 我们用-P来拦截全部的通信
然后在来允许哪些端口可以被使用你可以这样写:
iptables ?A INPUT ?p tcp ?dport 80 ?j ACCEPT
你可以适当的按照这样的格式来添加自己想开放的端口 当然如果你觉得这样不是很好的管理你也可以新建一个iptables表 你可以样做iptables ?N test (新建一个test表)
iptables ?A test DROP
iptables ?A test ?p tcp ?dport 80 ?j ACCEPT(允许80端口被访问)
iptables ?A INPUT ?j test
iptables ?A OUTPUT ?j test
iptables ?A FORWARD ?j test
(这3条的意思指让INPUT OUTPUT FORWARD都按照test的设置)
3我想在我内网的电脑上架设ftp服务 我该怎么做:
这就又要用到iptables 的又一个强大的功能端口映射了
你可以这样iptables -t nat -A PREROUTING -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.0.6:21
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.6 -p tcp -m tcp -- dport 25-j SNAT --to-source 192.168.0.1
上面2句话的意思是把服务器的25端口映射到192.168.0.6这台电脑上
4:我不想让人家可以PING到我
这大概是做防火墙用到最多的一种了 你可以在iptables写这句话 iptables -A INPUT -p icmp --icmp-type echo-request -i ppp0 -j DROP 如果你前面是新建了一个新的test表 那也可以这样写iptables -A test -p icmp --icmp-type echo-request -i ppp0 -j DROP
这句话就是不允许人家PING我 因为ping用到的是icmp协议 因为icmp没有端口可言 所以也不需要指定端口了好了 这就是iptables的几种比较基本的用法
这里在介绍几iptbales常用的一些命令
iptables ?F 清空所有的iptables的规则设置
/sbin/iptables-save > iptables ? save 把你的规则保存下来 因为你所有设置的规则再重新启动后都不会被保存 所以你必来写一个脚本来让他开机运行 所以你就可以用这命令来保存你的规则 然后让他开机自动运行就可以了。