一、iptables基础概念
- 链(chain):系统包含五条链,PREROUTING、INPUT、OUTPUT、POSTROUTING、FORWARD。
可以自定义链
- 表(table):系统包含5张表,raw、mangle、nat、filter、security。
不能自定义表
。
~~~~~~~raw表
: iptables是有状态的,即iptables对数据包有连接追踪(connection tracking)机制,而raw是用来去除这种追踪机制的
~~~~~~~mangle表
:用于修改数据包头的IP信息
~~~~~~~nat表
:用于源、目的地址转换
~~~~~~~filter表
: 用于控制到达某条链上的数据包是继续放行、直接丢弃(drop)或拒绝(reject)
~~~~~~~security表
:不是很懂?? - 规则(rule):具体的包处理规则,包括acl规则、nat规则等。常见处理动作包括:
~~~~~~~~DROP
:直接将数据包丢弃,不再进行后续的处理。应用场景是不让某个数据源意识到你的系统的存在,可以用来模拟宕机;
~~~~~~~~REJECT
:给客户端返回一个connection refused或destination unreachable报文。应用场景是不让某个数据源访问你的系统,善意地告诉他:我这里没有你要的服务内容;
~~~~~~~~QUEUE
:将数据包放入用户空间的队列,供用户空间的程序处理;
~~~~~~~~RETURN
:跳出当前链,该链里后续的规则不再执行;
~~~~~~~~ACCEPT
:同意数据包通过,当前基础链都直接通过,比如基础链FORWARD通过;
~~~~~~~~JUMP
:跳转到其他用户自定义的链继续执行。
~~~~~~~~DNAT
: 做目的地址转换,该链里的后续规则不再执行,直接跳往下一个链,例如当前在PREROUTING链中,直接跳往FORWARD
~~~~~~~~SNAT
: 源地址转换,完成转换后,直接跳往下一个链
~~~~~~~~MARK
: 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则
~~~~~~~~LOG
: 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其它规则
~~~~~~~~MASQUERADE
: 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用
二、网络包经过iptables的处理路径
~~~~~~
包从网卡进来之后先通过PREROUTING链,再经过路由表判断如果是发送给本机的包则继续通过INPUT链;如果是需要转发的包则经过FORWARD链。
~~~~~~
每条链由不同的表组成,具体每条链上的表如上图所示。每条链上的表处理顺序
为:raw、mangle、nat、filter、security。
~~~~~~
自定义链:表中的规则可以通过JUMP动作跳到自定义链。
三、iptables命令使用
查看iptables表:
iptables -t 表名 -L 链名
[root@master-node ~]# iptables -t nat -L PREROUTING
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- anywhere anywhere /* kubernetes service portals */
DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL
~~~~~ target表示动作, KUBE-SERVICES表示jump到KUBE-SERVICES自定义链
- 如果缺省 -t 表名,默认为filter表
[root@master-node ~]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
KUBE-NODEPORTS all -- anywhere anywhere /* kubernetes health check service ports */
KUBE-EXTERNAL-SERVICES all -- anywhere anywhere ctstate NEW /* kubernetes externally-visible service portals */
KUBE-FIREWALL all -- anywhere anywhere
- 如果缺省 链名,默认显示所有链
[root@master-node ~]# iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ANTREA-PREROUTING all -- anywhere anywhere /* Antrea: jump to Antrea prerouting rules */
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ANTREA-OUTPUT all -- anywhere anywhere /* Antrea: jump to Antrea output rules */
Chain ANTREA-OUTPUT (1 references)
target prot opt source destination
CT udp -- anywhere anywhere /* Antrea: do not track outgoing encapsulation packets */ udp dpt:6081 ADDRTYPE match src-type LOCAL NOTRACK
Chain ANTREA-PREROUTING (1 references)
target prot opt source destination
CT udp -- anywhere anywhere /* Antrea: do not track incoming encapsulation packets */ udp dpt:6081 ADDRTYPE match dst-type LOCAL NOTRACK
- 可指定自定义链名
[root@worker-node1 ~]# iptables -L KUBE-SERVICES
Chain KUBE-SERVICES (2 references)
target prot opt source destination
REJECT tcp -- anywhere bogon /* default/banana-service has no endpoints */ tcp dpt:rrac reject-with icmp-port-unreachable
- -n将端口号和IP地址以数字形式显示
[root@worker-node1 ~]# iptables -L KUBE-SERVICES -n
Chain KUBE-SERVICES (2 references)
target prot opt source destination
REJECT tcp -- 0.0.0.0/0 10.103.19.32 /* default/banana-service has no endpoints */ tcp dpt:5678 reject-with icmp-port-unreachable
- -v显示规则命中的包数目及大小
[root@worker-node1 ~]# iptables -t nat -L KUBE-FW-L6225SIXICQL5TGT -v
Chain KUBE-FW-L6225SIXICQL5TGT (1 references)
pkts bytes target prot opt in out source destination
7 420 KUBE-MARK-MASQ all -- any any anywhere anywhere /* default/foo-service loadbalancer IP */
7 420 KUBE-SVC-L6225SIXICQL5TGT all -- any any anywhere anywhere /* default/foo-service loadbalancer IP */
0 0 KUBE-MARK-DROP all -- any any anywhere anywhere /* default/foo-service loadbalancer IP */
- –line-number显示规则序号
[root@worker-node1 ~]# iptables -t nat -L KUBE-FW-L6225SIXICQL5TGT --line-number
Chain KUBE-FW-L6225SIXICQL5TGT (1 references)
num target prot opt source destination
1 KUBE-MARK-MASQ all -- anywhere anywhere /* default/foo-service loadbalancer IP */
2 KUBE-SVC-L6225SIXICQL5TGT all -- anywhere anywhere /* default/foo-service loadbalancer IP */
3 KUBE-MARK-DROP all -- anywhere anywhere /* default/foo-service loadbalancer IP */
清空规则记录的包数目
iptables -Z
[root@worker-node1 ~]# iptables -t nat -Z
[root@worker-node1 ~]# iptables -t nat -L KUBE-FW-L6225SIXICQL5TGT -v
Chain KUBE-FW-L6225SIXICQL5TGT (1 references)
pkts bytes target prot opt in out source destination
0 0 KUBE-MARK-MASQ all -- any any anywhere anywhere /* default/foo-service loadbalancer IP */
0 0 KUBE-SVC-L6225SIXICQL5TGT all -- any any anywhere anywhere /* default/foo-service loadbalancer IP */
0 0 KUBE-MARK-DROP all -- any any anywhere anywhere /* default/foo-service loadbalancer IP */
四、iptables日志
centos7配置rsyslog
- 编辑/etc/rsyslog.conf
添加一行:
kern.warning /var/log/iptable.log
- 创建存放iptables日志的文件:
touch /var/log/iptable.log
- 重启rsyslog
systemctl restart rsyslog
- 添加iptables日志规则
与添加iptable规则语法一致
iptables -t nat -I KUBE-FW-L6225SIXICQL5TGT 2 -s 192.168.20.2 -j LOG --log-prefix pretest
在KUBE-FW-L6225SIXICQL5TGT链
的nat表
中第2条
规则前插入
此条规则
包需要匹配源IP=192.168.20.2
规则动作为打日志
,打出的日志添加前缀pretest
例子如下:
[root@worker-node1 ~]# iptables -t nat -L KUBE-FW-L6225SIXICQL5TGT -n --line-number
Chain KUBE-FW-L6225SIXICQL5TGT (1 references)
num target prot opt source destination
1 KUBE-MARK-MASQ all -- 0.0.0.0/0 0.0.0.0/0 /* default/foo-service loadbalancer IP */
2 KUBE-SVC-L6225SIXICQL5TGT all -- 0.0.0.0/0 0.0.0.0/0 /* default/foo-service loadbalancer IP */
3 KUBE-MARK-DROP all -- 0.0.0.0/0 0.0.0.0/0 /* default/foo-service loadbalancer IP */
[root@worker-node1 ~]# iptables -t nat -I KUBE-FW-L6225SIXICQL5TGT 2 -s 192.168.20.2 -j LOG --log-prefix pretest
[root@worker-node1 ~]# iptables -t nat -L KUBE-FW-L6225SIXICQL5TGT -n --line-number
Chain KUBE-FW-L6225SIXICQL5TGT (1 references)
num target prot opt source destination
1 KUBE-MARK-MASQ all -- 0.0.0.0/0 0.0.0.0/0 /* default/foo-service loadbalancer IP */
2 LOG all -- 192.168.20.2 0.0.0.0/0 LOG flags 0 level 4 prefix "pretest"
3 KUBE-SVC-L6225SIXICQL5TGT all -- 0.0.0.0/0 0.0.0.0/0 /* default/foo-service loadbalancer IP */
4 KUBE-MARK-DROP all -- 0.0.0.0/0 0.0.0.0/0 /* default/foo-service loadbalancer IP */
- 查看日志
当有符合要求的包经过时,可在日志文件中通过过滤前缀查看:
cat /var/log/iptable.log | grep pretest