本文主要阐述了如何通过在基于linux服务器上合理设置相关规则,对抗主动探测,降低被墙概率的操作。本文并不采用端口敲门方式来实现这一点,而是通过拒绝和丢弃相关报文的发出和进入,从而达到“装死”的目的。方法也很简单,只需要修改iptables相关配置文件和/etc/sysctl.conf即可。(若需直接采用相应的配置文件,请删除注释)
若使用了本文提供的方案,则可以达成如下目的: 1.对各种探测方式进行的探测均不回应(开放的端口除外,这就是为什么代理服务端软件需要使用防主动探测的方案,例如xray udp或者hysteria2) 2.不回应来自虚假ip地址报文的请求,降低噪音。其他方面的效果同1。
这是iptables的配置文件:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i tailscale0 -j ACCEPT
-A INPUT -i op+ -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 9001 -j ACCEPT # 需要开放的入站tcp端口写在这
-A INPUT -m state --state INVALID -j DROP
-A INPUT -p tcp -j DROP
-A INPUT -p udp --sport 53 -j ACCEPT # 为保证DNS解析正常,不要删除这条
-A INPUT -p udp --dport 9001 -j ACCEPT # 需要开放的入站udp端口写在这
-A INPUT -p udp -j DROP
-A INPUT -p icmp --icmp-type 8 -j DROP # 对于会被用于探测服务器是否存活的icmp报文,直接丢弃(相应丢弃的报文类别不影响正常连接网络)
-A INPUT -p icmp --icmp-type 11 -j DROP
-A INPUT -p icmp --icmp-type 13 -j DROP
-A INPUT -p icmp --icmp-type 30 -j DROP
-A INPUT -p icmp --icmp-type 42 -j DROP
-A INPUT -p icmp -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -p tcp --tcp-flags ALL RST,ACK -j DROP # 禁止发出 connection refused
-A OUTPUT -m state --state INVALID -j DROP
-A OUTPUT -p icmp --icmp-type 3 -j DROP # 对于会被用于探测服务器是否存活的icmp报文,直接丢弃(相应丢弃的报文类别不影响正常连接网络)
-A OUTPUT -p icmp --icmp-type 3/0 -j DROP
-A OUTPUT -p icmp --icmp-type 3/1 -j DROP
-A OUTPUT -p icmp --icmp-type 3/2 -j DROP
-A OUTPUT -p icmp --icmp-type 3/3 -j DROP
-A OUTPUT -p icmp --icmp-type 3/6 -j DROP
-A OUTPUT -p icmp --icmp-type 3/7 -j DROP
-A OUTPUT -p icmp --icmp-type 3/8 -j DROP
-A OUTPUT -p icmp --icmp-type 3/9 -j DROP
-A OUTPUT -p icmp --icmp-type 3/10 -j DROP
-A OUTPUT -p icmp --icmp-type 3/11 -j DROP
-A OUTPUT -p icmp --icmp-type 3/12 -j DROP
-A OUTPUT -p icmp --icmp-type 3/13 -j DROP
-A OUTPUT -p icmp --icmp-type 3/14 -j DROP
-A OUTPUT -p icmp --icmp-type 3/15 -j DROP
-A OUTPUT -p icmp --icmp-type 11 -j DROP
-A OUTPUT -p icmp --icmp-type 11/0 -j DROP
-A OUTPUT -p icmp --icmp-type 11/1 -j DROP
-A OUTPUT -p icmp --icmp-type 14 -j DROP
COMMIT
这是ip6tables的配置文件:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i tailscale0 -j ACCEPT
-A INPUT -i op+ -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 9001 -j ACCEPT # 需要开放的入站tcp端口写在这
-A INPUT -m state --state INVALID -j DROP
-A INPUT -p tcp -j DROP
-A INPUT -p udp --sport 53 -j ACCEPT # 为保证DNS解析正常,不要删除这条
-A INPUT -p udp --dport 9001 -j ACCEPT # 需要开放的入站udp端口写在这
-A INPUT -p udp -j DROP
-A INPUT -p icmpv6 --icmpv6-type 128 -j DROP # 对于会被用于探测服务器是否存活的icmpv6报文,直接丢弃(相应丢弃的报文类别不影响正常连接网络)
-A INPUT -p icmpv6 -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -p tcp --tcp-flags ALL RST,ACK -j DROP # 禁止发出 connection refused
-A OUTPUT -m state --state INVALID -j DROP
-A OUTPUT -p icmpv6 --icmpv6-type 1 -j DROP # 对于会被用于探测服务器是否存活的icmpv6报文,直接丢弃(相应丢弃的报文类别不影响正常连接网络)
-A OUTPUT -p icmpv6 --icmpv6-type 1/0 -j DROP
-A OUTPUT -p icmpv6 --icmpv6-type 1/3 -j DROP
-A OUTPUT -p icmpv6 --icmpv6-type 1/4 -j DROP
-A OUTPUT -p icmpv6 --icmpv6-type 3 -j DROP
-A OUTPUT -p icmpv6 --icmpv6-type 3/0 -j DROP
-A OUTPUT -p icmpv6 --icmpv6-type 3/1 -j DROP
-A OUTPUT -p icmpv6 --icmpv6-type 4/1 -j DROP
COMMIT
这是sysctl.conf所需要添加的相应条目:
# 拒绝处理ICMP路由重定向请求的报文
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# 开启反向路由有效性验证,若一个IP来源通过任意反向路径均不可达,则相关报文会被直接丢弃
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
# 开启源IP地址有效性验证,无效报文会被直接丢弃
net.ipv4.conf.all.src_valid_mark = 1
net.ipv4.conf.default.src_valid_mark = 1
# 拒绝处理ICMPv6路由重定向请求的报文
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0