关于iptables服务的问题,防火墙设置

时间:2021-12-06 06:57:26
看以下命令,先停掉iptables服务,查状态is stopped, 然后-L查看了一下,
再status看状态变了,我在程序里判断的是grep "is stopped"来捕获防火墙开闭状态,
怎么-L命令一执行,status就变这个了呢,导致程序没法正确处理,高手来指导一下


    

[root@ovs159 ~]# service iptables stop  
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
[root@ovs159 ~]# service iptables status
Firewall is stopped.
[root@ovs159 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@ovs159 ~]# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination    

12 个解决方案

#1


正常的啊,没有任何规则。建议通过服务的返回值来判断。

#2


service iptables stop调用后卸载了iptables相关的模块,如果你调用iptables -L,内核会自动加载iptable_filter模块,类似,如果是iptables -t nat -L,内核会自动加载iptable_nat模块,如果你要查通过service iptables stop是否关闭了防火墙,可以通过检查/proc/net/ip_tables_names文件是否存在来进行判断,程序中就不要调用iptables -L了

#3




引用 2 楼 zgglj 的回复:
service iptables stop调用后卸载了iptables相关的模块,如果你调用iptables -L,内核会自动加载iptable_filter模块,类似,如果是iptables -t nat -L,内核会自动加载iptable_nat模块,如果你要查通过service iptables stop是否关闭了防火墙,可以通过检查/proc/net/ip_tables_names文件是否存在来进行判断,程序中就不要调用iptables -L了



我是python程序里判断iptables服务的启动与否的,所以grep "is stopped" 来看启动没启动,
但是如果用户,-L 后,我的程序不灵了, 他-L不受我控制,所以我既要考虑 is stopped 情况
还要考虑,-L后 如您所说加载模块后的情况,如何判断呢,还是说查这个/proc/net/ip_tables_names
文件能更健壮

#4


引用 1 楼 Wentasy 的回复:
正常的啊,没有任何规则。建议通过服务的返回值来判断。



我是python程序里判断iptables服务的启动与否的,所以grep "is stopped" 来看启动没启动,
但是如果用户,-L 后,我的程序不灵了, 他-L不受我控制,所以我既要考虑 is stopped 情况
还要考虑,-L后 如您所说加载模块后的情况,如何判断呢,还是说查这个/proc/net/ip_tables_names
文件能更健壮

#5


如果-L不受你控制,那可以用一个土办法
你可以把/lib/modules/<所用核心版本>/kernel/net/ipv4/netfilter/iptable_filter.ko模块改个名字,比如iptable_filter2.ko,这样服务停止后别人用iptables -L就不会导致模块加载了。不过如果需要启用服务,就需要自己手工加载了,insmod /lib/modules/<所用核心版本>/kernel/net/ipv4/netfilter/iptable_filter2.ko
如果要service iptables start仍然发挥作用,需要修改/etc/init.d/iptables脚本
nat表和mangle表也可以用类似的办法

#6


引用 5 楼 zgglj 的回复:
如果-L不受你控制,那可以用一个土办法
你可以把/lib/modules/<所用核心版本>/kernel/net/ipv4/netfilter/iptable_filter.ko模块改个名字,比如iptable_filter2.ko,这样服务停止后别人用iptables -L就不会导致模块加载了。不过如果需要启用服务,就需要自己手工加载了,insmod /lib/modules/<所用核心版本>/kernel/net/ipv4/netfilter/iptable_filter2.ko
如果要service iptables start仍然发挥作用,需要修改/etc/init.d/iptables脚本
nat表和mangle表也可以用类似的办法



这个办法不适用,我的代码是产品代码,将来发布要客户安装在各种版本linux上。。。还有什么办法吗,
-L后的那些输出如果固定,要不我也grep一下那些东西?

#7


那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?

#8


引用 7 楼 zgglj 的回复:
那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?


