常见 iptables 防火墙设定配置问题

来源:互联网 发布:linux下配置php环境 编辑:程序博客网 时间:2024/06/14 11:02
常见 iptables防火墙设定配置问题

=========================================

标题列表项目:   (一般本机的 firewall配置问题)

1. 如何查询我目前 iptables 的配置组态设定 ?

2. 如何关闭 Linux Distro 本身的 firewall配置并让规则清空不启用?

3. 关于 RedHat 9, Fedora 与 RHEL 的firewall 配置问题

4. 如何使用手动方式清空与重置 iptables firewallrule?

5. iptables firewall 本身封包比对判断流程图为何?

6. iptables firewall 本身封包比对规则方式为何?

7. 使用 -P INPUT DROP引起的主機本身對外連線不通问题?

8. 使用 -P INPUT DROP导致本机存取自己服务也受到限制?

9. 使用 -P INPUT DROP 引起的网路存取正常,但是 ftp连入却失败?

10. 使用 -P OUTPUT DROP 引起的网路不通问题?

11. 有无建议本机 firewall服务只有开放对外项目,其余禁止的配置方式?

标题列表项目:   (提供 NAT 服务配置问题)

1. 一般建议单纯化的 NAT 服务配置语法为何?

2. 透过 NAT 上网的内部 ip 主机,ftp 连结存取错误?

3. 如何配置连线到 NAT 主机某个对外 Port时,可以转送到内部某主机?

4. 使用 -j MASQUERADE 与 -j SNAT 于 NAT使用差异 ?

=========================================

一般本机的 firewall 配置问题

=====

1. 如何查询我目前 iptables 的配置组态设定 ?

iptables 本身提供了 iptables-save这个程式档案,执行后可以检视目前的配置。

 

[Copy to clipboard][ - ]

CODE:

iptables-save

若是使用 iptables 该主要的程式的话,可以搭配 -L选项列出规则清单。不过由于 iptables 过滤本身是可以针对不同 table 来处理,传入 -t 可以查阅指定的table,不指定时预设表示使用 filter table 项目。一般使用方式:

 

[Copy to clipboard][ - ]

CODE:

iptables -L

iptables -t nat -L

不过 iptables 对于规则内有 ip位址项目时会进行反查解析出主机名称,这个也常导致反查时需要时间导致列出规则时卡住无法运作下去,所以实际上一般会搭配传入 -n选项,表示不显示反查后主机名称结果。

 

[Copy to clipboard][ - ]

CODE:

iptables -L -n

iptables -t nat -L -n

当然,若是要查阅更详细的资讯,可以再搭配 -v 选项。

 

[Copy to clipboard][ - ]

CODE:

iptables -L -n -v

iptables -t nat -L -n -v

=====

2. 如何关闭 Linux Distro 本身的 firewall配置并让规则清空不启用?

各家发行版本都会提供各自的 firewall script于开机时自动带入设定规则,所以并没有一个统一的做法。

--

在 RHEL 与 Fedora Linux 内的开机 script 本身为/etc/init.d/iptables,所以关闭方式手动可以执行:

 

[Copy to clipboard][ - ]

CODE:

/etc/init.d/iptables stop

设定每次开启不启动该服务项目,可以使用 chkconfig 来关闭。

 

[Copy to clipboard][ - ]

CODE:

chkconfig iptables off

--

   若是SLES 的话,修改 /etc/sysconfig/network/config 配置,里面可以找到:

 

[Copy to clipboard][ - ]

CODE:

# With this variable you can determineif the SuSEfirewall when enabled

# should get started when networkinterfaces are starte

FIREWALL="yes|no"

这可以设定每次启动网路时是否启用 firewall 配置。

=====

3. 关于 RedHat 9, Fedora 与 RHEL 的firewall 配置问题

系统本身提供配置 firewall 方式,文字模式是可以执行 setup程式, 于 Firewall 项目进入后就可以选择新增相关规则。最后所开放允许的组态都是储存于/etc/sysconfig/iptables 档案内。

使用 /etc/init.d/iptables start 或者是service iptables start 时,就会依据 /etc/sysconfig/iptables 设定的配置启用firewall 设定。

于 /etc/sysconfig/iptables 的格式结果,可以使用iptables-restore 程式由标准输入读入后进行启用。简单说所谓开启该服务,其实也就是:

 

