linux的netfilter模块不仅可以拦截数据包,还可以转发数据包。iptables 是一个配置netfilter的工具。
原理
整个原理可见下图。数据进入后,只有两条路可走,如果目的地址是本机,就由本机处理,不是则可以转发。
PREROUTING,FORWARD,POSTROUNT,INPUT,OUTPUT 是netfilter提供的钩子,在这些钩子上,可以定义规则,对数据包进行处理。处理的种类包括:过滤(filter),转发(nat),数据包修改(mangle,raw)。netfilter把这些种分别放在四张表中:filter,nat,mangle,raw。在这些表中放入了各种规则。iptables就是对这些内容进行配置。
命令格式
#iptables 目的 操作 规则
目的是由两个组成:钩子和表 ,
指定表是由 -t 指定 ,-t 后可跟 nat,filter,mangle,raw
表则直接跟在 操作 后面。可先INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
操作则包括 增(-A)删(-D)改(-R)查(-L)插入(-L)清除(-F)默认结果(-P)自定义分组(-N)
规则则由两部分组成:检测规则与结果
检查规则包括 源地址(-s),目标地址(-d) ,进入的网卡(-i),出去的网卡(-o),协议 (-p),端口(--dport)
结果则是对数据包的操作:-j ACCEPT | REJECT | DROP |SNAT |DNAT |MASQUERADE
考虑到检查与结果的复杂性,netfilter 还有许多插件 ,插件可以对检查规则和操作进行扩展定义。
插件由 -m 指定,关于各种扩展,可查看手册
man 5 iptables-extensions
举例:
iptables -t nat -I POSTROUTING -s 192.168.135.0/24 -j SNAT --to 192.168.137.77 #就是说 在 POSTROUTING的勾子上,进行nat操作,源地址是192.168.135.0/24 的,就修改源地址成 192.168.137.77
启用
yum install -y iptables-services systemctl enable iptables.service #如果有firewalld ,关闭 systemctl stop firewalld systemctl disable firewalld
查看规则
iptables -vnL
保存规则
默认设置下,iptables 进行改动后,并不会主动保存,下次开机会丢失,所以要手工保存。
/usr/libexec/iptables/iptables.init save
如果的想自动保存,则要在关机脚本里进行触发保存,用systemd 管理下,修改/etc/sysconfig/iptables-config
IPTABLES_SAVE_ON_STOP="yes"
基本配置
#屏蔽所有请求 iptable -A INPUT -j REJECT #允许127.0.0.1可访问,因为netfilter默认是对物理网口起效,所以要对本机回环加规则 iptables -I INPUT -d lo -j ACCEPT #允许本机可ping iptables -I INPUT -p icmp -j ACCEPT #允许本机对外访问任何地址与端口,由于本机主动向外请求时,目的IP与端口都不可预测, #所以,不能按目的信息过滤。但本机主动发起请求的包,有个特征是状态是RELADTED,ESTABLISHED iptables -I INPUT -m state --state RELAED,ESTABLISHED -j ACCEPT #开放SSH iptables -I INPUT -p tcp --dport 22 -j ACCEPT
FTP
#FTP的登录端口是21 iptables -I INPUT -t tcp -dport 21 -j ACCEPT #如果客户端采用主动模式 passive on ,需要FTP服务器主动从20端口向客户端指定的端口连接, #所以需要保证下面一条存在 iptables -I INPUT -m state --state RELAED,ESTABLISHED -j ACCEPT #如果客户端采用被动模式,FTP服务器需要开放随机的端口给客户端,由于端口是随机的,所以不能 #指定单一的端口。有两种办法 # 1. 指定的端口范围,比如50000-60000之间,需要FTP的配置文件中指定,同时在iptables中开放 # 这些端口 # ftp配置文件/etc/vsftpd/vsftpd.conf中加入 # pasv_min_port=50000 # pasv_max_port=60000 iptables -I INPUT -tcp --dport 50000:60000 -j ACCEPT # 2. 更简单的办法是用 iptables的模块,nf_conntrack_ftp #在/etc/sysconfig/iptables-config 中加入配置: #IPTABLES_MODULES="nf_conntrack_ftp"
NAT
若让内网中的电脑能够与外网通讯,其中一种技术是NAT。
#两台机器,A机器网址是内网eth0: 192.168.135.20/24 , #另一台B机器有两块网卡,分别是内网eth1: 192.168.135.10/24, eth0:外网 192.168.137.77/24 在A机器上配置/etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet IPADDR=192.168.135.20 NETMASK=255.255.255.0 GATEWAY=192.168.135.10 DNS1=192.168.137.1
NAT是一种数据转发,所以B机器需要打开转发开关
sysctl -w net.ipv4.ip_forward=1
内网机器需要访问外网资源,需要做SNAT 或者 MASQUERADE。推荐使用MASQUERADE方式,这样可避免外网网卡的地址变化
#在B机器上SNAT iptables -t nat -I POSTROUTING -s 192.168.135.0/24 -j SNAT --to 192.168.137.77
#在B机器上MASQUERADE iptables -t nat -A POSTROUTING -s 192.168.135.20 -o eth0 -j MASQUERADE
外网需要访问内网上的资源,比如A机器的80端口,要做DNAT
iptables -t nat -I PREROUTING -d 192.168.137.77 -p tcp --dport=8080 -j DNAT --to 192.168.135.20:80