这么跟你说吧,我的程序要在规则里添加些东西,比如端口开放之类的,也就是修改iptables服务的规则,
但是不希望改变它的运行状态,也就是说,我的程序运行的效果
1. 如果客户机器上的iptables没有启动,我就添加规则然后把service iptables stop掉,不改变客户以前的状态
2. 如果客户机器上iptables服务本来就启动的,我就添加我的规则

所以我的问题关键就是,我判断服务开启与否目前是service iptables status|grep "is stopped"
来判断的,结果发现还有-L后的这种情况,这种加载后服务到底算启动了还是没启动呢?应该是说加载
了规则但没启动吧,如果是这样,我就要把这种情况反应在我的代码里,也归到未启动里面,没太好办法

#9


引用 8 楼 ladofwind 的回复:
Quote: 引用 7 楼 zgglj 的回复:

那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?


这么跟你说吧,我的程序要在规则里添加些东西,比如端口开放之类的,也就是修改iptables服务的规则,
但是不希望改变它的运行状态,也就是说,我的程序运行的效果
1. 如果客户机器上的iptables没有启动,我就添加规则然后把service iptables stop掉,不改变客户以前的状态
2. 如果客户机器上iptables服务本来就启动的,我就添加我的规则

所以我的问题关键就是,我判断服务开启与否目前是service iptables status|grep "is stopped"
来判断的,结果发现还有-L后的这种情况,这种加载后服务到底算启动了还是没启动呢?应该是说加载
了规则但没启动吧,如果是这样,我就要把这种情况反应在我的代码里,也归到未启动里面,没太好办法


1.你描述iptables没有启用的时候你无法加载规则,如果你启用后加规则再停用,这样没有意义,因为规则没有生效,即便是用户这时启用iptables,你加载的规则也不会存在;
2.你无法判断当前iptables是本来就启用的还是由于其他用户调用iptables -L导致启用的;
你应该这样设计:
1.判断iptables服务状态,可以根据service iptables status,也可以根据之前我说的文件判断的方式判断,整个判断过程中你自己不要调用iptables -L,确保不是你启用的iptables;
2.如果iptables是启用状态,添加你的规则;
3.如果iptables未启用,则什么事情都不做

#10


引用 9 楼 zgglj 的回复:
Quote: 引用 8 楼 ladofwind 的回复:

Quote: 引用 7 楼 zgglj 的回复:

那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?


这么跟你说吧,我的程序要在规则里添加些东西,比如端口开放之类的,也就是修改iptables服务的规则,
但是不希望改变它的运行状态,也就是说,我的程序运行的效果
1. 如果客户机器上的iptables没有启动,我就添加规则然后把service iptables stop掉,不改变客户以前的状态
2. 如果客户机器上iptables服务本来就启动的,我就添加我的规则

所以我的问题关键就是,我判断服务开启与否目前是service iptables status|grep "is stopped"
来判断的,结果发现还有-L后的这种情况,这种加载后服务到底算启动了还是没启动呢?应该是说加载
了规则但没启动吧,如果是这样,我就要把这种情况反应在我的代码里,也归到未启动里面,没太好办法


1.你描述iptables没有启用的时候你无法加载规则,如果你启用后加规则再停用,这样没有意义,因为规则没有生效,即便是用户这时启用iptables,你加载的规则也不会存在;
2.你无法判断当前iptables是本来就启用的还是由于其他用户调用iptables -L导致启用的;
你应该这样设计:
1.判断iptables服务状态,可以根据service iptables status,也可以根据之前我说的文件判断的方式判断,整个判断过程中你自己不要调用iptables -L,确保不是你启用的iptables;
2.如果iptables是启用状态,添加你的规则;
3.如果iptables未启用,则什么事情都不做


明白你的意思,我告诉测试人员不要用iptables -L了, 说这条命令会把服务启动,也就不是stop状态了,看看他还找茬不,关于你说的,/proc/net/ip_tables_names这个文件, 如果不行再用这种方法吧,确实服务启动状态和-L后这个文件都存在,那么就可以判断文件存在来判断服务启动或者所谓的被加载吧,我可以理解-L后的那个状态是服务启动但没加载规则吧?





