我在 OpenVZ 容器内使用 CentOS 6.4。我尝试配置 APF 9.7-2 以允许入站 SSH 和 HTTP 流量(仅)以及出站 HTTP 和 HTTPS 流量(其他出站流量是否有效则不太在意)。我的 conf.apf 文件设置为默认值,但有以下例外:
IFACE_IN="venet0"
IFACE_OUT="venet0"
SET_MONOKERN="1"
SYSCTL_CONNTRACK="131072"
IG_TCP_CPORTS="22,80"
LOG_DROP="1"
(请注意,我没有启用传出过滤;EGF 仍然等于 0。)
当我启动 APF 时,我发现所有出站连接都被阻止了。
[root@beta ~]# wget http://www.google.com
--2013-11-19 17:21:02-- http://www.google.com/
Resolving www.google.com... 173.194.115.20, 173.194.115.16, 173.194.115.19, ...
Connecting to www.google.com|173.194.115.20|:80...
这并没有完成。我可以看到流量被入站规则阻止:(我将我的服务器 IP 替换为 1.2.3.4)
[root@beta ~]# grep "173.194" /var/log/messages | tail
Nov 19 17:21:02 beta kernel: ** IN_TCP DROP ** IN=venet0 OUT= MAC= SRC=173.194.115.20 DST=1.2.3.4 LEN=48 TOS=0x08 PREC=0x00 TTL=57 ID=18487 PROTO=TCP SPT=80 DPT=57092 WINDOW=42900 RES=0x00 ACK SYN URGP=0
Nov 19 17:21:02 beta kernel: ** IN_TCP DROP ** IN=venet0 OUT= MAC= SRC=173.194.115.20 DST=1.2.3.4 LEN=48 TOS=0x08 PREC=0x00 TTL=57 ID=18488 PROTO=TCP SPT=80 DPT=57092 WINDOW=42900 RES=0x00 ACK SYN URGP=0
Nov 19 17:21:03 beta kernel: ** IN_TCP DROP ** IN=venet0 OUT= MAC= SRC=173.194.115.20 DST=1.2.3.4 LEN=48 TOS=0x08 PREC=0x00 TTL=57 ID=18489 PROTO=TCP SPT=80 DPT=57092 WINDOW=42900 RES=0x00 ACK SYN URGP=0
Nov 19 17:21:04 beta kernel: ** IN_TCP DROP ** IN=venet0 OUT= MAC= SRC=173.194.115.20 DST=1.2.3.4 LEN=48 TOS=0x08 PREC=0x00 TTL=57 ID=18490 PROTO=TCP SPT=80 DPT=57092 WINDOW=42900 RES=0x00 ACK SYN URGP=0
Nov 19 17:21:05 beta kernel: ** IN_TCP DROP ** IN=venet0 OUT= MAC= SRC=173.194.115.20 DST=1.2.3.4 LEN=48 TOS=0x08 PREC=0x00 TTL=57 ID=18491 PROTO=TCP SPT=80 DPT=57092 WINDOW=42900 RES=0x00 ACK SYN URGP=0
Nov 19 17:21:07 beta kernel: ** IN_TCP DROP ** IN=venet0 OUT= MAC= SRC=173.194.115.20 DST=1.2.3.4 LEN=48 TOS=0x08 PREC=0x00 TTL=57 ID=18492 PROTO=TCP SPT=80 DPT=57092 WINDOW=42900 RES=0x00 ACK SYN URGP=0
Nov 19 17:21:11 beta kernel: ** IN_TCP DROP ** IN=venet0 OUT= MAC= SRC=173.194.115.20 DST=1.2.3.4 LEN=48 TOS=0x08 PREC=0x00 TTL=57 ID=18493 PROTO=TCP SPT=80 DPT=57092 WINDOW=42900 RES=0x00 ACK SYN URGP=0
DPT 的值会随着每次请求而改变。
我已确认 APF 关闭时,出站 HTTP 和 HTTPS 可以正常工作。我需要做什么才能在 APF 开启时正常工作?
答案1
我找到了问题所在。硬件节点上的容器配置需要启用正确的 iptables 模块。我的服务器上容器的默认设置是:
IPTABLES="ipt_REJECT ipt_tos ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length"
我已经在容器的配置中覆盖了它(硬件上的 /etc/vz/conf/CONTAINERNUMBER.conf)
IPTABLES="iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_conntrack ipt_state ipt_helper iptable_nat ip_nat_ftp ip_nat_irc ipt_REDIRECT"
我不确定我到底需要哪一个,但是通过这种配置,入口和出口过滤器都可以按预期工作。
我曾经在网络上的其他地方看到过这个技巧,但是它似乎意味着你需要设置 IPTABLES 才能使 iptables 正常工作,而在我的例子中,iptables 即使在我没有设置它的情况下也能正常工作(尽管有点不正常)。