151 lines
		
	
	
	
		
			4.4 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			151 lines
		
	
	
	
		
			4.4 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								Classes
							 | 
						||
| 
								 | 
							
								-------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"Class" is a complete routing table in common sense.
							 | 
						||
| 
								 | 
							
									I.e. it is tree of nodes (destination prefix, tos, metric)
							 | 
						||
| 
								 | 
							
									with attached information: gateway, device etc.
							 | 
						||
| 
								 | 
							
									This tree is looked up as specified in RFC1812 5.2.4.3
							 | 
						||
| 
								 | 
							
									1. Basic match
							 | 
						||
| 
								 | 
							
									2. Longest match
							 | 
						||
| 
								 | 
							
									3. Weak TOS.
							 | 
						||
| 
								 | 
							
									4. Metric. (should not be in kernel space, but they are)
							 | 
						||
| 
								 | 
							
									5. Additional pruning rules. (not in kernel space).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									We have two special type of nodes:
							 | 
						||
| 
								 | 
							
									REJECT - abort route lookup and return an error value.
							 | 
						||
| 
								 | 
							
									THROW  - abort route lookup in this class.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Currently the number of classes is limited to 255
							 | 
						||
| 
								 | 
							
									(0 is reserved for "not specified class")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Three classes are builtin:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									RT_CLASS_LOCAL=255 - local interface addresses,
							 | 
						||
| 
								 | 
							
									broadcasts, nat addresses.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									RT_CLASS_MAIN=254  - all normal routes are put there
							 | 
						||
| 
								 | 
							
									by default.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									RT_CLASS_DEFAULT=253 - if ip_fib_model==1, then
							 | 
						||
| 
								 | 
							
									normal default routes are put there, if ip_fib_model==2
							 | 
						||
| 
								 | 
							
									all gateway routes are put there.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Rules
							 | 
						||
| 
								 | 
							
								-----
							 | 
						||
| 
								 | 
							
									Rule is a record of (src prefix, src interface, tos, dst prefix)
							 | 
						||
| 
								 | 
							
									with attached information.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Rule types:
							 | 
						||
| 
								 | 
							
									RTP_ROUTE - lookup in attached class
							 | 
						||
| 
								 | 
							
									RTP_NAT   - lookup in attached class and if a match is found,
							 | 
						||
| 
								 | 
							
										    translate packet source address.
							 | 
						||
| 
								 | 
							
									RTP_MASQUERADE - lookup in attached class and if a match is found,
							 | 
						||
| 
								 | 
							
										    masquerade packet as sourced by us.
							 | 
						||
| 
								 | 
							
									RTP_DROP   - silently drop the packet.
							 | 
						||
| 
								 | 
							
									RTP_REJECT - drop the packet and send ICMP NET UNREACHABLE.
							 | 
						||
| 
								 | 
							
									RTP_PROHIBIT - drop the packet and send ICMP COMM. ADM. PROHIBITED.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Rule flags:
							 | 
						||
| 
								 | 
							
									RTRF_LOG - log route creations.
							 | 
						||
| 
								 | 
							
									RTRF_VALVE - One way route (used with masquerading)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Default setup:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								root@amber:/pub/ip-routing # iproute -r
							 | 
						||
| 
								 | 
							
								Kernel routing policy rules
							 | 
						||
| 
								 | 
							
								Pref Source             Destination        TOS Iface   Cl
							 | 
						||
| 
								 | 
							
								   0 default            default            00  *       255
							 | 
						||
| 
								 | 
							
								 254 default            default            00  *       254
							 | 
						||
| 
								 | 
							
								 255 default            default            00  *       253
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Lookup algorithm
							 | 
						||
| 
								 | 
							
								----------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									We scan rules list, and if a rule is matched, apply it.
							 | 
						||
| 
								 | 
							
									If a route is found, return it.
							 | 
						||
| 
								 | 
							
									If it is not found or a THROW node was matched, continue
							 | 
						||
| 
								 | 
							
									to scan rules.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Applications
							 | 
						||
| 
								 | 
							
								------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.	Just ignore classes. All the routes are put into MAIN class
							 | 
						||
| 
								 | 
							
									(and/or into DEFAULT class).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									HOWTO:  iproute add PREFIX [ tos TOS ] [ gw GW ] [ dev DEV ]
							 | 
						||
