远程遥控IPTables进行端口复用
第一种:利用ICMP做遥控开关(缺点:目标在内网时,无法ping到)
创建端口复用链
iptables -t nat -N LETMEIN
创建端口复用规则,将流量转发至 22 端口
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
开启开关,如果接收到一个长为 1139 的 ICMP 包,则将来源 IP 添加到加为letmein的列表中
iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1139 -m recent --set --name letmein --rsource -j ACCEPT
关闭开关,如果接收到一个长为 1140 的 ICMP 包,则将来源 IP 从 letmein 列表中去掉
iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1140 -m recent --name letmein --remove -j ACCEPT
let’s do it,如果发现 SYN 包的来源 IP 处于 letmein 列表中,将跳转到 LETMEIN 链进行处理,有效时间为 3600 秒
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
效果图
[root@localhost ~]# iptables -nvxL -t nat
Chain PREROUTING (policy ACCEPT 446 packets, 32991 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 length 1139 recent: SET name: letmein side: source mask: 255.255.255.255
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 length 1140 recent: REMOVE name: letmein side: source mask: 255.255.255.255
0 0 LETMEIN tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 flags:0x17/0x02 recent: CHECK seconds: 3600 name: letmein side: source mask: 255.255.255.255
Chain INPUT (policy ACCEPT 95 packets, 7107 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 48 packets, 5255 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 48 packets, 5255 bytes)
pkts bytes target prot opt in out source destination
Chain LETMEIN (1 references)
pkts bytes target prot opt in out source destination
开启复用前,WEB 是可以访问的:

开启复用ping -c 1 -s 1111 192.168.33.78
向目标发送一个长度为 1111 的 ICMP 数据包(加上包头28,总长度实际为1139)
关闭复用ping -c 1 -s 1112 192.168.33.78向目标发送一个长度为 1112 的 ICMP 数据包(加上包头 28,总长度实际为 1140)
在这里我说一下ping时的数据包为IP包+ICMP包

每行32bit,4字节,前5行共20字节

大小:20+8=28字节
开启复用ping -c 1 -s 1111 192.168.242.139
向目标发送一个长度为 1111 的 ICMP 数据包(加上包头28,总长度实际为1139)
关闭复用ping -c 1 -s 1112 192.168.242.139向目标发送一个长度为 1112 的 ICMP 数据包(加上包头 28,总长度实际为 1140)
第二种:利用TCP数据包中的关键字做遥控开关(不怕目标在内网)
端口复用链
iptables -t nat -N LETMEIN
端口复用规则
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
开启开关
iptables -A INPUT -p tcp -m string --string 'zhimakaimen' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
关闭开关
iptables -A INPUT -p tcp -m string --string ‘threathunterleaving’ --algo bm -m recent --name letmein --remove -j ACCEPT
展示
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
开启复用,开启后本机到目标 80 端口的流量将转发至目标的 SSH,80 将无法再被本机访问:
echo threathuntercoming | socat - tcp:192.168.33.78:80
关闭复用,关闭后,80 恢复正常:
echo threathunterleaving | socat - tcp:192.168.33.78:80
让HTTPS、SSH 共享端口的——工具SSLH
安装SSLH
$ sudo apt-get install sslh
修改监听端口

修改/etc/default/sslh

重启服务
root@ubuntu-virtual-machine:/usr/local/nginx/conf# systemctl restart sslh
测试
root@ubuntu-virtual-machine:/usr/local/nginx/conf# ps -ef |grep sslh
sslh 4020 1 0 12:56 ? 00:00:00 /usr/sbin/sslh --foreground --user sslh --listen 0.0.0.0 443 --ssh 127.0.0.1 22 --tls 127.0.0.1 443 --pidfile /var/run/sslh/sslh.pid
sslh 4021 4020 0 12:56 ? 00:00:00 /usr/sbin/sslh --foreground --user sslh --listen 0.0.0.0 443 --ssh 127.0.0.1 22 --tls 127.0.0.1 443 --pidfile /var/run/sslh/sslh.pid
root 4023 2985 0 12:57 pts/0 00:00:00 grep --color=auto sslh
效果图

AWK经典实例:
筛选IPv4地址
三种方法:
[root@localhost ~]# ifconfig | awk '/inet / && !($2 ~/^127/){print $2}'
192.168.242.139
[root@localhost ~]# ifconfig | awk 'BEGIN{RS=""}!/lo/{print $6}'
192.168.242.139
[root@localhost ~]# ifconfig | awk -f ip.sh
192.168.242.139
[root@localhost ~]# cat ip.sh
BEGIN{RS="" ;FS="\n"}
!/lo/{$0=$2;FS=" ";$0=$0;print $2}
[root@localhost ~]#