14 12
发新话题
打印

[原创] 用iptables做ip的静态映射

本主题由 iamshiyu 于 2007-7-18 17:31 加入精华

用iptables做ip的静态映射

本文网址:http://bbs.bitscn.com/113877 复制

其实静态映射和端口映射差不多是一个意思,只不过IP静态是整个把内部网的服务器转到internet上(或者外部网络上)去,而端口映射只是把内网的某些服务端口映射到外网服务器的某个端口上。
    或许有的兄弟会奇怪为什么要做ip静态映射呢?直接设置为外网IP不就完了?其实原因很简单,为了方便统一管理和制定安全策略。假设你的服务器要搬迁、更换,如果只有一台还好说——在这台服务器上更改一下IP地址或者把新的服务器地址改为老服务器地址换上去就行了,如果有好几台服务器呢?你就不得不面对更长的断网时间……使用静态IP映射能够让你更方便的管理多台服务器,同时增加了安全性(等于凭空给服务器作了一个防火墙啊)。假设你想用新的服务器替换老服务器,可以给新的服务器分配另外的外网IP或者用端口映射(与IP静态映射差不多,个人觉得不如IP静态映射来的方便),测试功能完全实现后,直接修改防火墙配置,只是一瞬间,网站就能实现切换,切换完毕后再处理老服务器。搬迁的时候也是,不必给每个服务器都更改IP地址、子网掩码什么的一大堆,全都接到防火墙上,把防火墙上的IP更改一次就完事,真正服务器的ip地址都不用改(反正都是私网地址)。好处目前想到的就这些啦。
