近期刚刚转到linux服务器开发组,因为需求问题需要开发一部分内网环境路由、策略控制方面的内容,走了很多弯路,现在总结一下!完全是随笔,比较乱。
这里不介绍如何下载安装!
路由方面由于初期不清楚linux内核提供IP转发功能,去选择开源路由器源码去学习,比如quagga、番茄等,但是分割其中的内容加入现有系统比较麻烦,quagga还是不错的,属于进程模块也比较方便加入系统,操作上比较类似Cisco,后来因为一些偶然的因素发现linux开启IP转发之后就可以实现一部分需求上的内容,于是放弃其他开源项目,转向linux自身的挖掘。
作为内网控制几个方面比较重要:上网控制、内网访问/控制隔离。
上网控制:内网对于外网的访问应该受到限制,比如授信外网站点,域名过滤,重定向等
内网访问/控制隔离:服务器端口控制,外网端口控制重定向等
实际使用中用到的模块或者命令:系统设置sysctl.conf、iptables、ipset以及其他相关的扩展模块!
linux防火墙由用户层iptables以及内核netfilter构成,要使用这部分内容首先需要开启内核IP转发:sysctl.conf(一般位于/etc/sysctl.conf),修改其中的.......ip_forward = 0 改为 1即可,之后使用 sysctl -p 命令使其立即生效或者使用 echo "1" > /proc/sys/net/ipv4/ip_forward,当然这个命令属于当前有效,重启即失效,但是对于每次重启都需要重新进行配置的项目来说也无不可.
iptables部分:用户层主要操作命令。整个的数据转发过程需要经过5个链PREROUTING,INPUT,OUTPUR,FORWARD,POSTROUTING,主要操作mangle、filter、nat表,不做详细介绍,这部分网上相关内容很多也很详细!过滤部分的内容完全可以只做PREROUTING、POSTROUTING两个部分以及nat表。
iptables可以做的常用内容有数据包是否允许通过、端口是否被允许、哪种协议是被允许的、哪些关键字是应该被过滤的等等,部分内容需要扩展模块支持。
关于扩展模块建议直接下载完整版的iptables直接编译,那样功能应该比较齐全。另外最好下载ipset支持部分,ipset属于地址池管理,在控制不连续地址或者具有大量不同的地址划分中个人感觉用处很大!
先说下iptables相关的部分,很重的一点iptables命令顺序执行,匹配其中之一立即跳出否则按照默认处理!所以编排命令列表的顺序很重要。
格式:
1、iptables -t nat -A(I) PREROUTING -s 192.168.1.10 -p tcp --dport 80 -j ACCEPT 允许源地址192.168.1.10的TCP协议,目标端口是80的访问通过
2、iptables -t nat -A(I) PREROUTING -d 192.168.1.10 -p tcp ! --dport 80 -j ACCEPT 允许目标地址192.168.1.10的TCP协议,目标端口不是80的访问通过
3、iptables -t nat -A(I) PREROUTING -s 192.168.1.10 -p tcp --dport 80 -j DROP(其他) 禁止
4、iptables -t nat -A(I) PREROUTING -s 192.168.1.0/24 -p udp --dport 8000:8001 -j DNAT --to-destination 192.168.1.100(服务器) 将192.168.1.0网段的8000到8001的udp连接跳转到服务器192.168.1.100上(更换目标地址为192.168.1.100) 也就是做DNAT转换
5、iptables -t nat -A POSTROUTING -d 192.168.1.100 -p all -j MASQUERADE 开启地址伪装
以上5条为基础命令部分 一般情况下都会支持这些内容,合理的利用可以做到控制IP或者网段或者不同协议端口的访问控制,普通使用上应该足够.
下面介绍下扩展部分:
扩展主要使用 -m 参数支持,常用扩展模块 multiport , string , set ,state ,连接数控制,防攻击处理等,这里只说下多端口multiport,以及多不连续IP的处理.。
多端口:iptables ..... -p tcp -m multiport --dports(sports,ports) 80,443,8080 -j .。。 分别匹配目标端口,源端口,所有两类端口
不连续IP:连续IP可以使用 iprange模块 如:-m iprange --src(dst)-range 192.168.1.1-192.168.1.110 这样。但是对于不连续IP没有很好的支持,所以选择扩展模块ipset,
使用ipset需要iptables版本1.4.4以上,使用的时候只编译对应iptables版本即可,需要的内核模块在使用时使用insmod加入即可。
再说下ipset性能:测试中对于1W一下咯IP使用单个IPSET大约需要4S左右,3W以上之后时间变得很长大概10秒以上增幅!所以如果需要控制的ip中如果存在连续IP最好自己手写对于这种情况的扩展模块。可以参照iprange的写法。
重要的事情要说三遍:顺序很重要X3!