当前位置: 首页 > Linux

iptables小技巧(qbit)

时间:2023-04-06 22:17:15 Linux

前言本文适用于iptables1.6.xiptables下载(版本列表/历史版本):iptables发布netfilter/iptables项目表、链、规则iptables有四个表filter用于过滤nat对于网络地址转换,mangle用于标记数据包,修改包数据的具体规则。原始表独立于Netfilter连接跟踪子系统。当未明确指定表时,iptables命令默认为过滤表。iptables3种数据包通过的链(chain)iptables数据包详细方向图iptablescommontargetACCEPT#允许数据包通过DROP#丢弃数据包REJECT#通过SNAT拒绝数据包#源地址转换MASQUERADE#地址欺骗,自动snatDNAT#目标地址转换REDIRECT#重定向LOG#记录包信息到syslog日志QUEUE#队列RETURN#返回iptables为什么防火墙不占用端口?或许更准确的说法是:为什么在Linux下做端口转发时iptables不占用端口?因为端口没有被占用,所以无法用netstat命令查看。OSI模型和TCP/IP模型iptables工作在OSI模型的2/3/4层。在做端口转发的时候,只需要对传输层的端口号进行校验和转换,不需要占用。以下节选自《计算机网络(第5版)》(谢希人)第175页。需要注意的是,从层级上看,NAPT的机制有些特殊。普通路由器转发IP数据报时,源IP地址和目的IP地址都不会改变。但是,NAT路由器在转发IP数据报时,必须改变其IP地址(转换源IP地址或目的IP地址)。其次,普通路由器在转发数据包时,工作在网络层。但是NAPT路由器也在传输层查看并翻译端口号,这应该是传输层的域。也正是因为如此,NAPT受到了一些人的诟病,认为NAPT的运行并没有严格遵循层级关系。实例只允许192.168.1.0/24网段的192.168.1.22访问本地6389端口sudoiptables-IINPUT-s192.168.1.0/24-jDROPsudoiptables-IINPUT-s192.168.1.22-pTCP--dport6389-jACCEPTiptablesforurlfiltering#iptables实际上不过滤url,只是过滤传输数据包的内容#并且http头包含目标url#关于-m参数,maniptables只有几个introductions,#详细信息需要在maniptables-extensions中进一步查询#打开#过滤掉包含qq.com的url#ACCEPT没有用,因为url只在http头的包中sudoiptables-AOUTPUT-mstring--string"qq.com"--algobm-jDROP#如果本机是squidserver,可以通过INPUT链过滤sudoiptables-AINPUT-mstring--string"qq.com"--algobm-jDROP#对nat转发的内容进行过滤sudoiptables-AFORWARD-mstring--string"qq.com"--algobm-jDROP#查看sudoiptables-nL--line-numbers#去掉(最后一个数字是加上--line-numbers参数序号后的num)sudoiptables-DOUTPUT2移除过滤规则示例#见sudoiptables-tfilter-nL--line-numbers#移除。最后一个数字是添加--line-numbers参数后num显示的序号sudoiptables-tfilter-DFORWARD1iptables限制同一IP的连接数sudoiptables-IINPUT-ptcp-jREJECT--reject-withtcp-reset-mconnlimit--connlimit-above20sudoiptables-IFORWARD-ptcp-jREJECT--reject-withtcp-reset-mconnlimit--connlimit-above10端口转发监听的7777端口本机,将数据转发到192.168.7.8的8888端口,实现TCP数据转发。Ubuntu18.04下可以使用以下步骤测试清除规则:sudoiptables-Fsudoiptables-Xsudoiptables-tnat-Fsudoiptables-tnat-Xsudoiptables-tmangle-Fsudoiptables-tmangle-Xsudoiptables-PINPUTACCEPTsudoiptables-PFORWARDACCEPTsudoiptables-POUTPUTACCEPT启用端口转发(/etc/sysctl.conf)#启用端口转发sudosysctlnet.ipv4.ip_forward=1#查看sudosysctl-a|grepip_forwardconfigureportforwarding#转发规则配置(可以添加详细限制规则)sudoiptables-tnat-APREROUTING-ptcp--dport7777-jDNAT--to-destination192.168.7.8:8888sudoiptables-tnat-APOSTROUTING-jMASQUERADE#查看sudoiptables-tnat-nLMASQUERADE可能会导致Ubuntu18.04下dns服务异常,参见HowtoallowDNSlookupwithiptablesonUbuntu18.04server,可以改为如下配置:#tap0为转发出口网卡代码#本例中tap0虚拟网卡iptables-tnat-APOSTROUTING-otap0-jMASQUERADE#OR(192.168.7.1为虚拟网卡地址)iptables-tnat-APOSTROUTING-oenp4s0-jSNAT--to-source192.168.7.1去除示例#见sudoiptables-tnat-nL--line-numbers#去除。最后一个数字是添加--line-numbers参数后num显示的序列号sudoiptables-tnat-DPOSTROUTING1portviewsudonetstat-anpt|grep7777可以看到iptables端口转发的连接用netstat是看不到的,因为NAPT不需要占用端口,7777端口还是可以被其他程序使用的。要检查,您可以使用netstat-nat或conntrack命令。sudoconntrack-L-ptcp--src-nat#ORsudoconntrack-L-nbackupandrestore以下步骤在Ubuntu18.04下可用,可用于使用计划任务执行备份iptables-save>/home/qbit/iptables_rules_bak/iptables.rules下面重点介绍自动恢复启动文件/etc/systemd/system/rc-local.service,在rc-local.service中添加如下内容[Unit]Description=/etc/rc.localCompatibilityConditionPathExists=/etc/rc.localAfter=network.target[Service]Type=forkingExecStart=/etc/rc.localstartTimeoutSec=0StandardOutput=ttyRemainAfterExit=yesSysVStartPriority=99[Install]WantedBy=multi-user.target创建文件:/etc/rc.local并添加以下内容#!/bin/bash/sbin/iptables-restoreipchains>;netfilter/iptables/ip6tables/arptables>nftables/nft本文来自qbitsnap