其实配置还是很简单的。
我们假设你有两台web服务器,ip地址为192.168.1.1和192.168.1.2,一台交换机,一台linux双网卡服务器(做防火墙和ip静态映射用),一根外线,数个可用的公网IP(假设为1.1.1.1~1.1.1.6),而你想让大家通过访问1.1.1.2访问第一台web服务器,通过访问1.1.1.3访问第二台。将外线接在linux服务器的一块网卡上(比如eth0),设置该网卡地址为1.1.1.1;再用网线连接另外一块网卡(比如eth1)到交换机上,设置ip地址为192.168.1.254。两台web分别接到交换机上,网关设置为192.168.1.254(也就是linux防火墙的内网地址啦)。
线路已经搭建好了,现在谈谈怎么设置linux服务器。
安装就不用说了吧?建议用比较新的版本就好(新版本的iptables功能更强,对于硬件的支持率也更高,不用你花很多精力在调通设备上),系统装好后设置好IP……怎么设置?以前是通过修改目录/etc/sysconfig/network-scripts/下的ifcfg-eth0和ifcfg-eth1文件实现的。现在可以通过ifconfig或者ip address add命令来实现(这些设置的前提是你的网卡已经被检测到,并且可以正常工作,如果安装网卡遇到问题以后再讨论吧,我用的版本是redhat as4版本)。比如设置eth0,你可以用
ifconfig eth0 1.1.1.1/30 up(我说了你的可用ip范围一般来说是1.1~1.7,这就意味着子网掩码是255.255.255.248,换算过来就是/30了)来给eth0设定IP地址,也可以通过命令
ip address add 1.1.1.1/30 brd + dev eth0
来实现。网关的添加可以通过命令
ip route add default via 网关IP dev eth0
来实现。eth1就不用我说了吧?注意在linux中,整个系统的默认网关(default)只能有一个(当然你可以通过添加路由或者策略路由增加网关,但是系统默认的网关只能有一个),所以不要用上面的命令再给eth1添加默认网关了,否则谁都上不了网。
如果上述命令都成功执行了,恭喜你,基本的东西都已经准备好了,否则不是你的系统安装的时候不完全就是你的网卡没装好……
现在看看iptables服务,你可以执行iptables -V看看是否iptables已经安装在系统里了(一般来说都会安装了),还可以显示你的版本号——我的是1.3.6版本。
ok,编辑脚本吧。输入
vi FWstart.sh进入编辑界面(下面是文本正文)
#!/bin/sh
#下面两项分别是启动linux的转发功能和防syn攻击的参数。
#没有第一条就不能实现linux的数据包转发
#意思就是把文件/proc/sys/net/ipv4/ip_forward的值设定为1
#第二条我不太了解,但还是加上吧。
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
#加载iptables启动所需的各种模块,据说很多版本不加也可以,因为具体的参数引用实际上已经调
#用了它们,但是考虑兼容性加上也没什么,如果你去掉了这几行,结果出现了问题,不妨再加上。
modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
#清空原有的iptables的表(主要是filter表和nat表)和表中的链
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -F -t nat
/sbin/iptables -X -t nat
/sbin/iptables -Z -t nat
#设置filter表中三个链的默认规则,进入(INPUT)发出(OUTPUT)都是允许ACCEPT
#转发(FORWARD)是丢弃DROP,这样才能起到防火墙的作用。
#你也可以设定更细致的INPUT规则,实际上INPUT链是针对保护防火墙自身的,我不多说了,
#我的重点放在FORWARD链,它是负责过滤转发包的。
/sbin/iptables -P INPUT   ACCEPT
/sbin/iptables -P OUTPUT   ACCEPT
/sbin/iptables -P FORWARD DROP
#现在给网卡添加ip地址,一块网卡上可以拥有很多IP地址,只有这样,外网访问1.1.1.2的时候
#才能重新定向到内网的192.168.1.1上去。
ip address add 1.1.1.2/30 brd + dev eth0
ip address add 1.1.1.3/30 brd + dev eth0
#设置允许对服务器192.168.1.1和192.168.1.2的访问,否则的话外网
#就无法把数据发送到这两台服务器上。当然你可以设置更多的规则,这实际上就是为这两台
#服务器设置的防火墙了。比如如果你想设置只允许访问1.1上的80端口,只要把
#/sbin/iptables -A FORWARD -d 192.168.1.1 -j ACCEPT改为
#/sbin/iptables -A FORWARD -d 192.168.1.1 --dport 80 -j ACCEPT就可以了,
#其他不要改,除非你明白修改后的含义。不过我要提醒你,按照这种设置,你的两台
#服务器基本上就是和单独接入在internet中没什么两样,只是进行了地址转换,
#多了一点点保护而已。建议你还是多学学iptables防火墙的其他内容。
/sbin/iptables -A FORWARD -s 192.168.1.1 -j ACCEPT
/sbin/iptables -A FORWARD -d 192.168.1.1 -j ACCEPT
/sbin/iptables -A FORWARD -s 192.168.1.2 -j ACCEPT
/sbin/iptables -A FORWARD -d 192.168.1.2 -j ACCEPT
#下面就是nat表了,这个绝对不要改,除非你很明白它们的作用,
#达到比对filter表的了解还要深刻的程度。
#意义是nat标的三条链默认接受任何数据传输。
/sbin/iptables -t nat -P PREROUTING  ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT      ACCEPT
#这是真正实现地址转换的语句,意义为:
#在PREROUTING链中(也就是刚进入linux服务器的数据包),将目的地址为1.1.1.2的数据包
#进行修改,使得其目的地址变为192.168.1.1;
#在POSTROUTING链中(马上要送出linux服务器的数据包),将源地址为192.168.1.1的数据
#包的源地址改为1.1.1.2;
/sbin/iptables -t nat -A PREROUTING -d 1.1.1.2 -j DNAT --to-destination 192.168.1.1
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to-source 1.1.1.2
/sbin/iptables -t nat -A PREROUTING -d 1.1.1.3 -j DNAT --to-destination 192.168.1.2
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.2 -j SNAT --to-source 1.1.1.3
#脚本到此结束。
你的内网服务器192.168.1.1和192.168.1.2应该已经可以通过ip地址1.1.1.2和1.1.1.3访问了。

七夕银河
一个不想当将军的裁缝,绝不是一个好司机!

TOP

好累,写了不少,不过基本没有涉及防火墙如何设置的东西,那些东西另外说吧,其实和acl还是挺象的,就是功能更多更强了,可以分得很细。
自己给自己保留一下啦,呵呵。希望各位兄弟有好的心得体会也能发上来哦。

七夕银河
一个不想当将军的裁缝,绝不是一个好司机!

TOP

不是太懂的呀

TOP

支持一下◎!