[Copy to clipboard][ - ]

CODE:

iptables-restore </etc/sysconfig/iptables

执行 /etc/init.d/iptables save可以把目前系统正在运作执行配置的规则储存至 /etc/sysconfig/iptables 档案内,这底层其实也是呼叫iptables-save 程式来达成该结果。简单说也就是:

 

[Copy to clipboard][ - ]

CODE:

iptables-save >/etc/sysconfig/iptables

关于 /etc/sysconfig/iptables 本身只有包含给firewall rule 的规则叙述,本身并没有包含任何 iptables 相关 kernel module载入配置,   若是需要载入额外的 module 的话可以修改/etc/sysconfig/iptables-config。

/etc/sysconfig/iptables-config 本身或于/etc/ini.d/iptables 该脚本档案时读入使用。依据该内容来看,提供相关变数定义可以指定载入必要的module项目:

 

[Copy to clipboard][ - ]

CODE:

# Load additional iptables modules (nathelpers)

# Default: -none-

# Space separated list of nat helpers(e.g. 'ip_nat_ftp ip_nat_irc'),

# which are loaded after the firewallrules are applied. Options for

# the helpers are stored in/etc/modprobe.conf.

IPTABLES_MODULES=""

=====

4. 如何使用手动方式清空与重置 iptables firewallrule?

若是纯手动的方始清空所有规则设定,一般可以采用下列方式:

 

[Copy to clipboard][ - ]

CODE:

iptables -F # 若是没有加上 -t 指定 table,预设是使用-t filter

iptables -X

iptables -F -t nat

iptables -X -t nat

iptables -F -t mangle

iptables -X -t mangle

其中 -F 表示清除指定 table 内所有 chain项目内的规则清单设定。 -X 则是表示删除使用者自订的 chain 项目。

  除了清除外,建议需要把过滤预设的政策设定为 ACCEPT,也就是允许任何封包的传输不会被阻挡。

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT ACCEPT # 没加上 -t 指定table,预设使用 -t filter

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -t nat -P OUTPUT ACCEPT

iptables -t nat -P PREROUTINGACCEPT

iptables -t nat -P POSTROUTINGACCEPT

iptables -t mangle -P PREROUTINGACCEPT

iptables -t mangle -P POSTROUTINGACCEPT

iptables -t mangle -P INPUT ACCEPT

iptables -t mangle -P OUTPUT ACCEPT

iptables -t mangle -P FORWARDACCEPT

同时,后续若是手动打造 iptables firewall rule的时候,该技巧也应该用上,也就是先清除之前规则外,包含把预设的政策都改成 ACCEPT,这样配置 firewall规则才不会混乱不堪。

=====

5. iptables firewall 本身封包比对判断流程图为何?

详细部份可以参阅这张表格:

 

[Copy to clipboard][ - ]

CODE:

http://ebtables.sourceforge.net/br_fw_ia/bridge3b.png

常见 iptables 防火墙设定配置问题 - PHP程序员 - 李国华(PHP程序员)博客-MYSQLscreen.width*0.7) {this.resized=true;this.width=screen.width*0.7; this.alt='Click here to open newwindow\nCTRL+Mouse wheel to zoom in/out';}"border=0>

=====

6. iptables firewall 本身封包比对规则方式为何?

这个要区分成为几点来说明:

1) 一般说法就是,firstmatch,也就是符合规则叙述后就不再往下走

  比方配置:

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT ACCEPT

iptables -A INPUT -s 192.168.1.1 -jACCEPT

iptables -A INPUT -s 192.168.1.0/24 -jDROP

这就是 192.168.1.0/24 中,只有允许 192.168.1.1可以存取,其余192.168.1.0/24 该网段 ip 都禁止存取。

  常见设定观念错误如下:

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT ACCEPT

iptables -A INPUT -j ACCEPT

iptables -A INPUT -s 192.168.1.0/24 -jDROP

为何 1921.68.1.0/24还是可以存取不被禁止?这就是比对的符合就不会继续往下走。

不过这边到是要先注明的是,-j LOG 与 -j MARK这类规则倒是会继续往下比对,这个与 -j ACCEPT 与 -j DROP 就不相同情况。

2)当比对规则都跑完了都没有任何符合的叙述时,最后结果要看预设政策设定

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT ACCEPT