#11


引用 10 楼 ladofwind 的回复:
Quote: 引用 9 楼 zgglj 的回复:

Quote: 引用 8 楼 ladofwind 的回复:

Quote: 引用 7 楼 zgglj 的回复:

那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?


这么跟你说吧,我的程序要在规则里添加些东西,比如端口开放之类的,也就是修改iptables服务的规则,
但是不希望改变它的运行状态,也就是说,我的程序运行的效果
1. 如果客户机器上的iptables没有启动,我就添加规则然后把service iptables stop掉,不改变客户以前的状态
2. 如果客户机器上iptables服务本来就启动的,我就添加我的规则

所以我的问题关键就是,我判断服务开启与否目前是service iptables status|grep "is stopped"
来判断的,结果发现还有-L后的这种情况,这种加载后服务到底算启动了还是没启动呢?应该是说加载
了规则但没启动吧,如果是这样,我就要把这种情况反应在我的代码里,也归到未启动里面,没太好办法


1.你描述iptables没有启用的时候你无法加载规则,如果你启用后加规则再停用,这样没有意义,因为规则没有生效,即便是用户这时启用iptables,你加载的规则也不会存在;
2.你无法判断当前iptables是本来就启用的还是由于其他用户调用iptables -L导致启用的;
你应该这样设计:
1.判断iptables服务状态,可以根据service iptables status,也可以根据之前我说的文件判断的方式判断,整个判断过程中你自己不要调用iptables -L,确保不是你启用的iptables;
2.如果iptables是启用状态,添加你的规则;
3.如果iptables未启用,则什么事情都不做


明白你的意思,我告诉测试人员不要用iptables -L了, 说这条命令会把服务启动,也就不是stop状态了,看看他还找茬不,关于你说的,/proc/net/ip_tables_names这个文件, 如果不行再用这种方法吧,确实服务启动状态和-L后这个文件都存在,那么就可以判断文件存在来判断服务启动或者所谓的被加载吧,我可以理解-L后的那个状态是服务启动但没加载规则吧?


是的

#12


学习下吧……

#1


正常的啊,没有任何规则。建议通过服务的返回值来判断。

#2


service iptables stop调用后卸载了iptables相关的模块,如果你调用iptables -L,内核会自动加载iptable_filter模块,类似,如果是iptables -t nat -L,内核会自动加载iptable_nat模块,如果你要查通过service iptables stop是否关闭了防火墙,可以通过检查/proc/net/ip_tables_names文件是否存在来进行判断,程序中就不要调用iptables -L了

#3




引用 2 楼 zgglj 的回复:
service iptables stop调用后卸载了iptables相关的模块,如果你调用iptables -L,内核会自动加载iptable_filter模块,类似,如果是iptables -t nat -L,内核会自动加载iptable_nat模块,如果你要查通过service iptables stop是否关闭了防火墙,可以通过检查/proc/net/ip_tables_names文件是否存在来进行判断,程序中就不要调用iptables -L了



我是python程序里判断iptables服务的启动与否的,所以grep "is stopped" 来看启动没启动,
但是如果用户,-L 后,我的程序不灵了, 他-L不受我控制,所以我既要考虑 is stopped 情况
还要考虑,-L后 如您所说加载模块后的情况,如何判断呢,还是说查这个/proc/net/ip_tables_names
文件能更健壮

#4


引用 1 楼 Wentasy 的回复:
正常的啊,没有任何规则。建议通过服务的返回值来判断。



我是python程序里判断iptables服务的启动与否的,所以grep "is stopped" 来看启动没启动,
但是如果用户,-L 后,我的程序不灵了, 他-L不受我控制,所以我既要考虑 is stopped 情况
还要考虑,-L后 如您所说加载模块后的情况,如何判断呢,还是说查这个/proc/net/ip_tables_names
文件能更健壮

