原因:ipf的内核参数是不能通过sysctl设置的,必须通过ipf -D -T 来设置。可以把设置的语句加入到rc.conf里的ipfilter_flags里面。但是,由于-D参数把ipf -f 和ipnat -f的参数给清除掉,所以会出现ipf和ipnat没有配置文件的错误。
解决:
1、对于ipf的参数,可以把它加在最后。
ipfilter_flages="-D -T ipf_nattable_sz=30011,ipf_nattable_max=300000,\
fr_tcptimeout=180,fr_tcpclosewait=60,fr_tcphalfclosed=300,\
fr_tcpidletimeout=7200,fr_tcpclosed=60,fr_tcplastack=120,\
fr_udptimeout=90,fr_icmptimeout=35,\
fr_statemax=8039,fr_statesize=11471 -E -f /home/ipf.rules"
2、对于ipnat参数的丢失,可以通过几种途径来解决。
(1)写一个ipnat.sh到/etc/rc.d/来实现系统自启动。但是,这个自启动有时候会失效。
(2)既然是ipf的启动把它去掉,那么就可以改一下ipf的启动文件。
/etc/rc.d/ipfilter。
ipfilter_start()
{
echo "Enabling ipfilter."
if [ `sysctl -n net.inet.ipf.fr_running` -le 0 ]; then
${ipfilter_program:-/sbin/ipf} -E
fi
${ipfilter_program:-/sbin/ipf} -Fa
if [ -r "${ipfilter_rules}" ]; then
${ipfilter_program:-/sbin/ipf} \
-f "${ipfilter_rules}" ${ipfilter_flags}
# echo "Go to The IPnat"
# sleep 2
/sbin/ipnat -CF -f /home/ipnat.rules
# sleep 1
fi
${ipfilter_program:-/sbin/ipf} -6 -Fa
if [ -r "${ipv6_ipfilter_rules}" ]; then
${ipfilter_program:-/sbin/ipf} -6 \
-f "${ipv6_ipfilter_rules}" ${ipfilter_flags}
echo "Go to IPV6 Proccess! Hu Xiao"
fi
}
ipfilter_resync()
{
# Don't resync if ipfilter is not loaded
if ! ipfilter_loaded; then
return
fi
${ipfilter_program:-/sbin/ipf} -y ${ipfilter_flags}
/sbin/ipnat -CF -f /home/ipnat.rules
}
注意:第一,这一个是直接用命令,如果想通用,改为变量方式。第二,一定要写两处,最起码要写resync里的。因为那一个是后执行的。
阅读(2232) | 评论(0) | 转发(0) |