iptables笔记
Packet Flow Chart
Netfilter Flow Chart
Firewall Rules
1 2
| apt install iptables-persistent
|
NAT as port forwarding
1 2 3 4 5 6 7 8 9 10 11
| # 数据包进入PREROUTING Chain,DNAT修改来源数据包的目的地址/端口为映射的$DEST_IP:$PORT iptables -t nat -A PREROUTING -p tcp --dst $WAN_IP --dport 80 -j DNAT --to-destination $DEST_IP:$PORT
# 此时Packet的目的地址不是本机地址,而是$DEST_IP,进入filter表的FORWARD Chain进行规则审核,要允许其通过(若filter表已是默认允许的,可以忽略本条) iptables -A FORWARD -p tcp --dst $DEST_IP --dport $PORT -j ACCEPT
# 进入POSTROUTING Chain,SNAT修改数据包中的来源地址为本网关;若目的机的默认网关就是本机,可以忽略本步(因为如果是目的机的默认网关,不管发往哪里的包都是发回来本网关;不然的话会发去了另外一个网关,无法成为相同一个NAT会话,无法通信)。默认网关的方式不用这句时目标机可以看到来源的真实地址。 iptables -t nat -A POSTROUTING -p tcp --dst $DEST_IP --dport 80 -j SNAT --to-source $LAN_IP
# 在网关本机和内网其他机器访问WAN_IP这个端口映射,数据包产生在OUTPUT Chain,需要做和PREROUTING相同的操作才能访问到(若不需要,可忽略本步) iptables -t nat -A POSTROUTING --dst $WAN_IP -p tcp --dport 80 -j DNAT --to-destination $DEST_IP:$PORT
|
NAT as gateway
Enable IP Forwarding
1 2
| sed -i 's/.*net\.ipv4\.ip_forward.*/net.ipv4.ip_forward = 1/' /etc/sysctl.conf sysctl -p
|
MASQUERADE, pppoe等动态IP环境使用环境
1
| iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -j MASQUERADE
|
or
SNAT, 静态外网IP, 或出口网卡绑定了多个IP时候使用
1
| iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -j SNAT --to-source <IP>
|
自动调整经pppoe-wan接口发出的TCP数据MSS, PPP链路情况
1
| iptables -t mangle -I POSTROUTING -o pppoe-wan -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
|
NAT as proxy (双向NAT,举例推特API服务器hosts转发)
1 2 3 4 5 6
| iptables -t nat -A PREROUTING -d [YOUR SERVER IP] -p tcp -m tcp --dport 443 -j DNAT --to-destination 199.59.148.20:443 iptables -t nat -A POSTROUTING -d 199.59.148.20 -p tcp -m tcp --dport 443 -j SNAT --to-source [YOUR SERVER IP]
iptables -A FORWARD -d 199.59.148.20 -p tcp -m tcp --dport 443 -j ACCEPT iptables -A FORWARD -s 199.59.148.20 -p tcp -m tcp --sport 443 -m state --state RELATED,ESTABLISHED -j ACCEPT
|
Iptables Firewall 后 FTP 服务 List 命令超时
1 2
| modprobe ip_conntrack_ftp echo "ip_conntrack_ftp" >>/etc/modules
|
Filter DNS from GFW
1 2
| iptables -A INPUT --source 8.8.8.8,8.8.4.4 -p udp --source-port 53 -m dscp ! --dscp 0x00 -j DROP iptables -A INPUT --source 8.8.8.8,8.8.4.4 -p udp --source-port 53 -m ttl --ttl-gt 48 -j DROP
|
Quick fix for deprecated state module [since Dec 2012]
1
| sed -i "s/-m state --state/-m conntrack --ctstate/g" /etc/iptables/iptables.rules
|