- 一台linux 服务器如果要实现路由器转发的功能,那么他就必须要有iptables 和 路由表的配合使用
- 如果是过滤某些数据包(比如要丢弃这些包)使用的iptables 的filter表
iptables -t filter -A OUTPUT -p udp -d 114.114.114.114 -j DROP
# 以上的-t filter 默认可以不写,因为iptables 的默认表就是filter
- linux 内核会记录路由转发的相关记录,去:192.168.1.1:1234 ---> www.baidu.com:80 ;回:www.baidu.com:80 --->192.168.1.1:1234 可以查看如下
cat /proc/net/nf_conntrack
ipv4 2 tcp 6 88 TIME_WAIT src=101.200.28.186 dst=172.16.28.103 sport=22249 dport=80 src=172.16.28.103 dst=101.200.28.186 sport=80 dport=22249 [ASSURED] mark=0 zone=0 use=2
ipv4 2 tcp 6 85 TIME_WAIT src=140.205.132.24 dst=172.16.28.103 sport=49678 dport=80 src=172.16.28.103 dst=140.205.132.24 sport=80 dport=49678 [ASSURED] mark=0 zone=0 use=2
ipv4 2 tcp 6 119 TIME_WAIT src=115.124.31.95 dst=172.16.28.103 sport=59688 dport=80 src=172.16.28.103 dst=115.124.31.95 sport=80 dport=59688 [ASSURED] mark=0 zone=0 use=2
ipv4 2 tcp 6 61 TIME_WAIT src=106.11.144.138 dst=172.16.28.103 sport=22522 dport=80 src=172.16.28.103 dst=106.11.144.138 sport=80 dport=22522 [ASSURED] mark=0 zone=0 use=2
# 理解SNAT DNAT
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1(外网有效ip)
# 描述:凡是192.168.10.0/24 段的ip过来 我把原地址都转换成172.16.100.1
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2
# 描述:凡是目的地址是192.168.10.18 端口为80 的包,我把目标地址都转换成172.16.100.2
# 外部用户:218.85.233.242 (src)
# 我的公网服务器 218.85.2.2 (dst),内网ip:192.168.1.1;公网默认网关为218.85.2.1
# TCP (src-->dst:80)
# 内部服务器:192.168.1.2,192.168.1.3
# 路由器发包到公网前会做一次地址转换(SNAT,原地址映射)
# 实例
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.1.1
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -j DNAT --to 192.168.1.2:80
# 目标地址改写:DNAT (包出去的时候会帮你改写地址,回来的时候也会帮你改写地址)
# 原始请求 dst addr:192.168.1.2:55 转发给192.168.1.1:53
# -A append 的意思
# OUTPUT hook内核的一个钩子 (经过这个链的时候我开始做一些规则)
# 规则开始:
# -p tcp 首先你必须是tcp连接
# -d (destination的意思)192.168.1.2 你请求的目标地址必须是这个
# --dport 55 你请求的端口必须是这个
# -j DNAT --to-destination 192.168.1.1:53(我的行为)
iptables -t nat -A OUTPUT -p tcp -d 192.168.1.2 --dport 55 -j DNAT --to-destination 192.168.1.1:53
# 以上做完数据包就需要经过路由表了
route -n # 可以查看linux 的路由表
iptables -t nat -nvL # 查看iptables 的nat 表
root@my-pc:~# route -n
内核 IP 路由表
目标 网关 子网掩码 标志 跃点 引用 使用 接口
0.0.0.0 192.168.31.1 0.0.0.0 UG 100 0 0 enp0s31f6
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 virbr0
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s31f6
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
# 删除掉刚才添加的规则
iptables -t nat -D OUTPUT 1