| 
								 | 
							
										[ metric METRIC ] [ reject ] ... (look at iproute utility)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										or use route utility from current net-tools.
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
								2.	Opposite case. Just forget all that you know about routing
							 | 
						||
| 
								 | 
							
									tables. Every rule is supplied with its own gateway, device
							 | 
						||
| 
								 | 
							
									info. record. This approach is not appropriate for automated
							 | 
						||
| 
								 | 
							
									route maintenance, but it is ideal for manual configuration.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									HOWTO:  iproute addrule [ from PREFIX ] [ to PREFIX ] [ tos TOS ]
							 | 
						||
| 
								 | 
							
										[ dev INPUTDEV] [ pref PREFERENCE ] route [ gw GATEWAY ]
							 | 
						||
| 
								 | 
							
										[ dev OUTDEV ] .....
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Warning: As of now the size of the routing table in this
							 | 
						||
| 
								 | 
							
									approach is limited to 256. If someone likes this model, I'll
							 | 
						||
| 
								 | 
							
									relax this limitation.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								3.	OSPF classes (see RFC1583, RFC1812 E.3.3)
							 | 
						||
| 
								 | 
							
									Very clean, stable and robust algorithm for OSPF routing
							 | 
						||
| 
								 | 
							
									domains. Unfortunately, it is not widely used in the Internet.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Proposed setup:
							 | 
						||
| 
								 | 
							
									255 local addresses
							 | 
						||
| 
								 | 
							
									254 interface routes
							 | 
						||
| 
								 | 
							
									253 ASE routes with external metric
							 | 
						||
| 
								 | 
							
									252 ASE routes with internal metric
							 | 
						||
| 
								 | 
							
									251 inter-area routes
							 | 
						||
| 
								 | 
							
									250 intra-area routes for 1st area
							 | 
						||
| 
								 | 
							
									249 intra-area routes for 2nd area
							 | 
						||
| 
								 | 
							
									etc.
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									Rules:
							 | 
						||
| 
								 | 
							
									iproute addrule class 253
							 | 
						||
| 
								 | 
							
									iproute addrule class 252
							 | 
						||
| 
								 | 
							
									iproute addrule class 251
							 | 
						||
| 
								 | 
							
									iproute addrule to a-prefix-for-1st-area class 250
							 | 
						||
| 
								 | 
							
									iproute addrule to another-prefix-for-1st-area class 250
							 | 
						||
| 
								 | 
							
									...
							 | 
						||
| 
								 | 
							
									iproute addrule to a-prefix-for-2nd-area class 249
							 | 
						||
| 
								 | 
							
									...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Area classes must be terminated with reject record.
							 | 
						||
| 
								 | 
							
									iproute add default reject class 250
							 | 
						||
| 
								 | 
							
									iproute add default reject class 249
							 | 
						||
| 
								 | 
							
									...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								4.	The Variant Router Requirements Algorithm (RFC1812 E.3.2)
							 | 
						||
| 
								 | 
							
									Create 16 classes for different TOS values.
							 | 
						||
| 
								 | 
							
									It is a funny, but pretty useless algorithm.
							 | 
						||
| 
								 | 
							
									I listed it just to show the power of new routing code.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								5.	All the variety of combinations......
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								GATED
							 | 
						||
| 
								 | 
							
								-----
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Gated does not understand classes, but it will work
							 | 
						||
| 
								 | 
							
									happily in MAIN+DEFAULT. All policy routes can be set
							 | 
						||
| 
								 | 
							
									and maintained manually.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								IMPORTANT NOTE
							 | 
						||
| 
								 | 
							
								--------------
							 | 
						||
| 
								 | 
							
									route.c has a compilation time switch CONFIG_IP_LOCAL_RT_POLICY.
							 | 
						||
| 
								 | 
							
									If it is set, locally originated packets are routed
							 | 
						||
| 
								 | 
							
									using all the policy list. This is not very convenient and
							 | 
						||
| 
								 | 
							
									pretty ambiguous when used with NAT and masquerading.
							 | 
						||
| 
								 | 
							
									I set it to FALSE by default.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Alexey Kuznetov
							 | 
						||
| 
								 | 
							
								kuznet@ms2.inr.ac.ru
							 |