iptables -A INPUT -s 192.168.1.0/24 -jDROP

......

上面规则来说,表示预设封包都允许连入存取的,只有禁止192.168.1.0/24,也就是说比对流程规则跑完后都没有任何符合叙述,最后就是允许存取。

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT DROP

iptables -A INPUT -s 192.168.1.0/24 -jACCEPT

......

上面规则来说,表示预设封包都禁止连入存取的,只有允许192.168.1.0/24,也就是说比对流程规则跑完后都没有任何符合叙述,最后就是允许禁止。

把预设的政策调整为 DROP基本上需要注意非常多流程,下面部份会谈到这部份要注意事项。一般来说建议除非很清楚把预设存取设定为 DROP带来的结果,要不然请勿贸然配置使用。因為這樣設定的話,雖然是說只有開放 192.168.1.0/24可以連入存取,但是卻會導致這台服務主機只可以連線到 192.168.1.0/24 網段的主機,其他的目的都被禁止了。

=====

7. 使用 -P INPUT DROP引起的主機本身對外連線不通问题?

为了更严厉的防火墙存取限制,一般初学者会这样配配置:

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT DROP

iptables -A INPUT -p tcp --dport 22 -jACCEPT

也就是主机只有打算开放 ssh 服务对外提供存取。

这样乍看之下好像非常正确,但是设定好后外面是可以連到該 port 22服務,但是卻導致了一個後續的問題,也就是 "該主機若是要主動對外要建立連線卻被禁止"。比方這台服務主機無法使用 ssh登入到遠端主機,也無法用瀏覽器看其他主機 port 80 的 http 服務的。

引起該問題的原因呢? TCP/IP本身是双向的,也就是有出必有进,有进必有出。这个规则没考虑到这点问题。

当主机对外要建立连线时,对方势必也要回应封包到原主机,所以回应的封包是要被允许的。不过该配置来看却没考虑到这点问题,所以导致回应的封包被丢弃,所以连线根本建立失败。

所以設定 -P INPUT DROP時,一般正确方式应该考虑加上允许主機本身對外連線時對方回应封包项目,也就是:

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT DROP

iptables -A INPUT -m state --stateESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -jACCEPT

-m state --state ESTABLISHED扮演很重要角色,那就是允许连线出去后对方主机回应进来的封包。

=====

8. 使用 -P INPUT DROP导致本机存取自己服务也受到限制?

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT DROP

iptables -A INPUT -m state --stateESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -jACCEPT

不过上面规则通常应该考虑的是,主机本身对外只有提供可以连结存取port 22该 ssh 服务,但是若是自己主机有开 port 80 与 port 25等  服务项目的话,这样配置却也导致自己存取自己的主机服务也被限制住了。

基于该问题,一般会建议加上由 loopback interface该介面不受到该 firewall 组态限制而被阻挡,一般会建议改成:

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT DROP

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -m state --stateESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -jACCEPT

=====

9. 使用 -P INPUT DROP 引起的网路存取正常,但是 ftp连入却失败?

依据前面介绍方式,只有开放 ftp port 21服务,其他都禁止的话,一般会配置使用:

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT DROP

iptables -A INPUT -m state --stateESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -jACCEPT

这样的配置,确认 ftp 用户端是可以连到 ftp主机并且看到欢迎登入画面,不过后续要浏览档案目录清单与档案抓取时却会发生错误...

ftp 协定本身于 data channnel 还可以区分使用active mode 与 passive mode 这两种传输模式,而就以 passive mode 来说,最后是协议让 ftpclient 连结到 ftp server 本身指定于大于 1024 port 的连接埠传输资料。

  

这样配置在 ftp 传输使用 active 可能正常,但是使用 passivemode 却发生错误,其中原因就是因为该主机firewall 规则配置不允许让 ftp client 连结到 ftp server指定的连结埠才引发这个问题。

要解决该问题方式,于 iptables 内个名称为ip_conntrack_ftp 的 helper,可以针对连入与连外目的 port 为 21 的 ftp协定命令沟通进行拦截,提供给 iptables 设定 firwewall 规则的配置使用。开放做法为:

 

[Copy to clipboard][ - ]

CODE:

 

modprobe ip_conntrack_ftp

iptables -P INPUT DROP

iptables -A INPUT -m state --stateESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -jACCEPT

