iptables 学习
systemctl status firewalld #默认启动的防火墙
systemctl status iptables #unit iptables.service could not be found 没发现服务
systemctl stop firewalld #关firewalld
systemctl disable firewalld #开机不启动
rpm -qa | grep iptables #查看IPTABLES是否安装 发现是安装的
mkdir /media/cdrom #挂安装光盘,
mount /dev/cdrom /media/cdrom #mount 设备
ll /media/cdrom/Package/ | grep iptables #查找安装包
发现有三个 iptables iptables-devel iptables-service
yum --disablerepo=\* --enablerpo=c7-media install iptables-service vim man net-tools -y #安装相关软件 从光盘
systemctl start iptables #启动
主要有5个CHAIN 2个表
nat
POSTROUTING #内网访问外网
PREROUTING #外网访问内网
filter
INPUT
OUTPUT
FORWARD #如果不够还要想可以自己 -N 加 但是要跟这5个CHAIN相关联
iptables -t nat -L -n
iptables -t filter -L -n
内核默认没有开启NAT功能 如果要开户需要修改内核配置文件
systemctl -a | grep -i forward
net.ipv4.ip_forward=0 得到的结果 把这个结果放在 vim /etc/systemctl.conf 文件的最后一行 systemctl -p
iptables -t nat -L POSTROUTING 查看POSTROUTING
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens33 -j --to 192.168.241.103 转换地址出去
iptables -t filter -L -n -v 查看filter表 详细信息 还可 以看流量
iptables -t nat -A PREROUTING -d 192.168.241.103 -p tcp --dport 3389 -i ens33 -j DNAT --to 192.158.2.200 从外面访问里面
指令
-A --append 追加
-I --insert
-D --delete 要加编号
-R --replace
-F --flush 清空
-N --new
-X --删除自定义空链
-P --policy
选项 参数
来源
-s --source 地址 子网 网段
192.168.1.1 192.68.2.32/27 192.168.2.0/24
-i 进口 例如 ens33
目标
-d --destnation 地址 子网 网段
-o 出口
协议
-P tcp --dport --sport
udp --dport --sport
icmp --icmp-type echo-request
echo-reply
-j SNAT DNAT MASQUERADE ACCEPT REJECT DROP REDIRECT MARK
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP 进来的流量全关了
iptables -t filter -A INPUT -p --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p icmp --icmp-type echo-request -j DROP
iptables -t filter -A OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j MASQUERADE 做地址转换出去 根据动态IP
iptables -t filter FORWARD -s 192.168.1.0/24 -p udp --dport 53 -j DROP dns 做不了了 请求不了外面的53UDP端口
iptables -t filter FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -j DROP web访问不了
rpm -ql iptables #找到模块的位置 .so 结尾的 其中 带IP6的不用管 因为现在还是V4
MASQUERADE 地址伪装模块
/usr/lib64/xtables/libxt_mac.so mac 模块 对MAC进行控制 因为如果是IP的话 一改IP 策略就不成效的
iptables -m mac --help 某个模块的使用帮助
--mac-source xx:xx:xx:xx:xx:xx
/usr/lib64/xtables/libxt_iprange.so iprange模块 可以对一个IP范围控制
-m iprange --src-range 192.168.2.8-192.168.2.13
/usr/lib64/xtables/libxt_string.so string模块 目的域名 带有某个字符的 控制
iptables -t filter -R FORWARD 1 -s 192.168.2.0/24 -o ens33 -m string --string baidu --algo kmp -j DROP 禁止访问百度
/usr/lib64/xtables/libxt_time.so 时间控制
iptables -t filter -R FORWARD 1 -s 192.168.1.0/24 -m time --timestart 00:00 --timestop 10:00 --weekdays 1,2,3,4,5 -o ens33 -j DROP#因为是时区不一所以减8
/usr/lib64/xtables/libxt_state.so 根据状态过滤,如果在FORWARD里面都是DROP 当流量过的时候是有两个请求,要有去有回,所以要写两条 比如ping
iptables -t filter -A FORWARD -s 192.168.1.0/24 -p icmp --icmp-type echo-request -0 ens33 -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.1.0/24 -p icmp --icmp-type echo-reply -i ens33 -j ACCEPT
如果是HTTP WEB请求也是这样
iptables -t filter -A FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -o ens33 -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.1.0/24 -p tcp --sprot 80 -i ens33 -j ACCEPT
udp 53端口 域名解析
iptables -t filter -A FORWARD -s 192.168.1.0/24 -p ucp --dport 53 -o ens33 -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.1.0/24 -p ucp --sport 53 -o ens33 -j ACCEPT
问题来了,都这样我有点累,于是可以这样 用 state 模块 只要是我发出去的,那回来的时候统一都不拦截
iptables -t filter -A FORWARD -m --state ESTABLISHED -j ACCEPT 这样一条加上他们去的那一条 就够了
像上面的一条解决了 一个端口 的问题 但是如果是FTP 那就有一定的问题,就是FTP连接端口是连接的,数据端口是数据的, 那不是要加两条 而县城FTP是随机的返回端口
iptables -t filter -R FORWARD -m --state --status ESTABLISHED,RELATED -j ACCEPT 这样把上面的一条改了,就是相关联的端口一同打开放行
其实FTP 在LINUX 还有一个注意的地方就是 LINUX 还要加一个模块FTP才可以成功运行
modprobe ip_nat_ftp #这样就可以了
/usr/lib64/xtables/libxt_connlimit.so 连接数限制
iptables -t filter -A FORWARD -p tcp --dport 23 --syn -m ! connlimit --connlimit-above 1 -o ens33 -j DROP
/usr/lib64/xtables/libxt_multiport.so 多端口控制 可以有一个范围