私の LAN のゲートウェイとして機能する Linux システムで、送信元 IP アドレスに基づいてトラフィックをルーティングしたいと考えています。
ネットワーク カードが 2 枚あり、そのうちの 1 枚には 2 つの異なるデフォルト ゲートウェイがあります。
1 つのシステムにはデフォルト ゲートウェイを 1 つしか設定できないこと、またルートの選択は宛先アドレスに基づいて行われることはわかっています。
IP 192.168.3.5のPCがゲートウェイ172.16.62.254経由でアクセスでき、到達可能であることを確認したいと思います。eth0
の背後には、インターネットにアクセスできるVPNがあります。
ネットワークインターフェースの設定は次のとおりです。
DEVICE=eth0
TYPE=Ethernet
IPADDR=172.16.61.2
PREFIX=24
IPADDR2=172.16.61.3
PREFIX2=24
GATEWAY=172.16.61.1
DEVICE=eth0:1
TYPE=Ethernet
DEFROUTE=no
IPADDR=172.16.62.100
PREFIX=24
#GATEWAY=172.16.62.254
DEVICE=eth1
TYPE=Ethernet
IPADDR=192.168.3.1
NETMASK=255.255.255.0
ルーティングテーブルは次のとおりです。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
172.16.62.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.16.61.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 172.16.61.1 0.0.0.0 UG 0 0 0 eth0
2 つのゲートウェイの IP アドレスは次のとおりです。
172.16.61.1
172.16.62.254
IPアドレスを持つPC192.168.3.2GWに到達する必要があります172.16.61.1、
IPアドレスを持つPC192.168.3.5GW 1に到達する必要があります72.16.62.254
2 つのゲートウェイへのアクセスを許可するには、iptables を介して IP アドレスの変換を実行します。
iptables -t nat -A POSTROUTING -s 192.168.3.2 -j SNAT --to-source 172.16.61.3
およびその逆
iptables -t nat -A PREROUTING -d 172.16.61.3 -j DNAT --to-destination 192.168.3.2
ゲートウェイ172.16.62.254を経由してパケットをルーティングするアイデアは、iptables送信元 IP アドレスが 192.168.3.5 または 172.16.62.100 であるパケットをマークし、iproute2 を使用してルーティングするために、次の手順を実行します。
で/etc/iproute2/rt_tables行を追加しました
200 route254
パケットには次のマークを付けました:
iptables -t mangle -A OUTPUT -s 192.168.3.5 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -s 172.16.62.100 -j MARK --set-mark 0x1
ルーティングを次のように構成しました:
ip route add default via 172.16.62.254 dev eth0:1 table route254
ip route add 172.16.62.0/24 dev eth0:1 src 172.16.62.100 table route254
ip rule add from 172.16.62.100/32 table route254
ip rule add to 172.16.62.100/32 table route254
ip rule add prio 199 fwmark 0x1 lookup route254
私が得た結果は、アドレス 192.168.3.2 の PC への到達可能性は機能しており、PC は外部から到達可能ですが、アドレス 192.168.3.5 の PC には到達できないということです。
アドレス192.168.3.2のPCの場合のtcpdumpの出力は次のようになります。
18:38:31.317553 IP x.x.x.x.45053 > 172.16.61.3.ftp: S 3190836796:3190836796(0) win 5840 <mss 1380,sackOK,timestamp 2834368503 0,nop,wscale 7>
18:38:31.317832 IP x.x.x.x.45053 > 192.168.3.2.ftp: S 3190836796:3190836796(0) win 5840 <mss 1380,sackOK,timestamp 2834368503 0,nop,wscale 7>
18:38:31.317732 IP 192.168.3.2.ftp > x.x.x.x.45053: S 1998545683:1998545683(0) ack 3190836797 win 28960 <mss 1460,sackOK,timestamp 1123125 2834368503,nop,wscale 7>
18:38:31.317778 IP 172.16.61.3.ftp > x.x.x.x.45053: S 1998545683:1998545683(0) ack 3190836797 win 28960 <mss 1460,sackOK,timestamp 1123125 2834368503,nop,wscale 7>
18:38:31.368562 IP x.x.x.x.45053 > 172.16.61.3.ftp: . ack 1 win 46 <nop,nop,timestamp 2834368531 1123125>
18:38:31.368580 IP x.x.x.x.45053 > 192.168.3.2.ftp: . ack 1 win 46 <nop,nop,timestamp 2834368531 1123125>
18:38:33.257206 IP x.x.x.x.45053 > 172.16.61.3.ftp: P 1:3(2) ack 1 win 46 <nop,nop,timestamp 2834370444 1123125>
アドレス192.168.3.5のPCの場合のtcpdumpの出力は次のようになります。
12:49:04.047809 IP x.x.x.x.60804 > 172.16.62.100.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986198269 0,nop,wscale 7>
12:49:04.048069 IP x.x.x.x.60804 > 192.168.3.5.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986198269 0,nop,wscale 7>
12:49:04.047884 IP 192.168.3.5.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 922143 2986198269,nop,wscale 7>
12:49:04.047909 IP 172.16.62.100.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 922143 2986198269,nop,wscale 7>
12:49:05.448336 IP 192.168.3.5.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 923544 2986198269,nop,wscale 7>
12:49:05.448351 IP 172.16.62.100.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 923544 2986198269,nop,wscale 7>
12:49:07.048100 IP x.x.x.x.60804 > 172.16.62.100.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986201269 0,nop,wscale 7>
12:49:07.048128 IP x.x.x.x.60804 > 192.168.3.5.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986201269 0,nop,wscale 7>
パッケージが実際にマークされているかどうかを確認するために、以下を使用しました:
iptables -A INPUT -m mark ! --mark 0 -m limit --limit 8/min --limit-burst 12 -j LOG --log-prefix "IPTables-Marks: "
しかし、ログファイルにはエントリがありません
IP アドレス 192.168.3.5 の PC がゲートウェイ 172.16.62.254 経由でアクセスし、到達できるようにするにはどうすればよいでしょうか?