常见 iptables 的 firewall 设定配置问题.docx
《常见 iptables 的 firewall 设定配置问题.docx》由会员分享,可在线阅读,更多相关《常见 iptables 的 firewall 设定配置问题.docx(16页珍藏版)》请在冰豆网上搜索。
常见iptables的firewall设定配置问题
发表于:
2006-8-1615:
49
[引用] [投诉][快速回复]
=========================================
=========================================
常见iptables的firewall设定配置问题:
作者:
小州(kenduest)
最近更新时间:
8/18/200615:
50
=========================================
=========================================
标题列表项目:
(一般本机的firewall配置问题)
1.如何查询我目前iptables的配置组态设定?
2.如何关闭LinuxDistro本身的firewall配置并让规则清空不启用?
3.关于RedHat9,Fedora与RHEL的firewall配置问题
4.如何使用手动方式清空与重置iptablesfirewallrule?
5.iptablesfirewall本身封包比对判断流程图为何?
6.iptablesfirewall本身封包比对规则方式为何?
7.使用-PINPUTDROP引起的主機本身對外連線不通问题?
8.使用-PINPUTDROP导致本机存取自己服务也受到限制?
9.使用-PINPUTDROP引起的网路存取正常,但是ftp连入却失败?
10.使用-POUTPUTDROP引起的网路不通问题?
11.有无建议本机firewall服务只有开放对外项目,其余禁止的配置方式?
标题列表项目:
(提供NAT服务配置问题)
1.一般建议单纯化的NAT服务配置语法为何?
2.透过NAT上网的内部ip主机,ftp连结存取错误?
3.如何配置连线到NAT主机某个对外Port时,可以转送到内部某主机?
4.使用-jMASQUERADE与-jSNAT于NAT使用差异?
=========================================
一般本机的firewall配置问题
=====
1.如何查询我目前iptables的配置组态设定?
iptables本身提供了iptables-save这个程式档案,执行后可以检视目前的配置。
CODE:
[Copytoclipboard]
iptables-save
若是使用iptables该主要的程式的话,可以搭配-L选项列出规则清单。
不过由于iptables过滤本身是可以针对不同table来处理,传入-t可以查阅指定的table,不指定时预设表示使用filtertable项目。
一般使用方式:
CODE:
[Copytoclipboard]
iptables-L
iptables-tnat-L
不过iptables对于规则内有ip位址项目时会进行反查解析出主机名称,这个也常导致反查时需要时间导致列出规则时卡住无法运作下去,所以实际上一般会搭配传入-n选项,表示不显示反查后主机名称结果。
CODE:
[Copytoclipboard]
iptables-L-n
iptables-tnat-L-n
当然,若是要查阅更详细的资讯,可以再搭配-v选项。
CODE:
[Copytoclipboard]
iptables-L-n-v
iptables-tnat-L-n-v
=====
2.如何关闭LinuxDistro本身的firewall配置并让规则清空不启用?
各家发行版本都会提供各自的firewallscript于开机时自动带入设定规则,所以并没有一个统一的做法。
--
在RHEL与FedoraLinux内的开机script本身为/etc/init.d/iptables,所以关闭方式手动可以执行:
CODE:
[Copytoclipboard]
/etc/init.d/iptablesstop
设定每次开启不启动该服务项目,可以使用chkconfig来关闭。
CODE:
[Copytoclipboard]
chkconfigiptablesoff
--
若是SLES的话,修改/etc/sysconfig/network/config配置,里面可以找到:
CODE:
[Copytoclipboard]
#WiththisvariableyoucandetermineiftheSuSEfirewallwhenenabled
#shouldgetstartedwhennetworkinterfacesarestarte
FIREWALL="yes|no"
这可以设定每次启动网路时是否启用firewall配置。
=====
3.关于RedHat9,Fedora与RHEL的firewall配置问题
系统本身提供配置firewall方式,文字模式是可以执行setup程式, 于Firewall项目进入后就可以选择新增相关规则。
最后所开放允许的组态都是储存于/etc/sysconfig/iptables档案内。
使用/etc/init.d/iptablesstart或者是serviceiptablesstart时,就会依据/etc/sysconfig/iptables设定的配置启用firewall设定。
于/etc/sysconfig/iptables的格式结果,可以使用iptables-restore程式由标准输入读入后进行启用。
简单说所谓开启该服务,其实也就是:
CODE:
[Copytoclipboard]
iptables-restore
执行/etc/init.d/iptablessave可以把目前系统正在运作执行配置的规则储存至/etc/sysconfig/iptables档案内,这底层其实也是呼叫 iptables-save程式来达成该结果。
简单说也就是:
CODE:
[Copytoclipboard]
iptables-save>/etc/sysconfig/iptables
关于/etc/sysconfig/iptables本身只有包含给firewallrule的规则叙述,本身并没有包含任何iptables相关kernelmodule载入配置, 若是需要载入额外的module的话可以修改/etc/sysconfig/iptables-config。
/etc/sysconfig/iptables-config本身或于/etc/ini.d/iptables该脚本档案时读入使用。
依据该内容来看,提供相关变数定义可以指定载入必要的module项目:
CODE:
[Copytoclipboard]
#Loadadditionaliptablesmodules(nathelpers)
# Default:
-none-
#Spaceseparatedlistofnathelpers(e.g.'ip_nat_ftpip_nat_irc'),
#whichareloadedafterthefirewallrulesareapplied.Optionsfor
#thehelpersarestoredin/etc/modprobe.conf.
IPTABLES_MODULES=""
=====
4.如何使用手动方式清空与重置iptablesfirewallrule?
若是纯手动的方始清空所有规则设定,一般可以采用下列方式:
CODE:
[Copytoclipboard]
iptables-F #若是没有加上-t指定table,预设是使用-tfilter
iptables-X
iptables-F-tnat
iptables-X-tnat
iptables-F-tmangle
iptables-X-tmangle
其中-F表示清除指定table内所有chain项目内的规则清单设定。
-X则是表示删除使用者自订的chain项目。
除了清除外,建议需要把过滤预设的政策设定为ACCEPT,也就是允许任何封包的传输不会被阻挡。
CODE:
[Copytoclipboard]
iptables-PINPUTACCEPT#没加上-t指定table,预设使用-tfilter
iptables-POUTPUTACCEPT
iptables-PFORWARDACCEPT
iptables-tnat-POUTPUTACCEPT
iptables-tnat-PPREROUTINGACCEPT
iptables-tnat-PPOSTROUTINGACCEPT
iptables-tmangle-PPREROUTINGACCEPT
iptables-tmangle-PPOSTROUTINGACCEPT
iptables-tmangle-PINPUTACCEPT
iptables-tmangle-POUTPUTACCEPT
iptables-tmangle-PFORWARDACCEPT
同时,后续若是手动打造iptablesfirewallrule的时候,该技巧也应该用上,也就是先清除之前规则外,包含把预设的政策都改成ACCEPT,这样配置firewall规则才不会混乱不堪。
=====
5.iptablesfirewall本身封包比对判断流程图为何?
详细部份可以参阅这张表格:
CODE:
[Copytoclipboard]
=====
6.iptablesfirewall本身封包比对规则方式为何?
这个要区分成为几点来说明:
1)一般说法就是,firstmatch,也就是符合规则叙述后就不再往下走
比方配置:
CODE:
[Copytoclipboard]
iptables-PINPUTACCEPT
iptables-AINPUT-s192.168.1.1-jACCEPT
iptables-AINPUT-s192.168.1.0/24-jDROP
这就是192.168.1.0/24中,只有允许192.168.1.1可以存取,其余192.168.1.0/24该网段ip都禁止存取。
常见设定观念错误如下:
CODE:
[Copytoclipboard]
iptables-PINPUTACCEPT
iptables-AINPUT-jACCEPT
iptables-AINPUT-s192.168.1.0/24-jDROP
为何1921.68.1.0/24还是可以存取不被禁止?
这就是比对的符合就不会继续往下走。
不过这边到是要先注明的是,-jLOG与-jMARK这类规则倒是会继续往下比对,这个与-jACCEPT与-jDROP就不相同情况。
2)当比对规则都跑完了都没有任何符合的叙述时,最后结果要看预设政策设定
CODE:
[Copytoclipboard]
iptables-PINPUTACCEPT
iptables-AINPUT-s192.168.1.0/24-jDROP
......
上面规则来说,表示预设封包都允许连入存取的,只有禁止192.168.1.0/24,也就是说比对流程规则跑完后都没有任何符合叙述,最后就是允许存取。
CODE:
[Copytoclipboard]
iptables-PINPUTDROP
iptables-AINPUT-s192.168.1.0/24-jACCEPT
......
上面规则来说,表示预设封包都禁止连入存取的,只有允许192.168.1.0/24,也就是说比对流程规则跑完后都没有任何符合叙述,最后就是允许禁止。
把预设的政策调整为DROP基本上需要注意非常多流程,下面部份会谈到这部份要注意事项。
一般来说建议除非很清楚把预设存取设定为DROP带来的结果,要不然请勿贸然配置使用。
因為這樣設定的話,雖然是說只有開放192.168.1.0/24可以連入存取,但是卻會導致這台服務主機只可以連線到192.168.1.0/24網段的主機,其他的目的都被禁止了。
=====
7.使用-PINPUTDROP引起的主機本身對外連線不通问题?
为了更严厉的防火墙存取限制,一般初学者会这样配配置:
CODE:
[Copytoclipboard]
iptables-PINPUTDROP
iptables-AINPUT-ptcp--dport22-jACCEPT
也就是主机只有打算开放ssh服务对外提供存取。
这样乍看之下好像非常正确,但是设定好后外面是可以連到該port22服務,但是卻導致了一個後續的問題,也就是"該主機若是要主動對外要建立連線卻被禁止"。
比方這台服務主機無法使用ssh登入到遠端主機,也無法用瀏覽器看其他主機port80的http服務的。
引起該問題的原因呢?
TCP/IP本身是双向的,也就是有出必有进,有进必有出。
这个规则没考虑到这点问题。
当主机对外要建立连线时,对方势必也要回应封包到原主机,所以回应的封包是要被允许的。
不过该配置来看却没考虑到这点问题,所以导致回应的封包被丢弃,所以连线根本建立失败。
所以設定-PINPUTDROP時,一般正确方式应该考虑加上允许主機本身對外連線時對方回应封包项目,也就是:
CODE:
[Copytoclipboard]
iptables-PINPUTDROP
iptables-AINPUT-mstate--stateESTABLISHED-jACCEPT
iptables-AINPUT-ptcp--dport22-jACCEPT
-mstate--stateESTABLISHED扮演很重要角色,那就是允许连线出去后对方主机回应进来的封包。
=====
8.使用-PINPUTDROP导致本机存取自己服务也受到限制?
CODE:
[Copytoclipboard]
iptables-PINPUTDROP
iptables-AINPUT-mstate--stateESTABLISHED-jACCEPT
iptables-AINPUT-ptcp--dport22-jACCEPT
不过上面规则通常应该考虑的是,主机本身对外只有提供可以连结存取port22该ssh服务,但是若是自己主机有开port80与port25等 服务项目的话,这样配置却也导致自己存取自己的主机服务也被限制住了。
基于该问题,一般会建议加上由loopbackinterface该介面不受到该firewall组态限制而被阻挡,一般会建议改成:
CODE:
[Copytoclipboard]
iptables-PINPUTDROP
iptables-AINPUT-ilo-jACCEPT
iptables-AINPUT-mstate--stateESTABLISHED-jACCEPT
iptables-AINPUT-ptcp--dport22-jACCEPT
=====
9.使用-PINPUTDROP引起的网路存取正常,但是ftp连入却失败?
依据前面介绍方式,只有开放ftpport21服务,其他都禁止的话,一般会配置使用:
CODE:
[Copytoclipboard]
iptables-PINPUTDROP
iptables-AINPUT-mstate--stateESTABLISHED-jACCEPT
iptables-AINPUT-ptcp--dport21-jACCEPT
这样的配置,确认ftp用户端是可以连到ftp主机并且看到欢迎登入画面,不过后续要浏览档案目录清单与档案抓取时却会发生错误...
ftp协定本身于datachannnel还可以区分使用activemode与passivemode这两种传输模式,而就以passivemode来说,最后是协议让ftpclient连结到ftpserver本身指定于大于1024port的连接埠传输资料。
这样配置在ftp传输使用active可能正常,但是使用passivemode却发生错误,其中原因就是因为该主机firewall规则配置不允许让ftpclient连结到ftpserver指定的连结埠才引发这个问题。
要解决该问题方式,于iptables内个名称为ip_conntrack_ftp的helper,可以针对连入与连外目的port为21的ftp协定命令沟通进行拦截,提供给iptables设定firwewall规则的配置使用。
开放做法为:
CODE:
[Copytoclipboard]
modprobeip_conntrack_ftp
iptables-PINPUTDROP
iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
iptables-AINPUT-ilo-jACCEPT
iptables-AINPUT-ptcp--dport21-jACCEPT
其中-mstate部分另外多了RELATED的项目,该项目也就是状态为主动建立的封包,不过是因为与现有ftp这类连线架构会引发另外才产生的主动建立的项目。
不过若是主机ftp服务不在port21的话,请使用下列方式进行调整:
CODE:
[Copytoclipboard]
modprobeip_conntrack_ftpports=21,30000
iptables-PINPUTDROP
iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
iptables-AINPUT-ilo-jACCEPT
iptables-AINPUT-ptcp--dport21-jACCEPT
iptables-AINPUT-ptcp--dport30000-jACCEPT
也就是主机本身提供ftp服务分别在port21与30000上,让ip_conntrack_ftp 这个ftphelper能够正常提供ftp用户端使用passivemode存取而不会产生问题。
=====
10.使用-POUTPUTDROP引起的网路不通问题?
来看看这样配置片段叙述:
CODE:
[Copytoclipboard]
iptables-PINPUTACCEPT
iptables-POUTPUTDROP
这样配置来看,感觉上就是主机对外完全开放没有任何限制连入,但是该主机对外本身限制预设不可以连外,但是结果却是不管外面也根本连不进来。
该问题如同上面提到使用-PINPUTDROP的配置问题一样,这样也是根本没有考虑到TCP/IP本身是双向沟通的问题。
考虑连入封包后续主机要回应的项目,也是需要搭配传入-mstate来提供允许回应封包的项目,所以整个来看片段叙述为:
CODE:
[Copytoclipboard]
iptables-POUTPUTDROP
iptables-AOUTPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
iptables-AOUTPUT-olo-jACCEPT
这样设定好结果,就是该主机本身可以对自己主机服务连结存取,但是对外连结存取都会被禁止。
不过拉回来看,有必要配置-POUTPUTDROP吗?
老实说个人倒是感觉通常都是多此一举,因为实际应用部份通常不会限制自己主机对外连线的功能。
不过若是坚持要设定-POUTPUTDROP的话,要考虑后续主动连外部份的开放描述可能可多了....比方这样配置项目:
CODE:
[Copytoclipboard]
iptables-POUTPUTDROP
iptables-AOUTPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
iptables-AOUTPUT-olo-jACCEPT
iptables-AOUTPUT-ptcp--dport25-jACCEPT
iptables-AOUTPUT-pudp--dport53-jACCEPT
iptables-AOUTPUT-ptcp--dport80-jACCEPT
这样是不是有点找自己麻烦?
所以结论就是除非定真的是不想让自己主机有主动连外的需求,那才考虑把OUTPUTchain的预设政策