iptables命令
iptables是用户态的命令行工具。
用户通过iptables来操作netfilter内核数据包处理模块。
链
规则串到一个链条上后形成了链。
PREROUTING链:DNAT;
INPUT链:处理目的地址为本机的报文;
FORWARD链:处理转发到其他机器或者network namespace的报文;
OUTPUT链:处理原地址为本机并向外发送的数据包;
POSTROUTING链:SNAT
表
filter表:过滤
nat表:NAT网络地址转换
mangle表:修改数据包内容
raw表:关闭nat表上启用的连接追踪机制
处理动作和规则顺序
ACCEPT |
放行,跳往下一个链。 |
REJECT |
拒绝,通知对方(ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset),直接中断。 |
DROP |
丢弃,直接中断。 |
REDIRECT |
重定向到另一个端口(PNAT),继续执行其他规则。 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 |
MASQUERADE |
把源地址转换成宿主机出口网卡IP,跳往下一个链。 |
SNAT |
更改源地址,跳往下一个链。 |
DNAT |
更改目的地址,跳往下一个链。 |
RETURN |
结束当前链,返回主规则链。 |
MARK |
将包设置标志,继续执行其他规则。 iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2 |
LOG |
封包相关信息记录在/var/log/messages中,继续执行其他规则。 iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets" |
MIRROR |
把来源IP和目的IP交换,送回包,直接中断。 |
QUEUE |
直接中断,把包放入队列,交给其他程序处理。 |
具体操作
# 查看filter表中INPUT链的规则并显示行号
iptables -t filter -nvL INPUT --line
# 清空filter表中的INPUT链
iptables -t filter -F INPUT
# 给filter表INPUT链头部插入规则
# 192.168.0.101的虚拟机增加iptables规则
iptables -t filter -I INPUT -s 192.168.0.102 -j DROP
192.168.0.102的虚拟机无法ping通192.168.0.101
# 给filter表INPUT链尾部追加规则
iptables -t filter -A INPUT -s 192.168.0.102 -j ACCEPT
# 删除filter表INPUT链第一条规则
iptables -t filter -D INPUT 1
# 修改filter表INPUT链第一条规则从DROP改成REJECT
iptables -t filter -R INPUT 1 -s 192.168.0.102 -j REJECT
192.168.0.102的虚拟机无法ping通192.168.0.101。
# 保存规则
iptables-save > /etc/sysconfig/iptables
# 重载规则
iptables-restore < /etc/sysconfig/iptables
参考资料
https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptables