Iptables基础框架
Iptables基于内核netfilter安全框架运行,主要有过滤数据包和NAT地址转换功能。
Iptables基本表链结构
filter |
INPUT |
FORWARD |
OUTPUT |
|
|
nat |
|
|
OUTPUT |
PREROUTING |
POSTROUTING |
mangle |
INPUT |
FORWARD |
OUTPUT |
PREROUTING |
POSTROUTING |
raw |
|
|
OUTPUT |
PREROUTING |
|
Iptables主要通过规则链的方式进行数据包的过滤和转发以及NAT功能,表是具有相同功能的规则链的集合,方便我们进行管理。
Iptables常用条件类型
条件 |
参数 |
范例 |
源IP地址 |
-s |
-s 172.16.1.1,172.16.1.2 -s 172.16.1.0/24 ! -s 172.16.1.0/24 |
目的IP地址 |
-d |
-d 172.16.1.1,172.16.1.2 -d 172.16.1.0/24 ! -d 172.16.1.0/24 |
源端口 |
-p tcp -m tcp --sport -p tcp -m multiport --sports |
-p tcp -m tcp --sport 22 -p tcp -m tcp --sport 22:25 -p tcp -m tcp --sport :22 -p tcp -m tcp --sport 80: -p tcp -m tcp ! --sport 22 -p tcp -m multiport --sports 22,25 |
目的端口 |
-p tcp -m tcp --dport -p tcp -m multiport --dports |
-p tcp -m tcp --dport 22 -p tcp -m tcp --dport 22:25 -p tcp -m tcp --dport :22 -p tcp -m tcp --dport 80: -p tcp -m tcp ! --dport 22 -p tcp -m multiport --dports 22,25 |
协议 |
-p |
-p tcp ! -p tcp (tcp udp icmp) |
网卡 |
-i 流入网卡 / -o流出网卡 |
-i eth0 ! -i eth0 / -o eth0 ! -o eth0 |
Iptables常用扩展模块
扩展模块 |
参数 |
范例 |
tcp |
-p tcp -m tcp --dport -p tcp -m tcp --sport -p tcp -m tcp --dport --tcp-flags -p tcp -m tcp --dport --syn |
-p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT -p tcp -m tcp --dport 22 --syn -j REJECT |
udp |
-p udp -m udp --dport -p udp -m udp --sport |
略 |
multiport |
-p tcp -m multiport --dports -p tcp -m multiport --sports |
略 |
icmp |
-p icmp -m icmp --icmp-type 8/0 -p icmp -m icmp --icmp-type 8 -p icmp -m icmp --icmp-type "echo-request" |
-p icmp -m icmp --icmp-type 8/0 -j REJECT 禁止别人ping自己 -p icmp -m icmp --icmp-type 8 -j REJECT -p icmp -m icmp --icmp-type "echo-request" -j REJECT |
state |
-m state --state |
-m state --state RELATED,ESTABLISHED -j ACCEPT |
Iptables常用动作
动作 |
参数 |
范例 |
ACCEPT |
-j ACCEPT |
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT |
DROP |
-j DROP |
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP |
REJECT |
-j REJECT <--reject-with> |
iptables -t filter -I INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-unreachable (提示为什么被拒绝) |
LOG |
-j LOG <--log-level> <--log-prefix> |
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22" |
SNAT |
-j SNAT --to-source |
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146 |
DNAT |
-j DNAT --to-destination |
iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.0.0.6:3389 |
MASQUERADE |
-o eth0 -j MASQUERADE |
iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE (动态SNAT) |
REDIRECT |
-j REDIRECT --to-ports |
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 |
开启内核转发功能
在配置NAT网关、路由器或网络防火墙的时候,需要开启内核转发功能。
#使用如下两种方法均可临时开启核心转发,立即生效,但是重启网络配置后会失效。 方法一:echo 1 > /proc/sys/net/ipv4/ip_forward 方法二:sysctl -w net.ipv4.ip_forward=1 #使用如下方法开启核心转发功能,重启网络服务后永久生效。 配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中将 net.ipv4.ip_forward设置为1
Iptables常用操作
查看规则 |
iptables -nvL iptables -t filter -nvL iptables -t filter -nvL INPUT iptables --line-number -nvL INPUT |
清空规则 |
iptables -F 清空filter表的规则 iptables -F INPUT |
增加规则 |
iptables -t filter -I INPUT -s 192.168.1.1 -j DROP // DROP表丢弃不响应 REJECT表拒绝并响应 iptables -t filter -I INPUT 2 -s 192.168.1.1 -j DROP iptables -t filter -A INPUT -s 192.168.1.1 -j DROP |
删除规则 |
iptables -t filter -D INPUT 3 删除INPUT链中第3条规则 iptables -t filter -D INPUT -s 192.168.1.1 -j ACCEPT |
修改规则 |
iptables -t filter -R INPUT 1 -s 192.168.1.1 -j REJECT 只能改动作,参数条件一个不能少,推荐先删除后添加的方式 |
修改默认规则 |
iptables -t filter -P FORWARD DROP |
保存规则 |
service iptables save /etc/init.d/iptables save cat /etc/sysconfig/iptables |
白名单机制 |
iptables -P INPUT ACCEPT 默认设为ACCEPT防止清空后管理员无法登录 iptables -I INPUT -p tcp --dport 22 -j ACCEPT iptables -I INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -j REJECT 在规则链最后加上拒绝,实现白名单机制 |
创建自定义链 |
iptables -t filter -N IN_WEB |
引用自定义链 |
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB |
重命名自定义链 |
iptables -E IN_WEB WEB |
删除自定义链 |
iptables -X WEB 满足两个条件:自定义链没有被引用 自定义链中没有任何规则 |
计数器清零 |
iptables -Z |
网络防火墙配置
网络防火墙=网关+Iptables过滤
#1.开启防火墙转发功能,实现网关 [[email protected] ~]# vim /etc/sysctl.conf # Controls IP packet forwarding net.ipv4.ip_forward = 1 [[email protected] ~]# sysctl -p // 应用参数 #2.分别添加路由记录,设置网关 [[email protected] ~]# route add -net 172.16.1.0/24 gw 10.0.0.88 [[email protected] ~]# route add -net 10.0.0.0/24 gw 172.16.1.88 #3.配置防火墙Iptables过滤规则 [[email protected] ~]# iptables -nvL FORWARD Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination [[email protected] ~]# iptables -A FORWARD -d 172.16.1.13 -j ACCEPT [[email protected] ~]# iptables -A FORWARD -s 172.16.1.13 -j ACCEPT #4.进行测试 [[email protected] ~]# ping 172.16.1.13 PING 172.16.1.13 (172.16.1.13) 56(84) bytes of data. 64 bytes from 172.16.1.13: icmp_seq=1 ttl=63 time=12.5 ms 64 bytes from 172.16.1.13: icmp_seq=2 ttl=63 time=1.03 ms [[email protected] ~]# ping 10.0.0.100 PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data. 64 bytes from 10.0.0.100: icmp_seq=1 ttl=63 time=0.391 ms 64 bytes from 10.0.0.100: icmp_seq=2 ttl=63 time=1.03 ms
SNAT网关配置
#严格上,配置网关=开启内核转发功能,配置方法同上 #添加SNAT功能 [[email protected] ~]# iptables -t nat -I POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 172.16.1.88 #测试 [[email protected] ~]# ping 172.16.1.13 PING 172.16.1.13 (172.16.1.13) 56(84) bytes of data. 64 bytes from 172.16.1.13: icmp_seq=1 ttl=63 time=0.796 ms 64 bytes from 172.16.1.13: icmp_seq=2 ttl=63 time=3.38 ms 64 bytes from 172.16.1.13: icmp_seq=3 ttl=63 time=1.34 ms [[email protected] ~]# tcpdump -i eth1 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 23:12:29.983216 IP 172.16.1.88 > 172.16.1.13: ICMP echo request, id 14715, seq 1, length 64 23:12:29.983239 IP 172.16.1.13 > 172.16.1.88: ICMP echo reply, id 14715, seq 1, length 64 23:12:30.998859 IP 172.16.1.88 > 172.16.1.13: ICMP echo request, id 14715, seq 2, length 64
DNAT网关配置
#网关配置同网络防火墙 #开启DNAT功能 [[email protected] ~]# iptables -t nat -I PREROUTING -d 10.0.0.88 -j DNAT --to-destination 172.16.1.13 #测试 [[email protected] ~]# ping 10.0.0.88 PING 10.0.0.88 (10.0.0.88) 56(84) bytes of data. 64 bytes from 10.0.0.88: icmp_seq=1 ttl=63 time=21.8 ms 64 bytes from 10.0.0.88: icmp_seq=2 ttl=63 time=2.03 ms 64 bytes from 10.0.0.88: icmp_seq=3 ttl=63 time=1.53 ms [[email protected] ~]# tcpdump -i eth1 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 23:31:30.079065 IP 10.0.0.100 > 172.16.1.13: ICMP echo request, id 20091, seq 1, length 64 23:31:30.079104 IP 172.16.1.13 > 10.0.0.100: ICMP echo reply, id 20091, seq 1, length 64 23:31:31.083794 IP 10.0.0.100 > 172.16.1.13: ICMP echo request, id 20091, seq 2, length 64 23:31:31.083853 IP 172.16.1.13 > 10.0.0.100: ICMP echo reply, id 20091, seq 2, lengt