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

Linux iptables firewall 設定常見 FAQ 整理

时间:2015-01-29 02:39来源:linux.it.net.cn 作者:IT
标题列表项目: 《一般本机的 firewall 配置问题》

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

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

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

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

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 时,可以转送到内部某主机?

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


一般本机的 firewall 配置问题

 

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

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

iptables-save

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

iptables -L
iptables -t nat -L

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

iptables -L -n
iptables -t nat -L -n

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

iptables -L -n -v
iptables -t nat -L -n -v



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

 

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

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

/etc/init.d/iptables stop

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

chkconfig iptables off

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

# With this variable you can determine if the SuSEfirewall when enabled
# should get started when network interfaces 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 程式由标准输入读入后进行启用。简单说所谓开启该服务,其实也就是:

iptables-restore < /etc/sysconfig/iptables

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

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 项目:

# Load additional iptables modules (nat helpers)
#Default: -none-
# Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'),
# which are loaded after the firewall rules are applied. Options for
# the helpers are stored in /etc/modprobe.conf.
IPTABLES_MODULES=""



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

 

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

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,也就是允许任何封包的传输不会被阻挡。

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 PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT

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



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

 

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



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

 

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

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

比方配置:

iptables -P INPUT ACCEPT
iptables -A INPUT -s 192.168.1.1 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j DROP

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

常见设定观念错误如下:

iptables -P INPUT ACCEPT
iptables -A INPUT -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j DROP

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

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

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

iptables -P INPUT ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j DROP
......

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

iptables -P INPUT DROP
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
......

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

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




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

 

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

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

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

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

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

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

所以設定 -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 -m state --state ESTABLISHED

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


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