一、四表五链理论
四表,filter表(
包过滤
)、nat表(网络地址转换
)、mangle表(包重构,修改
) raw表(数据跟踪处理)
五链(chains)是数据包传播的路径,
1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(所有的数据包进来的时侯都先由这个链处理)
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)
每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
二、常用设置
1、放行ssh端口:
1 iptables -A INPUT -p tcp –dport 22 -j ACCEPT 2 iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT
注:/etc/rc.d/init.d/iptables save,否则直接执行service iptables restart命令后, 刚才添加的将丢失.
2、解决iptables导致的脑裂问题
1 iptables -A INPUT -i lo -j ACCEPT 允许来自于lo接口的数据包 2 iptables -A OUTPUT -o lo -j ACCEPT 允许向lo接口发送数据包 3 iptables -A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信 4 iptables -A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协)通信
lo 是 loopback 的缩写,也就是环回地址网卡,linux主机向自身发送数据包时,实际上的数据包是通过虚拟的lo接口来发送接受的,而不会通过你的物理网卡 eth0/eth1。
3、脚本
# vim iptables.sh #!/bin/bash #清空 filter 表和 nat 表 iptables -F iptables -t nat -F #关掉 firewalld systemctl stop firewalld &>/dev/null systemctl disable firewalld &>/dev/null #以下两行允许某些调用 localhost 的应用访问 iptables -A INPUT -i lo -j ACCEPT #规则1 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #规则2 #以下一行允许从其他地方 ping iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT #规则3 #以下一行允许从其他主机、网络设备发送 MTU 调整的报文 #在一些情况下,例如通过 IPSec VPN 隧道时,主机的 MTU 需要动态减小 iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT #规则4 #以下两行分别允许所有来源访问 TCP 80,443 端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #规则5 iptables -A INPUT -p tcp --dport 443 -j ACCEPT #规则6 #以下一行允许所有来源访问 UDP 80,443 端口 iptables -A INPUT -p udp -m multiport --dports 80,443 -j ACCEPT #规则7 #以下一行允许 192.168.1.63 来源的 IP 访问 TCP 22 端口(OpenSSH) iptables -A INPUT -p tcp -s 192.168.1.63 --dport 22 -j ACCEPT #规则8 #以下一行允许 192.168.1.3(发起SSH连接的系统对应网卡的IP) 来源的 IP 访问 TCP 22 端口(OpenSSH) #如果是在远程终端跑本脚本,最好开启以下一行以防被踢掉 #另一种更加简便的方式:iptables -I INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp -s 192.168.1.3 --dport 22 -j ACCEPT #规则9 #以下一行允许 192.168.1.26 来源的 IP 访问 UDP 161 端口(SNMP) iptables -A INPUT -p udp -s 192.168.1.26 --dport 161 -j ACCEPT #规则10 #配置 NAT #启用内核路由转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf sysctl -p &>/dev/null #配置源地址转换 SNAT #将 192.168.2.0/24 转换成 192.168.1.63 iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.1.63 #规则11 #配置目的地址转换 DNAT #将 192.168.1.63 的 80 端口请求转发到 192.168.2.2 的 80 端口 iptables -t nat -A PREROUTING -d 192.168.1.63 -p tcp --dport 80 -j DNAT --to 192.168.2.2:80 #规则12
我们期望10.0.10.62为用户访问目标,而不是web服务192.168.0.110,但62上是没有web服务的,所以有人访问62的web服务必须将其转换到110上
iptables -t nat -A PREROUTING -d 10.0.10.62 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.110
#以下一行禁止所有其他的进入流量 iptables -A INPUT -j DROP #规则13 #以下一行允许本机响应规则编号为 1-12 的数据包发出 iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT #规则14 #以下一行禁止本机主动发出外部连接 iptables -A OUTPUT -j DROP #规则15 #以下一行禁止本机转发数据包 iptables -A FORWARD -j DROP #规则16 #固化 iptables iptables-save > /etc/sysconfig/iptables