#5


如果-L不受你控制,那可以用一个土办法
你可以把/lib/modules/<所用核心版本>/kernel/net/ipv4/netfilter/iptable_filter.ko模块改个名字,比如iptable_filter2.ko,这样服务停止后别人用iptables -L就不会导致模块加载了。不过如果需要启用服务,就需要自己手工加载了,insmod /lib/modules/<所用核心版本>/kernel/net/ipv4/netfilter/iptable_filter2.ko
如果要service iptables start仍然发挥作用,需要修改/etc/init.d/iptables脚本
nat表和mangle表也可以用类似的办法

#6


引用 5 楼 zgglj 的回复:
如果-L不受你控制,那可以用一个土办法
你可以把/lib/modules/<所用核心版本>/kernel/net/ipv4/netfilter/iptable_filter.ko模块改个名字,比如iptable_filter2.ko,这样服务停止后别人用iptables -L就不会导致模块加载了。不过如果需要启用服务,就需要自己手工加载了,insmod /lib/modules/<所用核心版本>/kernel/net/ipv4/netfilter/iptable_filter2.ko
如果要service iptables start仍然发挥作用,需要修改/etc/init.d/iptables脚本
nat表和mangle表也可以用类似的办法



这个办法不适用,我的代码是产品代码,将来发布要客户安装在各种版本linux上。。。还有什么办法吗,
-L后的那些输出如果固定,要不我也grep一下那些东西?

#7


那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?

#8


引用 7 楼 zgglj 的回复:
那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?


这么跟你说吧,我的程序要在规则里添加些东西,比如端口开放之类的,也就是修改iptables服务的规则,
但是不希望改变它的运行状态,也就是说,我的程序运行的效果
1. 如果客户机器上的iptables没有启动,我就添加规则然后把service iptables stop掉,不改变客户以前的状态
2. 如果客户机器上iptables服务本来就启动的,我就添加我的规则

所以我的问题关键就是,我判断服务开启与否目前是service iptables status|grep "is stopped"
来判断的,结果发现还有-L后的这种情况,这种加载后服务到底算启动了还是没启动呢?应该是说加载
了规则但没启动吧,如果是这样,我就要把这种情况反应在我的代码里,也归到未启动里面,没太好办法

#9


引用 8 楼 ladofwind 的回复:
Quote: 引用 7 楼 zgglj 的回复:

那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?


这么跟你说吧,我的程序要在规则里添加些东西,比如端口开放之类的,也就是修改iptables服务的规则,
但是不希望改变它的运行状态,也就是说,我的程序运行的效果
1. 如果客户机器上的iptables没有启动,我就添加规则然后把service iptables stop掉,不改变客户以前的状态
2. 如果客户机器上iptables服务本来就启动的,我就添加我的规则

所以我的问题关键就是,我判断服务开启与否目前是service iptables status|grep "is stopped"
来判断的,结果发现还有-L后的这种情况,这种加载后服务到底算启动了还是没启动呢?应该是说加载
了规则但没启动吧,如果是这样,我就要把这种情况反应在我的代码里,也归到未启动里面,没太好办法


1.你描述iptables没有启用的时候你无法加载规则,如果你启用后加规则再停用,这样没有意义,因为规则没有生效,即便是用户这时启用iptables,你加载的规则也不会存在;
2.你无法判断当前iptables是本来就启用的还是由于其他用户调用iptables -L导致启用的;
你应该这样设计:
1.判断iptables服务状态,可以根据service iptables status,也可以根据之前我说的文件判断的方式判断,整个判断过程中你自己不要调用iptables -L,确保不是你启用的iptables;
2.如果iptables是启用状态,添加你的规则;
3.如果iptables未启用,则什么事情都不做

#10


引用 9 楼 zgglj 的回复:
Quote: 引用 8 楼 ladofwind 的回复:

Quote: 引用 7 楼 zgglj 的回复:

