虽然 iptables 教程、文档看了好多,但是平时用的很少,遇到需求的时候总是各种 google 或者查看现有机器上面的配置。于是决定将常用的配置在下面写下来,以后会不定期更新的。
1. 端口映射:本地 80 --> 本地 8080
适用场景: tomcat 降权运行,不监听80端口
(当然,如果机器上面运行这 nginx 或者 apache 之类的 http 服务器,用它们来做反向代理也是不错的选择。)
1 2 3 4 |
iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -t nat -I OUTPUT -p tcp -s 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080 # 第二行用于本地访问 127.0.0.1 时候的端口转发 |
2. 端口映射:本地 222 --> NAT后面的 22
适用场景:本机作为NAT出口,广域网A 到 局域网B的端口映射
环境: 本机(网关):192.168.1.1, 目标机器: 192.168.1.2
1 2 3 4 5 6 |
iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 222 -j DNAT --to 192.168.1.2:22 # 先建立 DNAT 规则,这里将 eth0 接口上面222端口的数据包,全部转发到 192.168.1.2:22上面 # 数据包来源: -i [收到数据包的网卡] -d [收到数据包的ip地址] 这两种参数都可以接受 iptables -I FORWARD -p tcp -d 192.168.1.2 --dport 22 -j ACCEPT # 可选,FORWARD 链添加转发条目,接受发往192.168.1.2 22端口的数据包 |
一般还会配置一个和 DNAT 对应的 反过来的 SNAT 规则,我们这里因为目标网段就是MASQUERADE的段,所以基本等效于一个SNAT规则了。
(SNAT 或 MASQUERADE 默认不改变源端口号
另外,第二条添加转发的条目,我使用的是 -I 参数,也就是插入在 FORWARD 链其他条目前面。
因为某日发现,libvirtd,也就是 KVM 虚拟机的 NAT 网络默认阻止了所有连接内部网络的包(当然,状态为 RELATED, ESTABLISHED的允许通过,可以通过 iptables -t filter -L 查看)
3. 端口映射:本地 80 --> 其他机器 8080
适用场景:本机作为对外暴露的唯一机器,但是并不作为网关
环境: 本机:1.1.1.1, 目标机器: 2.2.2.2
1 2 |
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 2.2.2.2:8080 iptables -t nat -A POSTROUTING -p tcp --dport 8080 -j MASQUERADE |
或者
1 2 |
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 2.2.2.2:8080 iptables -t nat -A POSTROUTING -p tcp --dport 8080 -j SNAT --to-source 1.1.1.1 |
4. NAT 地址伪装
适用场景:提供 NAT 数据包转发服务
环境: eth0 连接外网,eth1连接内网
1 2 3 4 5 6 7 8 |
iptable -t nat -I POSTROUTING -o eth0 -j MASQUERADE # 使用地址伪装,可自动配置源地址,比手动配置 SNAT 更方便 iptables -I FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT # 外网连入内网的包,只允许通过特定状态的包 iptables -I FORWARD -i eth1 -o eth0 -j ACCEPT # 内网发往外网的数据,全部允许 |
5. iptables 多端口匹配(multiport)
非连续端口:
1 |
iptables -t filter -I FORWARD -p tcp -d 192.168.3.3 -m multiport --dports 22,80,443 -j ACCEPT |
连续端口范围:
1 |
iptables -t filter -I FORWARD -p tcp -d 192.168.3.3 -m multiport --dports 1:65535 -j ACCEPT |
6. iptables 限速(hashlimit)
80 端口出站速率限制为 256KB/s (对每个客户端 IP 进行限速)
1 |
iptables -I OUTPUT -m hashlimit -p tcp --sport 80 --hashlimit-above 256kb/s --hashlimit-mode dstip --hashlimit-name out -j DROP |
附:SS 透明代理规则(tcp redirect)
适用场景:流量劫持,常见比如 Sha(delete me)dowsocks 透明代理
环境:ss-redir 监听本地1081端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#!/bin/sh #!/bin/sh set -e # The Config server_addr="" server_port="" password="" local_addr="0.0.0.0" local_port="1081" cipher="aes-256-cfb" # pgrep works better here, but it may not exists in some router system set +e; killall ss-redir; set -e nohup ss-redir -s $server_addr -p $server_port -b $local_addr -l $local_port -k $password -m $cipher& ## IPSET modprobe xt_set set +e ipset create cnip hash:net ipset flush cnip ## Skip the China IP wget https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt -O - |while read line || [ -n "$line" ] do ip=$line if [ -z "$ip" ];then continue fi ipset add cnip $ip done ## Create New Chain rules set +e; iptables -t nat -N SHADOWSOCKS; set -e iptables -t nat -F SHADOWSOCKS ## Skip the SS server IP ipset add cnip $server_addr/32 #iptables -t nat -A SHADOWSOCKS -p tcp -d $server_addr/32 -j RETURN ## Skip LAN IP ipset add cnip 0.0.0.0/8 ipset add cnip 10.0.0.0/8 ipset add cnip 127.0.0.0/8 ipset add cnip 169.254.0.0/16 ipset add cnip 172.16.0.0/12 ipset add cnip 192.168.0.0/16 ipset add cnip 224.0.0.0/4 ipset add cnip 240.0.0.0/4 iptables -t nat -A SHADOWSOCKS -m set --match-set cnip dst -p tcp -j RETURN # Do the Redirect work iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1081 # Add it to the PREROUTING Rule For NAT Traffic (for router... iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -j SHADOWSOCKS # Or add it to the OUTPUT Rule For Local Traffic (for pc... #iptables -t nat -A OUTPUT -p tcp -m multiport --dports 80,443 -j SHADOWSOCKS |