其中 -m state 部分另外多了 RELATED的项目,该项目也就是状态为主动建立的封包,不过是因为与现有 ftp 这类连线架构会引发另外才产生的主动建立的项目。

不过若是主机 ftp 服务不在 port 21的话,请使用下列方式进行调整:

 

[Copy to clipboard][ - ]

CODE:

modprobe ip_conntrack_ftpports=21,30000

iptables -P INPUT DROP

iptables -A INPUT -m state --stateESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -jACCEPT

iptables -A INPUT -p tcp --dport 30000-j ACCEPT

也就是主机本身提供 ftp 服务分别在 port 21 与 30000 上,让ip_conntrack_ftp   这个 ftp helper能够正常提供 ftp 用户端使用 passive mode 存取而不会产生问题。

=====

10. 使用 -P OUTPUT DROP 引起的网路不通问题?

来看看这样配置片段叙述:

 

[Copy to clipboard][ - ]

CODE:

iptables -P INPUT ACCEPT

iptables -P OUTPUT DROP

这样配置来看,感觉上就是主机对外完全开放没有任何限制连入,但是该主机对外本身限制预设不可以连外,但是结果却是不管外面也根本连不进来。

该问题 如同上面提到使用 -P INPUT DROP的配置问题一样,这样也是根本没有考虑到 TCP/IP 本身是双向沟通的问题。

考虑连入封包后续主机要回应的项目,也是需要搭配传入 -m state来提供允许回应封包的项目,所以整个来看片段叙述为:

 

[Copy to clipboard][ - ]

CODE:

iptables -P OUTPUT DROP

iptables -A OUTPUT -m state --stateESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

这样设定好结果,就是该主机本身可以对自己主机服务连结存取,但是对外连结存取都会被禁止。

不过拉回来看,有必要配置 -P OUTPUT DROP吗?老实说个人倒是感觉通常都是多此一举,因为实际应用部份通常不会限制自己主机对外连线的功能。

不过若是坚持要设定 -P OUTPUT DROP的话,要考虑后续主动连外部份的开放描述可能可多了.... 比方这样配置项目:

 

[Copy to clipboard][ - ]

CODE:

iptables -P OUTPUT DROP

iptables -A OUTPUT -m state --stateESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

iptables -A OUTPUT -p tcp --dport 25 -jACCEPT

iptables -A OUTPUT -p udp --dport 53 -jACCEPT

iptables -A OUTPUT -p tcp --dport 80 -jACCEPT

这样是不是有点找自己麻烦?

所以结论就是除非定真的是不想让自己主机有主动连外的需求,那才考虑把OUTPUT chain 的预设政策设定为 DROP,否则不要使用这种配置。

=====

11. 有无建议本机 firewall服务只有开放对外项目,其余禁止的配置方式?

依据前面谈到流程,若是预设 INPUT的存取是禁止的话,提供如下配置参考:

 

[Copy to clipboard][ - ]

CODE:

modprobe ip_conntrack_ftp

iptables -P INPUT DROP

iptables -A INPUT -m state --stateESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -jACCEPT

iptables -A INPUT -p tcp --dport 22 -jACCEPT

若是预设 INPUT 的存取是允许的话,提供如下配置参考:

 

[Copy to clipboard][ - ]

CODE:

modprobe ip_conntrack_ftp

iptables -P INPUT ACCEPT

iptables -A INPUT -m state --stateESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -jACCEPT

iptables -A INPUT -p tcp --dport 22 -jACCEPT

iptables -A INPUT -m state --stateNEW,INVALID -j DROP

若是需要允许主机可以接受 ping程式测试这台机器是否可以存取的话,可以搭配使用:

 

[Copy to clipboard][ - ]

CODE:

iptables -A INPUT -p icmp --icmp-typeecho-request -j ACCEPT

当然请注意,搭配先使用 -F 与 -X 先把预先存在的 rule清空后,避免

rule 混杂在一起而互相影响。

=====

提供 NAT 服务配置问题

=====

1. 一般建议单纯化的 NAT 服务配置语法为何?

这边是假设对外的介面为 eth0,对内介面为 eth1,该对内网段的 ip范围是 192.168.1.0/24。

若是预设的 FORWARD chain 本身为 ACCEPT的话,配置语法使用为:

 

[Copy to clipboard][ - ]

CODE:

