iptables的白名单和黑名单:
iptables -t filter -I INPUT -s 192.168.2.20 -p tcp --dport 80 -j DROP
之前内网的机器可以访问到80端口,现在添加了这条规则,那么就192.168.2.10这个用户就不能访问了。
案例:白名单:
iptables -F
iptables -P INPUT DROP
# 然后直接再开通22端口
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
# 然后再在物理机上开通80端口
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
案例:黑名单:
ipables -P INPUT ACCEPT
iptables -F
注意两者的顺序。
这就相当于没有限制了。
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
# 这个规则是所有人都访问不了
iptables -t filter -A INPUT -s 192.168.2.20/24 -p tcp --dport 80 -j DROP
# 限制某个网段的人不能访问
黑名单在生产环境中,是不建议这么做的。
iptables的表和链的查看:
iptables -t filter -nL
iptables -t nat -nL
iptables -t mangle -nL
iptables -t raw -nL
iptables -t security -nL
再复习下各个表的作用:
filter: 过滤
nat:网络地址转换
mangle:封装标记
raw:数据跟踪
security:强制访问控制规则
常见操作命令:
-L | 查看,v详细,n不反解,--line-number 80/tcp |
-A | 追加,放置在最后一条 |
-I | 插入,默认插入成第一条,可以加编号 |
-D | 删除 |
-F | 清空flush |
-P | 设置链的默认策略(policy ACCEPT或 policy DROP) |
删除规则有个例子:
-D 无法删除规则的情况下,如何将REJECT all的规则删除呢?
这个直接修改防火墙的规则文件/etc/sysconfig/iptables,将其中的一个规则进行注释即可。
匹配条件:
-s 192.168.2.0/24 | 源地址 |
-d 192.168.2.1 | 目标地址,在nat表中使用比较多 |
-p TCP|UDP|ICMP | 协议 |
-i lo | input从lo接口进入的数据包,本地的回环口 |
-o eth0 | output从eth0出去的数据包 |
-p TCP --dport 80 | 目标端口是80,必须和-p TCP|UDP连用 |
-p UDP --dport 53 | 目标端口是53/UDP |
处理动作:
filter: | -j ACCEPT | 允许 |
-j DROP | 丢弃 | |
-j REJECT | 拒绝 | |
-j LOG | 写日志 | |
nat | -j SNAT | 源地址转换 POSTROUTING |
-j DNAT | 目的地址转换 PREROUTING | |
mangle | -j MARK | 修改数据包、封装、例如打标记 |
放行本机端流入流出:
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
# 不放行本机的流入流出,访问本机的httpd服务,网页会出现Error establishing a database connection.
案例:通过lo访问本机数据:
iptables -I INPUT -d 127.0.0.1 -p tcp --dport 9000 -i lo -j ACCEPT
iptables -n -L
案例:
# 清空规则
iptables -F
# 添加规则
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT
# 保存规则
iptables-save > /etc/sysconfig/iptables
# 查看规则
less /etc/sysconfig/iptables
存在的问题:
1)本机无法访问本机:
例如:ping 127.0.0.1
解决方案:
iptables -I INPUT -i lo -j ACCEPT
能够ping是可以ping通的。允许通过本地回环网卡访问本机。
2)本机无法访问其他主机
例如:ssh remote_host
解决方案:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
分析:通过iptables -nL命令检查防火墙规则,Chain OUTPUT (policy ACCEPT) 里面没有规则,那说明包出去是没有问题的。但是从对方主机返回的数据包进不来。ESTABLISHED已建立的连接,RELATED:衍生状态。ESTABLISHED和RELAED两个正常是配合使用的。允许连接状态产生衍生态。
说明:
扩展模块state:
追踪本机上的请求和响应之间的数据报文的状态。状态分为五种:INVALID、ESTABLISHED/NEW/RELATED/UNTRACKED.
RELATED: 相关联的连接,当前连接是一个新请求,但是附属于某个已存在的连接。
要掌握下TCP连接状态这个网络知识要进行复习掌握。
3. FTP无法访问:
yum install -y vsftpd
systemctl start vsftpd
systemctl enable vsftpd
方法一:为vsftpd指定数据端口:
# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
vim /etc/vsftpd/vsftpd.conf
pasv_min_port=50000
pasv_max_port=60000
# iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
说明:这是ftp的被动模式。
这个方法不好,一下子打开10000个端口,这个方法不建议做。
方法二:使用连接追踪模块:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
modprobe nf_conntrack_ftp # 加载连接追踪模块(临时)
vim /etc/sysconfig/iptables-config # 开机自动加载
IPTABLES_MODULES="nf_conntrack_ftp"
nf_conntrack_ftp: 针对数据端口连接的时候,将三次握手第一次的状态由NEW识别成RELATED。
建议大家采用这种方法。
涉及到ftp客户端的命令,根目录是在/var/ftp/pub中,然后在其中创建文件。