当前位置: > Linux服务器 > iptables >

Linux iptables firewall 設定常見 FAQ 整理(2)

时间:2015-01-29 02:39来源:linux.it.net.cn 作者:IT

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

 

iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

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

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

iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT



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

 

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

iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

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

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

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

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

modprobe ip_conntrack_ftp

iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

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

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

modprobe ip_conntrack_ftp ports=21,30000

iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
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 引起的网路不通问题? 

 

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

iptables -P INPUT ACCEPT
iptables -P OUTPUT DROP

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

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

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

iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

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

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

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

iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

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

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



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

 

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

modprobe ip_conntrack_ftp

iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

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

modprobe ip_conntrack_ftp

iptables -P INPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state NEW,INVALID -j DROP

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

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

当然请注意,搭配先使用 -F 与 -X 先把预先存在的 rule 清空后,避免rule 混杂在一起而互相影响。



提供 NAT 服务配置问题

 

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

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

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

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

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

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

iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -m state --state ESTABLISHED,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 --state RELATED 配置有关系。由于目前要的是 NAT 下 ftp 连线的追踪功能,所以需要搭配挂入ip_nat_ftp 该 module 才可以正确提供追踪机制。

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

modprobe ip_nat_ftp

iptables -A POSTROUTING -t nat -o eth0 -s 192.168.1.0/24 -j MASQUERADE
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

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

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



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

 

一般语法配置为:

iptables -A PREROUTING -t nat -d 210.1.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.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 重导的问题,而且目前 netfilter iptables 发展已经不会有该问题。若是还有问题的话,可以考虑如下配置:

iptables -t nat -A POSTROUTING -d 192.168.1.1 -p tcp --dport 80 -s 192.168.1.0/24 -j SNAT --to 192.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 的配置方式有:

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

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

另外一种使用方式:

iptables -A POSTROUTING -t nat -s 192.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 会比较方便使用

(责任编辑:IT)
------分隔线----------------------------