iptables -A POSTROUTING -t nat -s192.168.1.0/24 -o eth0 -j MASQUERADE

echo 1 >/proc/sys/net/ipv4/ip_forward

若是预设的 FORWARD chain 本身为 DROP的话,配置语法使用为:

 

[Copy to clipboard][ - ]

CODE:

iptables -A POSTROUTING -t nat -s192.168.1.0/24 -o eth0 -j MASQUERADE

iptables -A FORWARD -m state --stateESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -s 192.168.1.0/24-j ACCEPT

echo 1 >/proc/sys/net/ipv4/ip_forward

当然,请不要忘记前面谈到的议题,也就是搭配先使用好 -F 与 -X这类项目。还有预设 FORWARD chain 为 DROP 的话,考虑是否也开放允许 echo-request 这类 icmp协定封包能够允许由内部网段传送出去。

=====

2. 透过 NAT 上网的内部 ip 主机,ftp 连结存取错误?

该问题点与前面谈到 ftp 问题与搭配使用 -m state --stateRELATED 配置有关系。由于目前要的是 NAT 下 ftp 连线的追踪功能,所以需要搭配挂入ip_nat_ftp 该 module才可以正确提供追踪机制。

所以经过该修改配置,于预设的 FORWARD chain 本身为 ACCEPT的话,配置语法使用为:

 

[Copy to clipboard][ - ]

CODE:

modprobe ip_nat_ftp

iptables -A POSTROUTING -t nat -o eth0-s 192.168.1.0/24 -j MASQUERADE

iptables -A FORWARD -m state --stateESTABLISHED,RELATED -j ACCEPT

echo 1 >/proc/sys/net/ipv4/ip_forward

搭配 ip_nat_ftp module 后,如此于 FORWARDchain 内使用的 RELATED 参数才会有效用。

=====

3. 如何配置连线到 NAT 主机某个对外 Port时,可以转送到内部某主机?

一般语法配置为:

 

[Copy to clipboard][ - ]

CODE:

iptables -A PREROUTING -t nat -d210.1.1.1 -p tcp --dport 80 -j DNAT --to-destination192.168.1.1:80

这边是假设该 NAT 主机本身对外的 ip 为210.1.1.1,设定外面连结存取到该 ip 的 port 80 时,将封包转送到 192.168.1.1 的 port 80上。

不过该配置常谈到的问题就是,也许有人在 192.168.1.0/24该内部网段连结 210.1.1.1 的 port 80 时,却无法浏览实际 192.168.1.1:80 该服务项目。

该问题牵涉到 icmp 重导的问题,而且目前 netfilteriptables 发展已经不会有该问题。若是还有问题的话,可以考虑如下配置:

 

[Copy to clipboard][ - ]

CODE:

iptables -t nat -A POSTROUTING -d192.168.1.1 -p tcp --dport 80 -s 192.168.1.0/24 -j SNAT --to192.168.1.254

其中 192.168.1.254 也就是 NAT 主机对内的ip,这样可以让该内部的192.168.1.1 看到的存取来源为 192.168.1.254,如此可以解决该问题。

=====

4. 使用 -j MASQUERADE 与 -j SNAT 于 NAT使用差异 ?

这边是假设该 NAT 主机本身对外的介面为 eth0,奇 ip 为210.1.1.1;对内介面为 eth1,该对内网段的 ip 范围是 192.168.1.0/24。

一般选择提供 NAT 服务,让内部 privae ip 可以存取连上internet 的配置方式有:

 

[Copy to clipboard][ - ]

CODE:

iptables -A POSTROUTING -t nat -s192.168.1.0/24 -j MASQUERADE

echo 1 >/proc/sys/net/ipv4/ip_forward

另外一种使用方式:

 

[Copy to clipboard][ - ]

CODE:

iptables -A POSTROUTING -t nat -s192.168.1.0/24 -j SNAT --to 210.1.1.1

echo 1 >/proc/sys/net/ipv4/ip_forward

基本上最后的结果都是可以达成需求的,不过一般差别为:

1) 使用 -j SNAT 一般会比 -j MASQUERADE效率来的好,因为这牵涉到封包传送通过相关介面时的相关比对问题

2) 若是对外本身 ip不是固定的,也就是拨接取得这类会非固定的环境之下,采用 -j MASQUERADE 会比较方便使用

=====