那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?


这么跟你说吧,我的程序要在规则里添加些东西,比如端口开放之类的,也就是修改iptables服务的规则,
但是不希望改变它的运行状态,也就是说,我的程序运行的效果
1. 如果客户机器上的iptables没有启动,我就添加规则然后把service iptables stop掉,不改变客户以前的状态
2. 如果客户机器上iptables服务本来就启动的,我就添加我的规则

所以我的问题关键就是,我判断服务开启与否目前是service iptables status|grep "is stopped"
来判断的,结果发现还有-L后的这种情况,这种加载后服务到底算启动了还是没启动呢?应该是说加载
了规则但没启动吧,如果是这样,我就要把这种情况反应在我的代码里,也归到未启动里面,没太好办法


1.你描述iptables没有启用的时候你无法加载规则,如果你启用后加规则再停用,这样没有意义,因为规则没有生效,即便是用户这时启用iptables,你加载的规则也不会存在;
2.你无法判断当前iptables是本来就启用的还是由于其他用户调用iptables -L导致启用的;
你应该这样设计:
1.判断iptables服务状态,可以根据service iptables status,也可以根据之前我说的文件判断的方式判断,整个判断过程中你自己不要调用iptables -L,确保不是你启用的iptables;
2.如果iptables是启用状态,添加你的规则;
3.如果iptables未启用,则什么事情都不做


明白你的意思,我告诉测试人员不要用iptables -L了, 说这条命令会把服务启动,也就不是stop状态了,看看他还找茬不,关于你说的,/proc/net/ip_tables_names这个文件, 如果不行再用这种方法吧,确实服务启动状态和-L后这个文件都存在,那么就可以判断文件存在来判断服务启动或者所谓的被加载吧,我可以理解-L后的那个状态是服务启动但没加载规则吧?





#11


引用 10 楼 ladofwind 的回复:
Quote: 引用 9 楼 zgglj 的回复:

Quote: 引用 8 楼 ladofwind 的回复:

Quote: 引用 7 楼 zgglj 的回复:

那就不好办了,你究竟是想看服务是否开启还是规则是否加载哦?


这么跟你说吧,我的程序要在规则里添加些东西,比如端口开放之类的,也就是修改iptables服务的规则,
但是不希望改变它的运行状态,也就是说,我的程序运行的效果
1. 如果客户机器上的iptables没有启动,我就添加规则然后把service iptables stop掉,不改变客户以前的状态
2. 如果客户机器上iptables服务本来就启动的,我就添加我的规则

所以我的问题关键就是,我判断服务开启与否目前是service iptables status|grep "is stopped"
来判断的,结果发现还有-L后的这种情况,这种加载后服务到底算启动了还是没启动呢?应该是说加载
了规则但没启动吧,如果是这样,我就要把这种情况反应在我的代码里,也归到未启动里面,没太好办法


1.你描述iptables没有启用的时候你无法加载规则,如果你启用后加规则再停用,这样没有意义,因为规则没有生效,即便是用户这时启用iptables,你加载的规则也不会存在;
2.你无法判断当前iptables是本来就启用的还是由于其他用户调用iptables -L导致启用的;
你应该这样设计:
1.判断iptables服务状态,可以根据service iptables status,也可以根据之前我说的文件判断的方式判断,整个判断过程中你自己不要调用iptables -L,确保不是你启用的iptables;
2.如果iptables是启用状态,添加你的规则;
3.如果iptables未启用,则什么事情都不做


明白你的意思,我告诉测试人员不要用iptables -L了, 说这条命令会把服务启动,也就不是stop状态了,看看他还找茬不,关于你说的,/proc/net/ip_tables_names这个文件, 如果不行再用这种方法吧,确实服务启动状态和-L后这个文件都存在,那么就可以判断文件存在来判断服务启动或者所谓的被加载吧,我可以理解-L后的那个状态是服务启动但没加载规则吧?


是的

#12


学习下吧……