これが私がすることです。
サーバー(パブリックインターネットは222.x.x.xです):
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
iptunnel add gre1 mode gre local 222.x.x.x remote 115.x.x.x ttl 255
ip add add 192.168.168.1/30 dev gre1
ip link set gre1 up
iptables -t nat -A POSTROUTING -s 192.168.168.0/30 -j SNAT --to-source 222.x.x.x
iptables -t nat -A PREROUTING -d 222.x.x.x -j DNAT --to-destination 192.168.168.2
クライアント(パブリックインターネットは115.x.x.xです):
iptunnel add gre1 mode gre local 115.x.x.x remote 222.x.x.x ttl 255
ip add add 192.168.168.2/30 dev gre1
ip link set gre1 up
echo '100 tunnel' >> /etc/iproute2/rt_tables
ip rule add from 192.168.168.0/30 table tunnel
ip route add default via 192.168.168.1 table tunnel
ここまでは、すべて順調に進んでいるようです。しかし、最初の質問は、GREトンネルをデフォルトルートとして使用する方法ですか?クライアントコンピューターは、引き続きデフォルトとして115.x.x.xインターフェイスを使用しています。
2番目の質問、ICMPトラフィックのみを強制的にトンネルを通過させ、他のすべてをデフォルトのインターフェイスに移動させる方法は?私はクライアントコンピューターでこれをやってみます:
ip rule add fwmark 200 table tunnel
iptables -t mangle -A OUTPUT -p udp -j MARK --set-mark 200
しかし、これを行った後、私のpingプログラムはタイムアウトします(上記の2つのコマンドを実行せず、代わりにping -I gre1 ip
を使用すると、機能します)。後で、トンネルを介したUDPポート53のみなど、他のことも実行したいと思います。
3番目の質問、クライアントコンピューターで、1つのmysqlプログラムにgre1インターフェイス192.168.168.2でリッスンするように強制します。クライアントコンピューターには、もう1つのパブリックインターフェイス(IP 114.x.x.x)があります... iptablesとrouteを使用してトラフィックを適切に転送し、mysqlがこの114.x.x.xパブリックインターフェイスからの要求にも応答するようにする方法は?
質問1
チェックアウト デフォルトルートとしてgreトンネルを使用 。
質問2トンネルを通過するすべてのicmp
iptables -t nat -A POSTROUTING -o gre1 -p icmp -j SNAT --to-source 192.168.168.2
質問3
クライアントマシンで、DNATを使用して、外部ポートからサーバーポートへのポート転送を実行します。
方法2-ポートリフレクション/ポートミラーリング
iptables -t nat -A PREROUTING -p tcp -m tcp -m multiport -d 114.x.x.x --dports 3306 -j DNAT --to-destination 192.168.168.1
iptables -t nat -A POSTROUTING -o gre1 -p tcp -m tcp -m multiport -d 192.168.168.1 --dports 3306 -j SNAT --to-source 192.168.168.2