---------------------
三十功名尘与土,八千里路云和月!
莫等闲,白了少年头,空悲切!
---------------------
blog:http://crazyit.bitscn.net
M S N :clz_3022@bitscn.net
Mail: lizhe.cui@gmail.com
---------------------

TOP

modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
这些东西iptables可以自动加载啊!
另外
/sbin/iptables -P INPUT   ACCEPT
/sbin/iptables -P OUTPUT   ACCEPT
/sbin/iptables -P FORWARD DROP
这个不太妥当吧,netfilter 从上到下读取每个规则,读到这里已经把进入的包处理了,你的linux主机安全性降低了,另外linux的路由功能被你给封闭了。和你的echo "1" > /proc/sys/net/ipv4/ip_forward
矛盾了!

注:这三条规则,我只是看脚本而已,具体没做实验,也许不准

心有多大,舞台就有多大

TOP

学习中

TOP

study!

TOP

引用:
原帖由 proxima888 于 2007-8-9 09:54 发表
modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
这些东西iptables可以自动加载啊!
另外
/sbin/iptables -P INPUT   ACCEPT
/sbin/iptables -P OUTPUT   ACCEPT
/sbin/iptables -P FORWARD DROP
这个不太妥当吧,netfilter 从上到下读取每个规则,读到这里已经把进入的包处理了,你的linux主机安全性降低了,另外linux的路由功能被你给封闭了。和你的echo "1" > /proc/sys/net/ipv4/ip_forward
矛盾了!

注:这三条规则,我只是看脚本而已,具体没做实验,也许不准
你的第一个质疑前面的我已经说了,因为不同版本的linux和iptables会造成一定的不兼容性,如果考虑兼容性的话,还是要加上那些modprobe的语句,我也描述过了,如果你自己很清楚这些的话有些语句可以不加载,但如果不想因为自己的系统或者机器出现不兼容问题,或者考虑移植问题的话,还是要加上。这个问题在CU有人讨论过。
对于-P参数,其实相当于默认策略,它放在那里都是无所谓的,放在第一行还是最后一行都是一样的:只有规则里面完全找不到相匹配的条件才会考虑根据默认策略进行匹配,所一你说的第二个质疑也不存在。
你说的路由功能被封闭了我不太清楚是什么意思?这和允许存储转发有什么冲突吗?只有当ip_forward值为1的时候,开启filter表的FORWARD链才是有意义的,只是进行IP的转发而已,和路由有什么关系吗?请教下。

七夕银河
一个不想当将军的裁缝,绝不是一个好司机!

TOP

学习中~......

人生的最大遺憾莫過於錯誤地堅持了不該堅持的,輕易地放棄了不該放棄的...我不知道是該堅持還是該放棄.....

TOP

先声明有点我是搞错了,所谓策略的顺序只是在同一个表的同一个链内有顺序,而在不同表的不同链的策略和相互之间是没有顺序的

modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
这几个加不加倒也无所谓,要是考虑某些版本不自动加载倒是真的可以加上。基本同意

至于
/sbin/iptables -P INPUT   ACCEPT
/sbin/iptables -P OUTPUT   ACCEPT
这两条应该默认DROP,因为你做nat不会走INPUT和OUTPUT这两条链,若默认为ACCEPT则会降低网关的安全性。但是如果你的服务器还做web或者邮件服务器等其他服务你可以再添加INPUT和OUTPUT链规则。

/sbin/iptables -P FORWARD DROP
基本无异议,过滤规则是应该在filter 表的FORWARD链中来写。我当初看你的帖子的时候没仔细看,没看到你下面写了很多的FORWARD规则。

/sbin/iptables -t nat -P OUTPUT      ACCEPT
感觉多余!

其实iptables我研究的不深入,只是研究了几个表几个链的关系,至于微调方面就差的更远了还的向版主请教,都是我们的那台ns防火墙害的!

[ 本帖最后由 proxima888 于 2007-9-30 10:45 编辑 ]

心有多大,舞台就有多大

TOP

 14 12
发新话题
版块跳转 
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论! 24小时违法信息处理:QQ58284700 TEL29989777
沪ICP备05002360号 / 增值电信业务经营许可证沪B2-20050290 / 当前时区 GMT+8, 现在时间是 2008-5-16 16:12 /