Iptables – 应用实例 – 修改出口数据包的默认IP

服务器有多IP,如果服务器发起请求,外网看到的来源IP总是服务器的第一个(或默认)IP。

有些工具,我们希望它出去的数据包的源IP不是默认IP,期望是指定IP。 这里涉及到了修改数据包的源IP,需要依靠Iptables来完成。

这里的问题是,某工具发起的数据包,怎么标记它? 最终要的是,某工具发起的数据包,把源地址修改为指定地址。Iptables中并没有办法识别某某工具发起的数据包,但是可以识别是某用户发起的数据包,所以可以指定某个用户运行某个工具,只要是这个用户发起的数据包,就标记一下,然后在路由后把源地址修改掉。

# 添加用户
# 接收6666端口进来的数据(这个步骤不是必须的)
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 6666 -j ACCEPT
# 用户6666发出的数据,修改数据包,添加6666标记
iptables -t mangle -A OUTPUT -m owner --uid-owner 6666 -j MARK --set-mark 6666
# 对于标记了6666的数据,源地址修改为x.x.x.x
iptables -t nat -A POSTROUTING -m mark --mark 6666 -j SNAT --to-source x.x.x.x

看起来,后面两天语句可以写成一条:(把用户6666的数据源地址修改为x.x.x.x)

iptables -t nat -A POSTROUTING -m owner --uid-owner 6666 -j SNAT --to-source x.x.x.x